From bad5c9c3aeba6c56ba789add7287138f973d634b Mon Sep 17 00:00:00 2001 From: Jose Costa Teixeira Date: Thu, 10 Oct 2024 20:55:14 +0200 Subject: [PATCH] catch up --- .github/workflows/linux-docker-build.yml | 51 +- .gitignore | 5 +- 1-ClickServer/1-ReinstallR4.cmd | 4 - 1-ClickServer/2-RunServer.cmd | 3 - 1-ClickServer/filelist.txt | 224 -- 1-ClickServer/readme.md | 16 - 1-ClickServer/server/fhirR4.db | Bin 32768 -> 0 bytes 1-ClickServer/server/fhirRx_empty.db | Bin 32768 -> 0 bytes 1-ClickServer/server/fhirserver.ini | 95 - Dockerfile | 138 +- Dockerfile prev | 152 + FastMM4_AVX512.obj | Bin 0 -> 2468 bytes README.md | 1 - build/linux-fhirserver.sh | 13 +- build/linux-libraries.sh | 16 +- build/linux-toolchain.sh | 2 + build/linux.sh | 8 + build/windows-all.bat | 2 +- build/windows-fhirserver.bat | 87 +- build/windows-libraries.bat | 2 +- build/windows-release.bat | 128 +- build/windows-toolchain.bat | 4 +- build/windows-update.bat | 8 +- config/config.ini | 3 +- config/config.json | 19 + dependencies/FMM/FastMM4.pas | 2 +- dependencies/zflate/zflate.pas | 2 +- exec/pack/Messages.properties | 1950 ++++----- exec/pack/Messages_de.properties | 1744 ++++----- exec/pack/Messages_es.properties | 1229 +++--- exec/pack/Messages_ja.properties | 1910 +++++---- exec/pack/Messages_nl.properties | 1714 ++++---- exec/pack/Messages_pt-BR.properties | 1 + exec/pack/lang.dat | 2724 ++++++++++--- exec/pack/linux/get-openssl.sh | 30 + exec/pack/linux/install.sh | 73 + exec/pack/linux/start.sh | 61 + exec/pack/web.ini | 2 + grafana/config-grafana-observability.json | 1552 ++++++++ install/install-tk.iss | 8 +- install/install.iss | 11 +- ipsmanager/forms/frm_home.pas | 28 + ipsmanager/ipsmanager.lpi | 7 +- ipsmanager/ipsmanager.lpr | 4 +- ipsmanager/views/mvbase.pas | 28 + ipsmanager/views/mvdatasources.pas | 28 + library/cda/cda_base.pas | 7 +- library/cda/cda_documents.pas | 5 +- library/cda/cda_writer.pas | 8 +- library/dicom/dicom_dictionary.pas | 2 +- library/dicom/dicom_parser.pas | 2 +- library/fcomp/fcomp_graph.pas | 6 +- library/fdb/fdb_fts.pas | 33 +- library/fdb/fdb_logging.pas | 8 +- library/fdb/fdb_manager.pas | 42 +- library/fdb/fdb_sqlite3.pas | 20 +- library/fdb/fdb_sqlite3_wrapper.pas | 2 +- library/fdb/tests/fdb_tests.pas | 41 +- library/fhir.inc | 37 +- library/fhir/fhir_cdshooks.pas | 16 +- library/fhir/fhir_codegen.pas | 12 +- library/fhir/fhir_common.pas | 162 +- library/fhir/fhir_context.pas | 10 +- library/fhir/fhir_diff.pas | 8 +- library/fhir/fhir_factory.pas | 38 +- library/fhir/fhir_graphql.pas | 4 +- library/fhir/fhir_objects.pas | 15 +- library/fhir/fhir_pathengine.pas | 8 +- library/fhir/fhir_tx.pas | 960 +++++ library/fhir/fhir_utilities.pas | 18 + library/fhir/fhir_xhtml.pas | 4 +- library/fhir2/fhir2_common.pas | 182 +- library/fhir2/fhir2_context.pas | 16 +- library/fhir2/fhir2_factory.pas | 45 +- library/fhir2/fhir2_narrative.pas | 31 +- library/fhir2/fhir2_narrative2.pas | 10 +- library/fhir2/fhir2_operations.pas | 8 +- library/fhir2/fhir2_pathengine.pas | 8 +- library/fhir2/fhir2_pathnode.pas | 12 +- library/fhir2/fhir2_profiles.pas | 58 +- library/fhir2/fhir2_types.pas | 2 +- library/fhir2/fhir2_utilities.pas | 12 +- library/fhir2/fhir2_validator.pas | 4 +- .../fhir2/tests/fhir2_tests_pathengine.pas | 2 +- library/fhir3/fhir3_common.pas | 217 +- library/fhir3/fhir3_context.pas | 18 +- library/fhir3/fhir3_factory.pas | 45 +- library/fhir3/fhir3_liquid.pas | 38 +- library/fhir3/fhir3_maputils.pas | 48 +- library/fhir3/fhir3_narrative.pas | 31 +- library/fhir3/fhir3_narrative2.pas | 8 +- library/fhir3/fhir3_operations.pas | 21 +- library/fhir3/fhir3_pathengine.pas | 8 +- library/fhir3/fhir3_pathnode.pas | 14 +- library/fhir3/fhir3_profiles.pas | 58 +- library/fhir3/fhir3_types.pas | 2 +- library/fhir3/fhir3_utilities.pas | 43 +- library/fhir3/fhir3_validator.pas | 4 +- library/fhir3/tests/fhir3_tests_liquid.pas | 2 +- .../fhir3/tests/fhir3_tests_pathengine.pas | 2 +- library/fhir4/InstanceValidator.pas | 32 +- library/fhir4/fhir4_common.pas | 223 +- library/fhir4/fhir4_context.pas | 29 +- library/fhir4/fhir4_factory.pas | 48 +- library/fhir4/fhir4_graphdefinition.pas | 28 +- library/fhir4/fhir4_ips.pas | 40 +- library/fhir4/fhir4_liquid.pas | 66 +- library/fhir4/fhir4_maputils.pas | 52 +- library/fhir4/fhir4_narrative.pas | 31 +- library/fhir4/fhir4_narrative2.pas | 8 +- library/fhir4/fhir4_operations.pas | 19 +- library/fhir4/fhir4_pathengine.pas | 10 +- library/fhir4/fhir4_pathnode.pas | 14 +- library/fhir4/fhir4_profiles.pas | 57 +- library/fhir4/fhir4_types.pas | 2 +- library/fhir4/fhir4_utilities.pas | 59 +- library/fhir4/fhir4_validator.pas | 4 +- library/fhir4/tests/fhir4_tests_graphql.pas | 4 +- library/fhir4/tests/fhir4_tests_liquid.pas | 2 +- .../fhir4/tests/fhir4_tests_pathengine.pas | 4 +- library/fhir4b/fhir4b_common.pas | 229 +- library/fhir4b/fhir4b_context.pas | 25 +- library/fhir4b/fhir4b_factory.pas | 45 +- library/fhir4b/fhir4b_graphdefinition.pas | 28 +- library/fhir4b/fhir4b_liquid.pas | 66 +- library/fhir4b/fhir4b_maputils.pas | 52 +- library/fhir4b/fhir4b_narrative.pas | 31 +- library/fhir4b/fhir4b_narrative2.pas | 8 +- library/fhir4b/fhir4b_operations.pas | 22 +- library/fhir4b/fhir4b_pathengine.pas | 10 +- library/fhir4b/fhir4b_pathnode.pas | 20 +- library/fhir4b/fhir4b_profiles.pas | 61 +- library/fhir4b/fhir4b_types.pas | 2 +- library/fhir4b/fhir4b_utilities.pas | 62 +- library/fhir4b/fhir4b_validator.pas | 4 +- library/fhir4b/tests/fhir4b_tests_graphql.pas | 4 +- library/fhir4b/tests/fhir4b_tests_liquid.pas | 2 +- .../fhir4b/tests/fhir4b_tests_pathengine.pas | 2 +- library/fhir5/fhir5_common.pas | 227 +- library/fhir5/fhir5_context.pas | 32 +- library/fhir5/fhir5_factory.pas | 45 +- library/fhir5/fhir5_graphdefinition.pas | 28 +- library/fhir5/fhir5_liquid.pas | 66 +- library/fhir5/fhir5_maputils.pas | 54 +- library/fhir5/fhir5_narrative.pas | 31 +- library/fhir5/fhir5_narrative2.pas | 10 +- library/fhir5/fhir5_operations.pas | 19 +- library/fhir5/fhir5_pathengine.pas | 10 +- library/fhir5/fhir5_pathnode.pas | 20 +- library/fhir5/fhir5_profiles.pas | 56 +- library/fhir5/fhir5_types.pas | 2 +- library/fhir5/fhir5_utilities.pas | 61 +- library/fhir5/fhir5_validator.pas | 4 +- library/fhir5/tests/fhir5_tests_liquid.pas | 2 +- .../fhir5/tests/fhir5_tests_pathengine.pas | 2 +- library/fsl/fsl_base.pas | 252 +- library/fsl/fsl_collections.pas | 3 +- library/fsl/fsl_comparisons.pas | 4 +- library/fsl/fsl_cpu.pas | 171 + library/fsl/fsl_fpc.pas | 9 +- library/fsl/fsl_graphql.pas | 32 +- library/fsl/fsl_gzip.pas | 34 +- library/fsl/fsl_htmlgen.pas | 242 +- library/fsl/fsl_http.pas | 33 +- library/fsl/fsl_json.pas | 8 +- library/fsl/fsl_lang.pas | 106 +- library/fsl/fsl_logging.pas | 44 +- library/fsl/fsl_npm.pas | 15 +- library/fsl/fsl_rdf.pas | 36 +- library/fsl/fsl_scrypt.pas | 15 +- library/fsl/fsl_service.pas | 2 + library/fsl/fsl_stream.pas | 40 +- library/fsl/fsl_threads.pas | 162 +- library/fsl/fsl_turtle.pas | 41 +- library/fsl/fsl_unicode.pas | 12 +- library/fsl/fsl_utilities.pas | 1504 ++++--- library/fsl/fsl_xml.pas | 58 +- library/fsl/tests/fsl_testing.pas | 4 +- library/fsl/tests/fsl_tests.pas | 23 +- library/ftx/fhir_codesystem_service.pas | 511 ++- library/ftx/fhir_valuesets.pas | 2377 ++++++----- library/ftx/ftx_lang.pas | 78 +- library/ftx/ftx_loinc_importer.pas | 2609 +++++------- library/ftx/ftx_loinc_publisher.pas | 1103 ++---- library/ftx/ftx_loinc_services.pas | 3480 +++++------------ library/ftx/ftx_sct_analysis.pas | 3 +- library/ftx/ftx_sct_expressions.pas | 16 +- library/ftx/ftx_sct_publisher.pas | 238 +- library/ftx/ftx_sct_services.pas | 450 +-- library/ftx/ftx_service.pas | 303 +- library/ftx/ftx_ucum_expressions.pas | 4 +- library/ftx/ftx_ucum_services.pas | 28 +- library/ftx/tests/ftx_tests_sct.pas | 4 +- library/ftx/tests/ftx_tests_ucum.pas | 4 +- library/fui/fui_fake_console.lfm | 158 +- library/fui/fui_fake_console.pas | 131 +- library/fui/fui_fake_console_settings.lfm | 46 +- library/fui/fui_fake_console_settings.pas | 3 + library/fui/fui_lcl_cache.pas | 4 +- library/v2/v2_dictionary.pas | 10 +- library/v2/v2_message.pas | 44 +- library/version.inc | 6 +- library/web/fsl_crypto.pas | 2 +- library/web/fsl_npm_cache.pas | 69 +- npp/FHIR.Npp.Fetch.pas | 8 +- npp/FHIR.Npp.Plugin.pas | 4 +- npp/FHIR.Npp.Validator.pas | 24 +- npp/PathDialogForms.pas | 4 +- packages/fhir.lpk | 4 + packages/fhir.pas | 4 +- packages/fhir4.pas | 2 +- packages/fhir_fdb.pas | 2 +- packages/fhir_fsl.lpk | 4 + packages/fhir_fsl.pas | 4 +- server/FHIRServer.dpr | 12 +- server/admin/console_ep_edit.pas | 2 +- server/admin/console_managers.pas | 6 +- server/admin/console_tx_edit.pas | 2 +- server/admin/install_form.pas | 2 +- server/admin/install_log.pas | 4 +- server/analytics.pas | 31 +- server/auth_manager.pas | 14 +- server/cds_hooks_service.pas | 12 +- server/client_cache_manager.pas | 6 +- server/closuremanager.pas | 4 +- server/console_form.lfm | 508 +-- server/console_form.pas | 166 +- server/database.pas | 48 +- server/endpoint.pas | 13 +- server/endpoint_full.pas | 13 +- server/endpoint_icao.pas | 2 +- server/endpoint_loinc.pas | 10 +- server/endpoint_packages.pas | 231 +- server/endpoint_snomed.pas | 18 +- server/endpoint_storage.pas | 89 +- server/endpoint_txregistry.pas | 239 +- server/endpoint_txsvr.pas | 292 +- server/endpoint_xig.pas | 34 +- server/fhirconsole.lpi | 55 +- server/fhirconsole.pas | 9 +- server/fhirserver.dproj | 3060 +++++++-------- server/fhirserver.lpi | 194 +- server/fhirserver.lpr | 9 +- server/gui_controller.pas | 4 +- server/html_builder.pas | 2 +- server/indexing.pas | 4 +- server/kernel.pas | 232 +- server/kernel_thread.pas | 38 +- server/operations_r2.pas | 6 +- server/operations_r3.pas | 6 +- server/operations_r4.pas | 58 +- server/operations_r4b.pas | 6 +- server/operations_r5.pas | 6 +- server/package_spider.pas | 146 +- server/scim_server.pas | 8 +- server/search_base.pas | 29 +- server/server_constants.pas | 11 +- server/server_context.pas | 12 +- server/server_stats.pas | 12 +- server/server_testing.pas | 20 +- server/session.pas | 169 +- server/session_manager.pas | 6 +- server/storage.pas | 23 + server/subscriptions.pas | 16 +- server/tag_manager.pas | 4 +- server/telnet_server.pas | 117 +- server/test_registry.pas | 4 +- server/tests.pas | 2 +- server/tests/tests_cpt.pas | 71 +- server/twilio.pas | 2 +- server/tx/tx_acir.pas | 24 +- server/tx/tx_areacode.pas | 35 +- server/tx/tx_countrycode.pas | 26 +- server/tx/tx_cpt.pas | 32 +- server/tx/tx_hgvs.pas | 16 +- server/tx/tx_icd11.pas | 44 +- server/tx/tx_iso_4217.pas | 30 +- server/tx/tx_mimetypes.pas | 16 +- server/tx/tx_ndc.pas | 27 +- server/tx/tx_omop.pas | 66 +- server/tx/tx_rxnorm.pas | 88 +- server/tx/tx_unii.pas | 24 +- server/tx/tx_uri.pas | 16 +- server/tx/tx_us_states.pas | 20 +- server/tx_manager.pas | 1139 ++---- server/tx_operations.pas | 674 +++- server/tx_registry_model.pas | 299 +- server/tx_registry_spider.pas | 202 +- server/tx_server.pas | 592 ++- server/tx_webserver.pas | 222 +- server/utilities.pas | 8 +- server/validator_r2.pas | 24 +- server/validator_r3.pas | 24 +- server/validator_r4.pas | 24 +- server/validator_r4b.pas | 24 +- server/validator_r5.pas | 24 +- server/web/assets/images/tx-registry-root.gif | Bin 0 -> 365 bytes server/web/assets/images/tx-registry.png | Bin 0 -> 853 bytes server/web/assets/images/tx-server.png | Bin 0 -> 530 bytes server/web/assets/images/tx-version.png | Bin 0 -> 670 bytes server/web/bottom.html | 2 +- server/web/coverage.html | 116 +- server/web/covid-patient-error.html | 117 +- server/web/covid-patient.secure.html | 108 +- server/web/covid-result.secure.html | 109 +- server/web/covid.secure.html | 117 +- server/web/create-coverage.html | 116 +- server/web/diagnostics.html | 124 +- server/web/encounter.html | 117 +- server/web/fitbit-start.html | 122 +- server/web/homepage.html | 121 +- server/web/local.html | 121 +- server/web/oauth_choice.html | 122 +- server/web/oauth_login.html | 122 +- server/web/oauth_login_denied.html | 122 +- server/web/oauth_skype.html | 123 +- server/web/oauth_userdetails.html | 122 +- server/web/package-client.html | 151 +- server/web/packages-broken.html | 23 + server/web/packages-home.html | 154 +- server/web/packages-log.html | 19 + server/web/packages-protect.html | 151 +- server/web/packages-protected.html | 150 +- server/web/packages-search.html | 156 +- server/web/packages-upload-api.html | 150 +- server/web/packages-versions.html | 150 +- server/web/patient.html | 121 +- server/web/registerclient.html | 122 +- server/web/scimuser.html | 122 +- server/web/scimusers.html | 122 +- server/web/sct-choice.html | 124 +- server/web/sessions.html | 122 +- server/web/tabs.html | 28 + server/web/task-redirect.html | 116 +- server/web/template-fhir.html | 151 +- server/web/template-nfhir.html | 151 +- server/web/token.html | 119 +- server/web/top.html | 2 +- server/web/tx-cm-id.html | 124 +- server/web/tx-cs-id.html | 124 +- server/web/tx-registry.html | 133 +- server/web/tx-vs-id.html | 123 +- server/web/tx-vs.html | 122 +- server/web/txform.html | 4 +- server/web/txhome.html | 153 +- server/web/xig.html | 3 +- server/web_base.pas | 18 +- server/web_cache.pas | 43 +- server/web_server.pas | 685 ++-- server/web_source.pas | 2 +- server/xig_provider.pas | 53 +- server/{remote_config.pas => zero_config.pas} | 1162 +++--- testcases/cpt/cpt-fragment.db | Bin 45056 -> 49152 bytes toolkit/FHIRToolkitForm.pas | 8 +- toolkit/ImplementationGuideEditor.pas | 2 +- toolkit2/dialogs/dlg_igpub_github.pas | 8 +- toolkit2/editors/ftk_editor_base.pas | 34 +- toolkit2/editors/ftk_editor_json.pas | 18 + toolkit2/fhirtoolkit.lpi | 31 +- toolkit2/frames/ftk_frame_codesystem.pas | 2 +- toolkit2/frames/ftk_frame_igpub.pas | 10 +- toolkit2/frm_main.pas | 6 +- toolkit2/ftk_fhir_context_2.pas | 14 +- toolkit2/ftk_fhir_context_3.pas | 14 +- toolkit2/ftk_fhir_context_4.pas | 14 +- toolkit2/ftk_fhir_context_5.pas | 14 +- toolkit2/views/ftk_console.pas | 4 +- utilities/codescan/codescan.lpi | 7 +- utilities/codescan/codescan.lpr | 60 +- .../templates/TFhirElement.implementation.pas | 2 +- 370 files changed, 26001 insertions(+), 24291 deletions(-) delete mode 100644 1-ClickServer/1-ReinstallR4.cmd delete mode 100644 1-ClickServer/2-RunServer.cmd delete mode 100644 1-ClickServer/filelist.txt delete mode 100644 1-ClickServer/readme.md delete mode 100644 1-ClickServer/server/fhirR4.db delete mode 100644 1-ClickServer/server/fhirRx_empty.db delete mode 100644 1-ClickServer/server/fhirserver.ini create mode 100644 Dockerfile prev create mode 100644 FastMM4_AVX512.obj create mode 100644 config/config.json create mode 100644 exec/pack/Messages_pt-BR.properties create mode 100644 exec/pack/linux/get-openssl.sh create mode 100644 exec/pack/linux/install.sh create mode 100644 exec/pack/linux/start.sh create mode 100644 exec/pack/web.ini create mode 100644 grafana/config-grafana-observability.json create mode 100644 library/fhir/fhir_tx.pas create mode 100644 library/fsl/fsl_cpu.pas create mode 100644 server/web/assets/images/tx-registry-root.gif create mode 100644 server/web/assets/images/tx-registry.png create mode 100644 server/web/assets/images/tx-server.png create mode 100644 server/web/assets/images/tx-version.png create mode 100644 server/web/packages-broken.html create mode 100644 server/web/packages-log.html create mode 100644 server/web/tabs.html rename server/{remote_config.pas => zero_config.pas} (92%) diff --git a/.github/workflows/linux-docker-build.yml b/.github/workflows/linux-docker-build.yml index ebecf95ed..0dc006fe0 100644 --- a/.github/workflows/linux-docker-build.yml +++ b/.github/workflows/linux-docker-build.yml @@ -3,7 +3,6 @@ on: # but only for the main branch push: branches: - - master # pull_request: jobs: Build-Docker-Image: @@ -11,12 +10,12 @@ jobs: steps: - name: Check out repository code uses: actions/checkout@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} +# - +# name: Login to Docker Hub +# uses: docker/login-action@v2 +# with: +# username: ${{ secrets.DOCKERHUB_USERNAME }} +# password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Cache terminology files uses: actions/cache@v2 with: @@ -64,24 +63,24 @@ jobs: mkdir -p ~/terminology/fhir-server wget -q --no-clobber https://storage.googleapis.com/ig-build/snomed.test.cache -O ~/terminology/fhir-server/snomed.test.cache || true ls ~/terminology/fhir-server/snomed.test.cache - - name: Run tests in docker +# - name: Run tests in docker +# run: | +# docker images --all +# docker run \ +# --network gh \ +# -v ~/terminology:/terminology \ +# -v ~/test-settings.ini:/work/fhirserver/exec/64/test-settings.ini \ +# fhirserver -tests + + - name: Tag and push Docker image run: | - docker images --all - docker run \ - --network gh \ - -v ~/terminology:/terminology \ - -v ~/test-settings.ini:/work/fhirserver/exec/64/test-settings.ini \ - fhirserver -tests + # Extract the FHIR server version from the library/version.inc file + FHIR_VERSION=$(grep -oP "FHIR_CODE_FULL_VERSION = '\K[^']+" library/version.inc) -# - name: Tag and push Docker image -# run: | -# # Extract the FHIR server version from the library/version.inc file -# FHIR_VERSION=$(grep -oP "FHIR_CODE_FULL_VERSION = '\K[^']+" library/version.inc) -# -# # Tag the Docker image with the extracted version and "latest" -# docker tag fhirserver ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:$FHIR_VERSION -# docker tag fhirserver ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:latest -# -# # Push both tagged images to Docker Hub -# docker push ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:$FHIR_VERSION -# docker push ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:latest + # Tag the Docker image with the extracted version and "latest" + docker tag fhirserver ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:$FHIR_VERSION + docker tag fhirserver ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:latest + + # Push both tagged images to Docker Hub + docker push ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:$FHIR_VERSION + docker push ${{ secrets.DOCKERHUB_USERNAME }}/fhirserver:latest diff --git a/.gitignore b/.gitignore index 41dc6e96a..415c5af64 100644 --- a/.gitignore +++ b/.gitignore @@ -42,7 +42,6 @@ terminology # files to ignore tests.ini exec/fhir.dev.local.cfg -exec/pack/fhirserver.web server/fhirserver.testing.ini testcases/v2dict/hl7_94Jul2018.mdb testcases/snomed/snomed.cache @@ -97,3 +96,7 @@ exec/cert/ *.res *.fpc + +up_props.sh + +server/web/fhirserver.web diff --git a/1-ClickServer/1-ReinstallR4.cmd b/1-ClickServer/1-ReinstallR4.cmd deleted file mode 100644 index b74eef8ed..000000000 --- a/1-ClickServer/1-ReinstallR4.cmd +++ /dev/null @@ -1,4 +0,0 @@ -if not exist fhirR4.db copy fhirRx_empty.db fhirR4.db -cd server -FHIRServer.exe -cmd remount -password sa -ini ".\fhirserver.ini" -packages hl7.fhir.core#4.0.0 -endpoint r4 -mode open -cd .. diff --git a/1-ClickServer/2-RunServer.cmd b/1-ClickServer/2-RunServer.cmd deleted file mode 100644 index 47b6c0b76..000000000 --- a/1-ClickServer/2-RunServer.cmd +++ /dev/null @@ -1,3 +0,0 @@ -cd server -FHIRServer.exe -cmd exec -debug -ini ".\fhirserver.ini" -cd .. diff --git a/1-ClickServer/filelist.txt b/1-ClickServer/filelist.txt deleted file mode 100644 index e616f8487..000000000 --- a/1-ClickServer/filelist.txt +++ /dev/null @@ -1,224 +0,0 @@ -1-ReinstallR4.cmd * -2-RunServer.cmd * -\server\auth.ini -\server\ChakraCore.dll -\server\FastMM_FullDebugMode64.dll -\server\fhir.ini -\server\fhirR4.db * -\server\fhirRx_empty.db * -\server\FHIRServer.exe -\server\fhirserver.ini * -\server\fhirserver_orig.ini -\server\FHIRServerUtils.exe -\server\fhirtests3.exe -\server\getData.cmd -\server\javaStart.bat -\server\libeay32.dll -\server\libmysql.dll -\server\LOINC_short_license.txt -\server\openssl.dll -\server\org.hl7.fhir.validator.jar -\server\sqlite3.dll -\server\ssleay32.dll -\server\ucum-essence.xml -\server\unins000.exe -\server\org.hl7.fhir.validator.jar -\server\Libraries -\server\Libraries\js -\server\Libraries\js\AdvJavascript.pas -\server\Libraries\js\chakra -\server\Libraries\js\chakra\x64_release -\server\Libraries\js\chakra\x64_release\ChakraCore.dll -\server\Libraries\js\chakra\x86_release -\server\Libraries\js\chakra\x86_release\ChakraCore.dll -\server\Libraries\js\ChakraCommon.pas -\server\Libraries\js\FHIRClientJs.pas -\server\Libraries\js\FHIRJavascript.pas -\server\Libraries\js\FHIRJavascriptTests.pas -\server\Libraries\js\Javascript.pas -\server\Libraries\js\JavascriptTests.pas -\server\load -\server\load\fhir.json.zip -\server\load\fhir.min.json.zip -\server\load\load.ini -\server\load\loadmin.ini -\server\load\us-core.json.zip -\server\load\us-daf.json.zip -\server\load\us-sdc.json.zip -\server\load\us-sdcde.json.zip -\server\loinc -\server\loinc\loinc_266.cache -\server\sql -\server\sql\country-codes - Copy.sql -\server\sql\country-codes.sql -\server\sql\lang.txt -\server\sql\ncimeta_import.sql -\server\sql\nucc.xml -\server\sql\remove resource of type.sql -\server\sql\rxnorm_import.sql -\server\sql\tslc.xml -\server\sql\tx_db.sql -\server\sql\us-state-codes.sql -\server\tx -\server\web -\server\web\AnnotationStripper.xslt -\server\web\CategorizeWarnings.xslt -\server\web\definitions.json -\server\web\definitions.json.zip -\server\web\definitions.xml.zip -\server\web\definitions1.zip -\server\web\diagnostics.html -\server\web\DocumentToHTML.xslt -\server\web\examples.zip -\server\web\facebook.png -\server\web\favicon.png -\server\web\fhir.css -\server\web\fitbit-start.html -\server\web\homepage.html -\server\web\html-form-add.png -\server\web\html-form-delete.png -\server\web\icon-fhir-16.png -\server\web\local.html -\server\web\logout.png -\server\web\oauth_choice.html -\server\web\oauth_login.html -\server\web\oauth_skype.html -\server\web\oauth_userdetails.html -\server\web\OwnerResources.xslt -\server\web\patient.html -\server\web\QuestionnaireToHTML.xslt -\server\web\RenderWarnings.xslt -\server\web\robots.txt -\server\web\scimuser.html -\server\web\scimusers.html -\server\web\sct-choice.html -\server\web\svrl_to_html.xslt -\server\web\tx-cm-id.html -\server\web\tx-cs-id.html -\server\web\txform.html -\server\web\txhome.html -\server\web\tx-vs.html -\server\web\tx-vs-id.html -\server\web\validator.zip -\server\web\WarningsToQA.xslt -\server\web\iso_schematron_skeleton_for_saxon.xsl -\server\web\iso_schematron_skeleton_for_xslt1.xsl -\server\web\iso_svrl_for_xslt1.xsl -\server\web\iso_svrl_for_xslt2.xsl -\server\web\iso_svrl_for_xslt3.xsl -\server\web\assets -\server\web\assets\css -\server\web\assets\css\bootstrap-fhir.css -\server\web\assets\css\bootstrap-glyphicons.css -\server\web\assets\css\modules.css -\server\web\assets\css\project.css -\server\web\assets\css\pygments-manni.css -\server\web\assets\css\xml.css -\server\web\assets\fonts -\server\web\assets\fonts\glyphiconshalflings-regular.eot -\server\web\assets\fonts\glyphiconshalflings-regular.otf -\server\web\assets\fonts\glyphiconshalflings-regular.svg -\server\web\assets\fonts\glyphiconshalflings-regular.ttf -\server\web\assets\fonts\glyphiconshalflings-regular.woff -\server\web\assets\ico -\server\web\assets\ico\apple-touch-icon-114-precomposed.png -\server\web\assets\ico\apple-touch-icon-144-precomposed.png -\server\web\assets\ico\apple-touch-icon-57-precomposed.png -\server\web\assets\ico\apple-touch-icon-72-precomposed.png -\server\web\assets\ico\favicon.ico -\server\web\assets\ico\favicon.png -\server\web\assets\images -\server\web\assets\images\fhir-logo.png -\server\web\assets\images\fhir-logo-www.png -\server\web\assets\images\hl7-logo.png -\server\web\assets\images\logo_ansinew.jpg -\server\web\assets\images\search.png -\server\web\assets\images\stripe.png -\server\web\assets\images\target.png -\server\web\assets\js -\server\web\assets\js\fhir.js -\server\web\assets\js\html5shiv.js -\server\web\assets\js\jquery.js -\server\web\assets\js\jquery-1.11.1.min.map -\server\web\assets\js\respond.min.js -\server\web\assets\js\xml.js -\server\web\css -\server\web\css\jquery.ui.all.css -\server\web\css\tags.css -\server\web\definitions.json\conceptmaps.json -\server\web\definitions.json\dataelements.json -\server\web\definitions.json\extension-definitions.json -\server\web\definitions.json\fhir.schema.json.zip -\server\web\definitions.json\profiles-others.json -\server\web\definitions.json\profiles-resources.json -\server\web\definitions.json\profiles-types.json -\server\web\definitions.json\search-parameters.json -\server\web\definitions.json\v2-tables.json -\server\web\definitions.json\v3-codesystems.json -\server\web\definitions.json\valuesets.json -\server\web\definitions.json\version.info -\server\web\dist -\server\web\dist\css -\server\web\dist\css\bootstrap.css -\server\web\dist\js -\server\web\dist\js\bootstrap.js -\server\web\dist\js\bootstrap.min.js -\server\web\images -\server\web\images\ui-bg_diagonals-thick_18_b81900_40x40.png -\server\web\images\ui-bg_diagonals-thick_20_666666_40x40.png -\server\web\images\ui-bg_flat_10_000000_40x100.png -\server\web\images\ui-bg_glass_100_f6f6f6_1x400.png -\server\web\images\ui-bg_glass_100_fdf5ce_1x400.png -\server\web\images\ui-bg_glass_65_ffffff_1x400.png -\server\web\images\ui-bg_gloss-wave_35_f6a828_500x100.png -\server\web\images\ui-bg_highlight-soft_100_eeeeee_1x100.png -\server\web\images\ui-bg_highlight-soft_75_ffe45c_1x100.png -\server\web\images\ui-icons_222222_256x240.png -\server\web\images\ui-icons_228ef1_256x240.png -\server\web\images\ui-icons_ef8c08_256x240.png -\server\web\images\ui-icons_ffd27a_256x240.png -\server\web\images\ui-icons_ffffff_256x240.png -\server\web\js -\server\web\js\fhir-gw.js -\server\web\js\hl7connect.js -\server\web\js\jcookie.js -\server\web\js\jquery.effects.blind.js -\server\web\js\jquery.effects.bounce.js -\server\web\js\jquery.effects.clip.js -\server\web\js\jquery.effects.core.js -\server\web\js\jquery.effects.drop.js -\server\web\js\jquery.effects.explode.js -\server\web\js\jquery.effects.fade.js -\server\web\js\jquery.effects.fold.js -\server\web\js\jquery.effects.highlight.js -\server\web\js\jquery.effects.pulsate.js -\server\web\js\jquery.effects.scale.js -\server\web\js\jquery.effects.shake.js -\server\web\js\jquery.effects.slide.js -\server\web\js\jquery.effects.transfer.js -\server\web\js\jquery.ui.accordion.js -\server\web\js\jquery.ui.autocomplete.js -\server\web\js\jquery.ui.button.js -\server\web\js\jquery.ui.core.js -\server\web\js\jquery.ui.datepicker.js -\server\web\js\jquery.ui.dialog.js -\server\web\js\jquery.ui.draggable.js -\server\web\js\jquery.ui.droppable.js -\server\web\js\jquery.ui.mouse.js -\server\web\js\jquery.ui.position.js -\server\web\js\jquery.ui.progressbar.js -\server\web\js\jquery.ui.resizable.js -\server\web\js\jquery.ui.selectable.js -\server\web\js\jquery.ui.slider.js -\server\web\js\jquery.ui.sortable.js -\server\web\js\jquery.ui.tabs.js -\server\web\js\jquery.ui.widget.js -\server\web\js\jquery-1.3.2.min.js -\server\web\js\jquery-1.6.2.js -\server\web\js\jquery-1.6.2.min.js -\server\web\js\jquery-ui-1.7.1.custom.min.js -\server\web\js\jquery-ui-1.8.16.custom.js -\server\web\js\jquery-ui-1.8.16.custom.min.js -\server\web\js\json2.js -\server\web\js\jtip.js -\server\web\js\statuspage.js diff --git a/1-ClickServer/readme.md b/1-ClickServer/readme.md deleted file mode 100644 index e2b1b89f7..000000000 --- a/1-ClickServer/readme.md +++ /dev/null @@ -1,16 +0,0 @@ -One-click FHIR Server - - - -Running the server - - - -Setup - -1. Get Terminologies -2. Define endpoints -3. Mount the database - - - diff --git a/1-ClickServer/server/fhirR4.db b/1-ClickServer/server/fhirR4.db deleted file mode 100644 index 4b982c5cf6f9df30d2cee156ca9eb9e83a44947a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuF$#k~5Cza#u+1Iz1VOM%94=q-)|Go_Vp<3aev7K2oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly aK!5-N0t5&UAV7cs0RjXF5FkL{e*}ICJO^a} diff --git a/1-ClickServer/server/fhirRx_empty.db b/1-ClickServer/server/fhirRx_empty.db deleted file mode 100644 index 4b982c5cf6f9df30d2cee156ca9eb9e83a44947a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuF$#k~5Cza#u+1Iz1VOM%94=q-)|Go_Vp<3aev7K2oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly aK!5-N0t5&UAV7cs0RjXF5FkL{e*}ICJO^a} diff --git a/1-ClickServer/server/fhirserver.ini b/1-ClickServer/server/fhirserver.ini deleted file mode 100644 index 0ebadf5c0..000000000 --- a/1-ClickServer/server/fhirserver.ini +++ /dev/null @@ -1,95 +0,0 @@ -[databases] -dbr4= database: .\fhir4.db; type: SQLite; when-testing: true - - -[endpoints] -r4= path: /r4; validate: true; database: dbr4; version: r4 - - -[terminologies] -ucum= type: ucum; source: .\ucum-essence.xml -;loinc= type: loinc; source: .\loinc\loinc_266.cache - -;icd10= type: icd10; source: .\icd\icd10.txt -;icd10cm= type: icd10; source: .\icd\icd10cm.txt -;icd10vn= type: icd10; source: .\icd\icd10vn.txt -;s-usa= type: snomed; source: .\snomed\snomed_20190301_us.cache -;sintl= type: snomed; source: .\snomed\snomed_20190731_intl.cache -;rxnorm= type: rxnorm; database: \rxnorm\rxn -;ndc=type: ndc; database: rxn; version: 20190321 -;unii= type: unii; database: dbr4 -;scomb= default: true; type: snomed; source: .\snomed_20170306_combined.cache; when-testing: true -;lang= type: lang; source: .\sql\lang.txt - - - -[web] -clients=.\auth.ini -secure-token={uuid} -host=localhost -http=960 -base=/r4 -secure= -https= -certname= -cacertname= -certpword= -folder=.\web - -[fhir] -web=.\web - -[details] -version=r4 - -[internal] - -[scim] -; SCIM sub-system configuration -; salt= -; a random string (use a UUID) that the SCIM sub-system uses to -; salt the hashed passwords. If you change this, all existing -; SCIM passwords are invalidated. You must have some content -; for this even if you don't use SCIM -; -; the default rights to assign to anonymous users on the open/unsecured interface -default-rights=openid,profile,user/*.* -salt={E88C683B-C0D2-4B85-BEEF-289AB0CD8683} - - -[admin] -; required. Master admin account for administering user accounts. -; password is provided to database mount procedure (or install) -username=sa -email=jct@zeora.net -default-rights=openid,fhirUser,profile,user/*.* -scim-salt={908CBB82-3404-4DFB-B959-62E2AB610AED} - -[email] -; server configuration for sending email subscriptions -; -; Host= (host name to send email to) -; Port= (post name for host) -; Username= (user name with rights to send email using nominated server as a relay) -; Password= (password for username) -; Sender= (email address of sender - often related to the username) -; secure= (0 or 1: whether to use TLS when sending. Server dictates what value to use here) - -[sms] -; server configuration for sending sms subscriptions -; account details on Twilio, which is used to send SMS messages -; values as specified for the twilio account -; -; account= -; token= -; from= -; owner= if an owner is nominated, they'll be sms'ed when the server starts or stops - -[dicom] -cache=.\dicom.cache - -[lang] -source=.\sql\lang.txt -[server] -run-number=805 - diff --git a/Dockerfile b/Dockerfile index 4c324476e..2c275e098 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM ubuntu:22.04 as builder +FROM ubuntu:24.04 AS builder ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y tzdata wget git unixodbc-dev libgtk2.0-dev xvfb sqlite3 libsqlite3-dev build-essential +RUN apt update && apt-get upgrade -y && apt install -y tzdata wget git unixodbc-dev libgtk2.0-dev xvfb sqlite3 libsqlite3-dev build-essential curl binutils && apt-get clean && rm -rf /var/lib/apt/lists/* # Download and build OpenSSL 1.1.1w WORKDIR /tmp @@ -15,13 +15,12 @@ RUN wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz \ && make test \ && make install -RUN ls -la /usr/local/lib/ +# RUN ls -la /usr/local/lib/ # Set the timezone RUN echo "UTC" > /etc/timezone -RUN apt update && apt install -y wget git unixodbc-dev libgtk2.0-dev xvfb sqlite3 libsqlite3-dev && \ - cd /tmp && \ +RUN cd /tmp && \ wget https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit.tar.gz && \ tar -xzvf mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit.tar.gz && \ cp -r mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit/lib/* /usr/local/lib && \ @@ -37,33 +36,126 @@ RUN /work/bootstrap/linux-toolchain.sh /work/bootstrap WORKDIR /work/fhirserver COPY . /work/fhirserver -RUN /work/bootstrap/linux-libraries.sh /work/bootstrap -RUN cp /usr/local/lib/*.so* /usr/lib/ -RUN /work/fhirserver/build/linux-fhirserver.sh /work/bootstrap -RUN cp exec/pack/*.properties exec/64 +RUN /work/bootstrap/linux-libraries.sh /work/bootstrap && \ + cp /usr/local/lib/*.so* /usr/lib/ && \ + /work/fhirserver/build/linux-fhirserver.sh /work/bootstrap && \ + cp exec/pack/*.properties exec/64 +# RUN cp exec/install/* exec/64 + +RUN mkdir -p /work/fhirserver/exec/install/bin && \ + mkdir -p /work/fhirserver/exec/install/x86_64 && \ + mkdir -p /work/fhirserver/exec/install/content && \ + mkdir -p /work/fhirserver/exec/install/config && \ + # mkdir -p /work/fhirserver/exec/install/config/config && \ + mkdir -p /work/fhirserver/exec/install/default_config && \ + mkdir -p /work/fhirserver/exec/install/web + +RUN cd /work/fhirserver && \ + cp /work/fhirserver/exec/64/fhirserver /work/fhirserver/exec/install/bin && \ + cp /work/fhirserver/exec/64/FHIRToolkit /work/fhirserver/exec/install/bin && \ + cp /work/fhirserver/exec/64/FHIRConsole /work/fhirserver/exec/install/bin && \ + cp /work/fhirserver/exec/pack/linux/*so* /work/fhirserver/exec/install/x86_64 + +RUN cp /work/fhirserver/exec/pack/linux/start.sh /work/fhirserver/exec/install/bin/start.sh && \ + cp /work/fhirserver/exec/pack/linux/install.sh /work/fhirserver/exec/install && \ + cp /work/fhirserver/exec/pack/linux/get-openssl.sh /work/fhirserver/exec/install && \ + cp /tmp/openssl-1.1.1w/*.so* /work/fhirserver/exec/install/x86_64 && \ + cp /work/fhirserver/exec/pack/*.properties /work/fhirserver/exec/install/content && \ + cp /work/fhirserver/exec/pack/*.dat /work/fhirserver/exec/install/content && \ + + cp /work/fhirserver/exec/pack/fhirserver.cfg /work/fhirserver/exec/install/config && \ + cp /work/fhirserver/exec/pack/web.ini /work/fhirserver/exec/install/config && \ + + + cp /work/fhirserver/exec/pack/web.ini /work/fhirserver/exec/install/default_config && \ + cp /work/fhirserver/exec/pack/fhirserver.cfg /work/fhirserver/exec/install/default_config && \ + cp /work/fhirserver/config/config.ini /work/fhirserver/exec/install/default_config/config.ini && \ + cp /work/fhirserver/config/config.json /work/fhirserver/exec/install/default_config/config.json && \ + # cp /work/fhirserver/config/config.ini /work/fhirserver/exec/install/config/config.ini && \ + + # cp /work/fhirserver/config/config_bare.json /work/fhirserver/exec/install/default_config/config.json && \ + # cp /work/fhirserver/config/config.ini /work/fhirserver/exec/install/config/default_config && \ + + mkdir -p /work/fhirserver/exec/install/web && \ + cp -r /work/fhirserver/server/web/* /work/fhirserver/exec/install/web && \ + cd /work/fhirserver/exec && tar -czvf ./install.tgz ./install/ && ls -la /work/fhirserver/exec -# Install curl for the health check -RUN apt-get update && apt-get install -y curl # Set the health check -HEALTHCHECK --interval=1m --timeout=10s --retries=5 \ +HEALTHCHECK --interval=1m --timeout=10s --retries=5 \ CMD curl -f http://localhost:${PORT}/fhir/metadata || exit 1 # Set the environment variables -ENV DISPLAY :99 -ENV PORT 80 -ENV TERMINOLOGY_CACHE /terminology +ENV DISPLAY=:99 +ENV PORT=80 +ENV TERMINOLOGY_CACHE=/terminology VOLUME /terminology ENV DEBIAN_FRONTEND= -RUN printf '#!/bin/bash \n\ -Xvfb :99 -screen 0 1024x768x8 -nolisten tcp & \n\ -echo "[web]" > /work/fhirserver/exec/64/web.ini; \n\ -echo "http=${PORT}" >> /work/fhirserver/exec/64/web.ini; \n\ -/work/fhirserver/exec/64/fhirserver $(eval echo "$@")'> /bin/entrypoint.sh && \ -chmod +x /bin/entrypoint.sh +# ENTRYPOINT ["/bin/entrypoint.sh"] -ENTRYPOINT ["/bin/entrypoint.sh"] +# CMD ["-cmd", "exec", "-cfg", "/config/config.ini", "-local", "$TERMINOLOGY_CACHE"] -CMD ["-cmd", "exec", "-cfg", "/config/config.ini", "-local", "$TERMINOLOGY_CACHE"] + + +# Runtime stage +FROM ubuntu:24.04 AS runtime + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=UTC +# Set up environment variables +# ENV HOME=~/ +ENV DISPLAY=:99 +ENV PORT=80 +ENV TERMINOLOGY_CACHE=/var/cache/txcache + +# Install runtime dependencies +RUN apt-get update && apt-get upgrade -y && apt-get install -y wget tzdata xvfb libgtk2.0-0 libsqlite3-dev curl && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p $HOME/fhirserver/config $TERMINOLOGY_CACHE /fhirserver \ + && chmod -R 777 $TERMINOLOGY_CACHE \ + && chmod -R 777 /fhirserver + +# Copy necessary files from the builder stage +COPY --from=builder /work/fhirserver/exec/install.tgz /fhirserver/install.tgz + +# RUN cd /fhirserver \ +# && tar -xzvf install.tgz \ +# && cd ./install \ +# && ./install.sh > install.log 2>&1 + +# Assuming /fhirserver is your working directory +WORKDIR /fhirserver + +# Extract the contents of the tar file +RUN tar -xzvf install.tgz + +# Change working directory to the extracted folder +WORKDIR /fhirserver/install + + +### Choose your flavour / uncomment one of the following lines ###: +## +## + +# 1. Run the installation script for a blank, clean install +RUN chmod a+x ./install.sh && ./install.sh + +# OR + +# 2. Run the installation script With Zero Config as tx.fhir.org +# RUN chmod a+x ./install.sh && ./install.sh -nodaemon -zero=https://storage.googleapis.com/tx-fhir-org/config.json + +## +## +## +#################################################################### + +WORKDIR /root/fhirserver + +# Define entrypoint and command +CMD ["bash", "-c", "cd ~/fhirserver/ && ./start.sh"] + +# Expose the necessary port +EXPOSE 80 diff --git a/Dockerfile prev b/Dockerfile prev new file mode 100644 index 000000000..5a2816485 --- /dev/null +++ b/Dockerfile prev @@ -0,0 +1,152 @@ +FROM ubuntu:22.04 as builder + +ENV DEBIAN_FRONTEND=noninteractive + + +RUN apt update && apt install -y tzdata wget git unixodbc-dev libgtk2.0-dev xvfb sqlite3 libsqlite3-dev build-essential curl binutils + +# Download and build OpenSSL 1.1.1w +WORKDIR /tmp +RUN wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz \ + && tar -xf openssl-1.1.1w.tar.gz \ + && cd openssl-1.1.1w \ + && ./config \ + && make \ + && make test \ + && make install + +RUN ls -la /usr/local/lib/ + +# Set the timezone +RUN echo "UTC" > /etc/timezone + +RUN cd /tmp && \ + wget https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit.tar.gz && \ + tar -xzvf mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit.tar.gz && \ + cp -r mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit/lib/* /usr/local/lib && \ + cp -r mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit/bin/* /usr/local/bin && \ + rm -rf mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit && \ + rm -rf mysql-connector-odbc-8.0.26-linux-glibc2.12-x86-64bit.tar.gz && \ + myodbc-installer -a -d -n "MySQL ODBC 8.0 Driver" -t "Driver=/usr/local/lib/libmyodbc8w.so" && \ + myodbc-installer -a -d -n "MySQL ODBC 8.0" -t "Driver=/usr/local/lib/libmyodbc8a.so" + +COPY build/linux-toolchain.sh build/linux-libraries.sh /work/bootstrap/ +RUN /work/bootstrap/linux-toolchain.sh /work/bootstrap + +WORKDIR /work/fhirserver +COPY . /work/fhirserver + +RUN /work/bootstrap/linux-libraries.sh /work/bootstrap +RUN cp /usr/local/lib/*.so* /usr/lib/ +RUN /work/fhirserver/build/linux-fhirserver.sh /work/bootstrap +RUN cp exec/pack/*.properties exec/64 +# RUN cp exec/install/* exec/64 + +RUN mkdir -p /work/fhirserver/exec/install/bin +RUN mkdir -p /work/fhirserver/exec/install/x86_64 +RUN mkdir -p /work/fhirserver/exec/install/content +RUN mkdir -p /work/fhirserver/exec/install/config +RUN mkdir -p /work/fhirserver/exec/install/config/config +RUN mkdir -p /work/fhirserver/exec/install/web + +RUN cd /work/fhirserver +RUN cp /work/fhirserver/exec/64/fhirserver /work/fhirserver/exec/install/bin +RUN cp /work/fhirserver/exec/64/FHIRToolkit /work/fhirserver/exec/install/bin +RUN cp /work/fhirserver/exec/64/FHIRConsole /work/fhirserver/exec/install/bin +RUN cp /work/fhirserver/exec/pack/linux/*so* /work/fhirserver/exec/install/x86_64 +RUN cp /work/fhirserver/exec/pack/linux/start.sh /work/fhirserver/exec/install/bin +RUN cp /work/fhirserver/exec/pack/linux/install.sh /work/fhirserver/exec/install +RUN cp /work/fhirserver/exec/pack/linux/get-openssl.sh /work/fhirserver/exec/install +RUN cp /tmp/openssl-1.1.1w/*.so* /work/fhirserver/exec/install/x86_64 +RUN cp /work/fhirserver/exec/pack/*.properties /work/fhirserver/exec/install/content +RUN cp /work/fhirserver/exec/pack/*.dat /work/fhirserver/exec/install/content +RUN cp /work/fhirserver/exec/pack/fhirserver.cfg /work/fhirserver/exec/install/config +RUN cp /work/fhirserver/exec/64/web.ini /work/fhirserver/exec/install/config +RUN cp /work/fhirserver/config/config.ini /work/fhirserver/exec/install/config/config +RUN mkdir -p /work/fhirserver/exec/install/web +RUN cp -r /work/fhirserver/server/web/* /work/fhirserver/exec/install/web + +RUN cd /work/fhirserver/exec && tar -czvf ./install.tgz ./install/ && ls -la /work/fhirserver/exec + + +# Set the health check +HEALTHCHECK --interval=1m --timeout=10s --retries=5 \ + CMD curl -f http://localhost:${PORT}/fhir/metadata || exit 1 + +# Set the environment variables +ENV DISPLAY :99 +ENV PORT 80 +ENV TERMINOLOGY_CACHE /terminology +VOLUME /terminology + +ENV DEBIAN_FRONTEND= + +RUN printf '#!/bin/bash \n\ + set -e \n\ + start_xvfb() { \n\ + Xvfb :99 -screen 0 1024x768x8 -nolisten tcp & \n\ + } \n\ + stop_xvfb() { \n\ + killall Xvfb || true \n\ + } \n\ + trap stop_xvfb SIGTERM \n\ + rm -f /tmp/.X99-lock \n\ + start_xvfb \n\ + echo "[web]" > /work/fhirserver/exec/64/web.ini; \n\ + echo "http=${PORT}" >> /work/fhirserver/exec/64/web.ini; \n\ + /work/fhirserver/exec/64/fhirserver $(eval echo "$@")' > /bin/entrypoint.sh && \ + chmod +x /bin/entrypoint.sh + + +# ENTRYPOINT ["/bin/entrypoint.sh"] + +# CMD ["-cmd", "exec", "-cfg", "/config/config.ini", "-local", "$TERMINOLOGY_CACHE"] + + + +# Runtime stage +FROM ubuntu:22.04 as runtime + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=UTC +# Set up environment variables +# ENV HOME=~/ +ENV DISPLAY=:99 +ENV PORT=80 +ENV TERMINOLOGY_CACHE=/var/cache/txcache + +# Install runtime dependencies +RUN apt-get update && apt-get install -y wget tzdata xvfb libgtk2.0-0 libsqlite3-dev \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p $HOME/fhirserver/config $TERMINOLOGY_CACHE /fhirserver \ + && chmod -R 777 $TERMINOLOGY_CACHE \ + && chmod -R 777 /fhirserver + +# Copy necessary files from the builder stage +COPY --from=builder /work/fhirserver/exec/install.tgz /fhirserver/install.tgz + +# RUN cd /fhirserver \ +# && tar -xzvf install.tgz \ +# && cd ./install \ +# && ./install.sh > install.log 2>&1 + +# Assuming /fhirserver is your working directory +WORKDIR /fhirserver + +# Extract the contents of the tar file +RUN tar -xzvf install.tgz + +# Change working directory to the extracted folder +WORKDIR /fhirserver/install + +# Run the installation script +RUN ./install.sh -nodaemon + # -zero=https://storage.googleapis.com/tx-fhir-org/config.json +### Uncomment and append this line above to the install script, to allow the initial tx config to be loaded + + +# Define entrypoint and command +CMD ["bash", "-c", "cd ~/fhirserver/ && ./start.sh"] + +# Expose the necessary port +EXPOSE 80 \ No newline at end of file diff --git a/FastMM4_AVX512.obj b/FastMM4_AVX512.obj new file mode 100644 index 0000000000000000000000000000000000000000..25a677b75755fb85948c1b3c464a396789071bf7 GIT binary patch literal 2468 zcmbW1PiPxQ6vk&{$EZQIMMzH}SUv>SlnQAjIdU*$72L8Ca*-WqV)xMOV#Sq_y|T3l z>SZ4_!dP?b`w1h$qfi{q^{R3_aP1J8@q}|!bPD&P}nf=Z8 zzW3(s?ks;o$>rT!%jZrIq7ZQU_vX3mAO zdnshJNHO4C;JVESgeeFUUe~0r67TTf`q=m^A*S(E?*|R*Tg3_k z{h(ppEmaVt`9V9rUa>YJJXdW5VGTb_aW*-3R!0!s@S_vnp-EpO-lK!D@sIhALitg} z1{Ho$eaqc}qHl?MHu;jX8r9v;_)@%8B*M5C{KgFsIb6eviY`;0eR&iFj!ZA<6 zoh!ob3Gb0f&l2xGDu31=X=T(#p|doKY+QI$wuE=zr00ltS9%(4xE`}VY||JL`QykRrvp!?w@nNt7dlIEz##DsD|s0uO{K$HR&6~`$6i-^ZS9eEQ+^l{xs^T zyr>>@XGy$k3#U;J*B@Vxc2qsPQ9PvLmZJOBQ5yX@X6yFWho66)X!WPw^2fh)UhEa;OReR3ZmZ*RvUg~QH8 zd)%COqF6JO4Gs)H+Din{?EIKO6WB5an=+XW86WHjg;VPnRIAgDPWQ*gHRy4Eal5Fn zi?<&7X9T|H(pHR?+*srwdA(Mzq9k@b?Gmy=-!hu^++6m(!aG-UX*Fpy*W^PJy(dGI z9h>1RX_!r`euJN_UHA;~<-UwZaWdKqVE@^SMNX<_nN}APSRr?y#tk z=4Xir&95L0G$!!*Ln1fag?+PX|2T&jtI8>T@+MrOo65o|W=u@&V6Fd9!JsXVOyMY&PIo zDQ`B|`qhkDZWL~|@Eu>N+3&x(xz=RO$%&0?v(`ejffhAQPQ|`K*X?Ik#LhM0bg8z& t+B#cp+J$;;Wxcx0qeU0A%WFox4k42ejs2G`i`BqHQ=%mTnul del install\build\*.exe 1>nul del release-notes-old.md 1>nul +del *.ppu /s /q +del *.o /s /q -:: ok. we're good to go... -:: ========================================================================================= -echo ## build FHIRConsole ## -call clean 1>nul -utilities\codescan\codescan.exe -proj-version c:\work\fhirserver\server\fhirconsole.lpi -version %1 -debug false || goto :error -%tmp%\tools\lazarus\lazbuild.exe -B server\fhirconsole.lpi --build-mode=win64-release -q -q -utilities\codescan\codescan.exe -check exec\64\fhirconsole.exe -message "Building the console failed" || goto :error +%tmp%\tools\lazarus\lazbuild.exe utilities/codescan/codescan.lpi --build-mode=win64 -q -q --build-all +%tmp%\tools\lazarus\lazbuild.exe server/fhirconsole.lpi --build-mode=win64 -q -q --build-all +%tmp%\tools\lazarus\lazbuild.exe server/fhirserver.lpr --build-mode=win64 -q -q --build-all +%tmp%\tools\lazarus\lazbuild.exe toolkit2/fhirtoolkit.lpr --build-mode=win64 -q -q --build-all -:: ========================================================================================= -echo ## build FHIRServer (debug) ## -call clean 1>nul -del server\FHIRServer.cfg -copy server\FHIRServer.debug.cfg server\FHIRServer.cfg -utilities\codescan\codescan.exe -proj-version server\fhirserver.dpr -version %1 -debug true || goto :error -cd server -..\install\tools\dcc64.exe FHIRServer.dpr -Q -cd .. -utilities\codescan\codescan.exe -check exec\64\fhirserver.exe -message "Building the Debug server failed" || goto :error copy exec\64\fhirserver.exe exec\64\FHIRServer.debug.exe del exec\64\fhirserver.exe +copy exec\64\fhirconsole.exe exec\64\FHIRConsole.debug.exe +del exec\64\fhirconsole.exe +copy exec\64\fhirtoolkit.exe exec\64\FHIRToolkit.debug.exe +del exec\64\fhirtoolkit.exe -:: ========================================================================================= -echo ## build FHIRServer (release) ## -call clean 1>nul -del server\FHIRServer.cfg -copy server\FHIRServer.release.cfg server\FHIRServer.cfg -utilities\codescan\codescan.exe -proj-version server\fhirserver.dpr -version %1 -debug false || goto :error -cd server -..\install\tools\dcc64 FHIRServer.dpr -Q -cd .. -utilities\codescan\codescan.exe -check exec\64\fhirserver.exe -message "Building the server failed" || goto :error +del *.ppu /s /q +del *.o /s /q -:: ========================================================================================= -echo ## build FHIRToolkit ## -call clean 1>nul -utilities\codescan\codescan.exe -proj-version toolkit2\fhirtoolkit.lpi -version %1 -debug false || goto :error -%tmp%\tools\lazarus\lazbuild.exe -B toolkit2\fhirtoolkit.lpi --build-mode=win64-release -q -q +%tmp%\tools\lazarus\lazbuild.exe server/fhirconsole.lpi --build-mode=win64-release -q -q --build-all +%tmp%\tools\lazarus\lazbuild.exe server/fhirserver.lpr --build-mode=win64-release -q -q --build-all +%tmp%\tools\lazarus\lazbuild.exe toolkit2/fhirtoolkit.lpr --build-mode=win64-release -q -q --build-all + +utilities\codescan\codescan.exe -check exec\64\fhirconsole.exe -message "Building the console failed" || goto :error +utilities\codescan\codescan.exe -check exec\64\fhirserver.debug.exe -message "Building the Debug server failed" || goto :error +utilities\codescan\codescan.exe -check exec\64\fhirserver.exe -message "Building the server failed" || goto :error utilities\codescan\codescan.exe -check exec\64\fhirtoolkit.exe -message "Building the toolkit failed" || goto :error -echo All compile done +exec\64\fhirserver.debug.exe -tests -test-settings exec\64\fhir-tests.ini -mode brief + +if errorlevel 1 goto Quit :: ========================================================================================= :: todo: sign the 4 binaries @@ -109,21 +99,10 @@ echo All compile done :: setlocal :: set HI_PASSWORD="...." -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRConsole.exe -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRServer.debug.exe -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRServer.exe -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRToolkit.exe - -:: ========================================================================================= -:: build the web file -del exec\pack\fhirserver.web -utilities\codescan\codescan.exe -check !exec\pack\fhirserver.web -message "Deleting the web file failed" || goto :error -cd server -cd web -..\..\install\tools\7z a -r -tzip ..\..\exec\pack\fhirserver.web *.* -cd .. -cd .. -utilities\codescan\codescan.exe -check exec\pack\fhirserver.web -message "Creating the web file failed" || goto :error +signtool sign /f install\cert\healthintersections.cer /d "FHIRServer" /fd SHA256 /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRConsole.exe +signtool sign /f install\cert\healthintersections.cer /d "FHIRServer" /fd SHA256 /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRServer.debug.exe +signtool sign /f install\cert\healthintersections.cer /d "FHIRServer" /fd SHA256 /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRServer.exe +signtool sign /f install\cert\healthintersections.cer /d "FHIRServer" /fd SHA256 /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com exec\64\FHIRToolkit.exe :: ========================================================================================= :: OK, now build the installers @@ -135,17 +114,28 @@ install\tools\iscc.exe install\install-tk.iss -q utilities\codescan\codescan.exe -check install\build\fhirserver-win64-%1.exe -message "Creating the server install failed" || goto :error utilities\codescan\codescan.exe -check install\build\fhirtoolkit-win64-%1.exe -message "Creating the toolkit install failed" || goto :error -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com install\build\fhirserver-win64-%1.exe -install\tools\signtool sign /f install\healthintersections.pfx /p %HI_PASSWORD% /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com install\build\fhirtoolkit-win64-%1.exe +signtool sign /f install\cert\healthintersections.cer /fd SHA256 /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com install\build\fhirserver-win64-%1.exe +signtool sign /f install\cert\healthintersections.cer /fd SHA256 /d "FHIRServer" /du "https://github.com/HealthIntersections/fhirserver" /t http://timestamp.sectigo.com install\build\fhirtoolkit-win64-%1.exe + +cd install +cd build +..\..\install\tools\7z a -r -tzip fhirserver-win64-%1.zip fhirserver-win64-%1.exe +cd .. +cd .. -set HI_PASSWORD=null :: ========================================================================================= :: now time to do the github release -echo ## GitHub Release ## -git commit library\version.inc -m "Release Version" +echo ## GitHub Push## +git commit -a -m "Release Version %1" git push -install\tools\gh release create v%1 "install\build\fhirserver-win64-%1.exe#Windows Server Installer" "install\build\fhirtoolkit-win64-%1.exe#Windows Toolkit Installer" -F release-notes.md + +echo ## GitHub Release ## + +install\tools\gh release create v%1 "install\build\fhirserver-win64-%1.exe#Windows Server Installer" "install\build\fhirserver-win64-%1.zip#Windows Server Installer Zip" "install\build\fhirtoolkit-win64-%1.exe#Windows Toolkit Installer" -F release-notes.md + +echo ## GitHub Release Done ## + rename release-notes.md release-notes-old.md utilities\codescan\codescan.exe -next-version %1 @@ -166,4 +156,4 @@ pause exit /b %errorlevel% - +:Quit \ No newline at end of file diff --git a/build/windows-toolchain.bat b/build/windows-toolchain.bat index 790c350a9..07c15888a 100644 --- a/build/windows-toolchain.bat +++ b/build/windows-toolchain.bat @@ -5,7 +5,7 @@ REM the folder must exist set FSDIR=%CD% setlocal -set "tmp=r:\fsbuild" +set "tmp=c:\temp" IF %1.==. GOTO No1 set "tmp=%1" @@ -18,7 +18,7 @@ rem ---- download the installer md tools -curl -L https://github.com/LongDirtyAnimAlf/Reiniero-fpcup/releases/download/v2.4.0a/fpclazup-x86_64-win64.exe --output tools\fpclazup.exe +curl -L https://github.com/LongDirtyAnimAlf/Reiniero-fpcup/releases/download/v2.2.0q/fpclazup-x86_64-win64.exe --output tools\fpclazup.exe curl -L https://github.com/LongDirtyAnimAlf/fpcupdeluxe/releases/download/crosslibs_v1.3/CrossLibsLinuxx64.zip --output tools\CrossLibsLinuxx64.zip curl -L https://github.com/LongDirtyAnimAlf/fpcupdeluxe/releases/download/wincrossbins_v1.0/WinCrossBinsLinuxx64.zip --output tools\WinCrossBinsLinuxx64.zip diff --git a/build/windows-update.bat b/build/windows-update.bat index 92a058b30..af6023eb6 100644 --- a/build/windows-update.bat +++ b/build/windows-update.bat @@ -5,15 +5,13 @@ REM the folder must exist set FSDIR=%CD% setlocal -set "tmp=r:\fsbuild" +set "tmp=c:\temp" IF %1.==. GOTO No1 set "tmp=%1" :No1 -call windows-libraries.bat %tmp% -pause +call build\windows-libraries.bat %tmp% -call windows-fhirserver.bat %tmp% -pause +call build\windows-fhirserver.bat %tmp% diff --git a/config/config.ini b/config/config.ini index 4ded9d3ac..a051cb8a6 100644 --- a/config/config.ini +++ b/config/config.ini @@ -1,6 +1,7 @@ [config] -zero=https://storage.googleapis.com/tx-fhir-org +zero=file:/root/fhirserver/default_config version=* +local=/var/cache/txcache user=gg [web] diff --git a/config/config.json b/config/config.json new file mode 100644 index 000000000..302dc0314 --- /dev/null +++ b/config/config.json @@ -0,0 +1,19 @@ +{ + "content" : { + "uv" : { + "packages" : { + "r4" : [ + "hl7.terminology.r4", + "fhir.tx.support.r4" + ] + } + } + }, + "endpoints" : { + "cache" : { + "path" : "/post/tx-cache", + "type" : "folder", + "folder": "/var/cache/txcache" + } + } +} diff --git a/dependencies/FMM/FastMM4.pas b/dependencies/FMM/FastMM4.pas index 0b2a068e9..c461af4fd 100644 --- a/dependencies/FMM/FastMM4.pas +++ b/dependencies/FMM/FastMM4.pas @@ -19149,7 +19149,7 @@ function CheckCanInstallMemoryManager: Boolean; {Has another MM been set, or has the Embarcadero MM been used? If so, this file is not the first unit in the uses clause of the project's .dpr file.} - if IsMemoryManagerSet then + if IsMemoryManagerSet and false then begin {When using runtime packages, another library may already have installed FastMM: Silently ignore the installation request.} diff --git a/dependencies/zflate/zflate.pas b/dependencies/zflate/zflate.pas index 845cb5ed3..1a4dc8594 100644 --- a/dependencies/zflate/zflate.pas +++ b/dependencies/zflate/zflate.pas @@ -79,7 +79,7 @@ tgzipinfo = record var zchunkmaxsize: dword = 1024*128; //128 KB default max chunk size - zbuffersize: dword = 1024*1024*16; //16 MB default buffer size + zbuffersize: dword = 1024*1024*64; //64 MB default buffer size threadvar zlasterror: integer; diff --git a/exec/pack/Messages.properties b/exec/pack/Messages.properties index 6b8d41614..bae41d4af 100644 --- a/exec/pack/Messages.properties +++ b/exec/pack/Messages.properties @@ -1,25 +1,73 @@ -#InstanceValidator -Bad_file_path_error = \n********************\n* The file name you passed in, ''{0}'', doesn''t exist on the local filesystem.\n* Please verify that this is valid file location.\n********************\n\n +# Validation +ABSTRACT_CODE_NOT_ALLOWED = Code ''{0}#{1}'' is abstract, and not allowed in this context +ALL_OK = All OK +ARRAY_CANNOT_BE_EMPTY = Array cannot be empty - the property should not be present if it has no values +ATTEMPT_TO_CHANGE_SLICING = The element at {0} defines the slicing {1} but then an element in the slicing {2} tries to redefine the slicing to {3} +Adding_wrong_path = Adding wrong path +Adding_wrong_path__outcomegetPath___resultPathBase__ = Adding wrong path - outcome.getPath() = {0}, resultPathBase = {1} +Adding_wrong_path_in_profile___vs_ = Adding wrong path in profile {0}: {1} vs {2} +All_observations_should_have_a_performer = Best Practice Recommendation: In general, all observations should have a performer +All_observations_should_have_a_subject = Best Practice Recommendation: In general, all observations should have a subject +All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = Best Practice Recommendation: In general, all observations should have an effective[x] ({0}) +Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Attempt to a slice an element that does not repeat: {0}/{1} from {2} in {3}, at element {4} (slice = {5}) +Attempt_to_replace_element_name_for_a_nonchoice_type=Attempt to replace element name for a non-choice type +Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Attempt to use Terminology server when no Terminology server is available +Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Attempt to use a snapshot on profile ''{0}'' as {1} before it is generated +BINDING_ADDITIONAL = {0} specified in an additional binding +BINDING_MAX = {0} specified in the max binding +BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE = Found {0} matches for ''{1}'' in the bundle ({2}) +BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT = Found {0} matches for fragment {2} in resource ''{1}'' in the bundle ({3}) +BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES = The {1} resource matched more than one of the allowed profiles ({3}) +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH = The {1} resource did not match any of the allowed profiles (Type {2}: {3}) +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON = The {1} resource did not match the profile {2} because: {3} +BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_one = Can''t find ''{1}'' in the bundle ({2}). Note that there is a resource in the bundle with the same type and id, but it does not match because of the fullUrl based rules around matching relative references (must be ``{3}``) +BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_other = Can''t find ''{1}'' in the bundle ({2}). Note that there are {0} resources in the bundle with the same type and id, but they do not match because of the fullUrl based rules around matching relative references (one of ``{3}``) +BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT = Can''t find ''{0}'' in the bundle ({1}) +BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = Entry {0} isn''t reachable by traversing forwards from the MessageHeader. Check that this is meant to be included (needed to process the message) +BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = Entry {0} isn''t reachable by traversing forwards from the Composition. Only Provenance is approved to be used this way (R4 section 3.3.1) +BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = Entry {0} isn''t reachable by traversing forwards from the Composition. Check whether this should be linked directly from the composition if it''s a source of narrative content +BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = Entry {0} matches the reference {1} by type and id but it does not match the full target URL {2} by Bundle resolution rules +BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = Entry {0} matches the reference {1} by type and id but it''s fullUrl {2} does not match the full target URL {3} by Bundle resolution rules +BUNDLE_ENTRY_URL_ABSOLUTE = The fullUrl must be an absolute URL (not ''{0}'') +BUNDLE_ENTRY_URL_MATCHES_NO_ID = The fullUrl ''{0}'' looks like a RESTful server URL, but the resource has no id +BUNDLE_ENTRY_URL_MATCHES_TYPE_ID = The fullUrl ''{0}'' looks like a RESTful server URL, so it must end with the correct type and id (/{1}/{2}) +BUNDLE_LINK_SEARCH_NO_DUPLICATES = The link relationship type ''{0}'' can only occur once +BUNDLE_LINK_SEARCH_PROHIBITED = The link relationship type ''{0}'' used in search sets is prohibited in this context +BUNDLE_LINK_STYELSHEET_EXTERNAL = External Stylesheets other than https://hl7.org/fhir/fhir.css SHOULD not be used +BUNDLE_LINK_STYELSHEET_INSECURE = The stylesheet reference is not secure +BUNDLE_LINK_STYELSHEET_LINKABLE = The stylesheet reference is not a resolvable link +BUNDLE_LINK_STYELSHEET_NOT_FOUND = The stylesheet reference could not be resolved in this bundle +BUNDLE_LINK_UNKNOWN = The link relationship type ''{0}'' is unknown and not allowed in this context +BUNDLE_POSSSIBLE_MATCHES = The bundle contains no match for {1} by the rules of Bundle reference resolution, but it has multiple resources that match {0} by resource type and id +BUNDLE_RULE_INVALID_INDEX = Bundle Rules index is invalid ({0}) +BUNDLE_RULE_NONE = No Rule +BUNDLE_RULE_PROFILE_UNKNOWN = Bundle Rules profile {1} is unknown for {0} +BUNDLE_RULE_UNKNOWN = Bundle Rule refers to invalid resource {0} +BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entries must have resources +BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Search results must have ids +BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Unable to determine if this resource is a valid resource type for this search +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = This is not a matching resource type for the specified search ({0} expecting {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = This is not a matching resource type for the specified search (is a search mode needed?) ({0} expecting {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = This is not an OperationOutcome ({0}) +BUNDLE_SEARCH_NOSELF = SearchSet Bundles should have a self link that specifies what the search was +BUNDLE_SEARCH_NO_MODE = SearchSet bundles should have search modes on the entries +BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = No types could be determined from the search string, so the types can''t be checked +Bad_file_path_error = ** Error: The file name you passed in, ''{0}'', doesn''t exist on the local filesystem. Please verify that this is valid file location ** +Base__Derived_profiles_have_different_types____vs___ = Base & Derived profiles have different types ({0} = {1} vs {2} = {3}) +Base_profile__has_no_type = Base profile {0} has no type Bundle_BUNDLE_Entry_Canonical = The canonical URL ({0}) cannot match the fullUrl ({1}) unless on the canonical server itself Bundle_BUNDLE_Entry_Document = The first entry in a document must be a composition Bundle_BUNDLE_Entry_IdUrlMismatch = Resource ID does not match the ID in the entry fullUrl (''{0}'' vs ''{1}'') Bundle_BUNDLE_Entry_MismatchIdUrl = The canonical URL ({0}) cannot match the fullUrl ({1}) unless the resource id ({2}) also matches +Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = Specified logical model {1} not found for resource ''Binary/{0}'' Bundle_BUNDLE_Entry_NoFirst = Documents or Messages must contain at least one entry Bundle_BUNDLE_Entry_NoFirstResource = No resource on first entry Bundle_BUNDLE_Entry_NoFullUrl = Bundle entry missing fullUrl -BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry -Bundle_BUNDLE_Entry_NoProfile_TYPE = No profile found for {0} resource of type ''{1}'' Bundle_BUNDLE_Entry_NoProfile_EXPL = Specified profile {2} not found for {0} resource of type ''{0}'' -Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = Specified logical model {1} not found for resource ''Binary/{0}'' -Bundle_BUNDLE_Entry_NotFound = Can''t find ''{0}'' in the bundle ({1}) -BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE = Found {0} matches for ''{1}'' in the bundle ({2}) -BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_one = Can''t find ''{1}'' in the bundle ({2}). Note that there is a resource in the bundle with the same type and id, but it does not match because of the fullUrl based rules around matching relative references (must be ``{3}``) -BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_other = Can''t find ''{1}'' in the bundle ({2}). Note that there are {0} resources in the bundle with the same type and id, but they do not match because of the fullUrl based rules around matching relative references (one of ``{3}``) -Bundle_BUNDLE_Entry_Orphan_MESSAGE = Entry {0} isn''t reachable by traversing links (forward or backward) from the MessageHeader, so its presence should be reviewed (is it needed to process the message?) +Bundle_BUNDLE_Entry_NoProfile_TYPE = No profile found for {0} resource of type ''{1}'' Bundle_BUNDLE_Entry_Orphan_DOCUMENT = Entry {0} isn''t reachable by traversing links (forward or backward) from the Composition -BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = Entry {0} isn''t reachable by traversing forwards from the Composition. Only Provenance is approved to be used this way (R4 section 3.3.1) -BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = Entry {0} isn''t reachable by traversing forwards from the Composition. Check whether this should be linked directly from the composition if it''s a source of narrative content -BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = Entry {0} isn''t reachable by traversing forwards from the MessageHeader. Check that this is meant to be included (needed to process the message) +Bundle_BUNDLE_Entry_Orphan_MESSAGE = Entry {0} isn''t reachable by traversing links (forward or backward) from the MessageHeader, so its presence should be reviewed (is it needed to process the message?) Bundle_BUNDLE_Entry_Type = The type ''{0}'' is not valid - no resources allowed here (allowed = {1}) Bundle_BUNDLE_Entry_Type2 = The type ''{0}'' is not valid - must be {1} (allowed = {2}) Bundle_BUNDLE_Entry_Type3_one = The type ''{1}'' is not valid - must be of type {2} @@ -28,18 +76,159 @@ Bundle_BUNDLE_FullUrl_Missing = Relative Reference appears inside Bundle whose e Bundle_BUNDLE_FullUrl_NeedVersion = Entries matching fullURL {0} should declare meta/versionId because there are version-specific references Bundle_BUNDLE_MultipleMatches = Multiple matches in bundle for reference {0} Bundle_BUNDLE_Not_Local = URN reference is not locally contained within the bundle {0} -Bundle_MSG_Event_Count = Expected {0} but found {1} event elements Bundle_Document_Date_Missing = A document must have a date (Bundle.timestamp) Bundle_Document_Date_Missing_html = [(type = ''document'') implies (meta.lastUpdated.hasValue())] +Bundle_MSG_Event_Count = Expected {0} but found {1} event elements +CDATA_is_not_allowed = CDATA is not allowed +CDA_UNKNOWN_TEMPLATE = The CDA Template {0} is not known +CDA_UNKNOWN_TEMPLATE_EXT = The CDA Template {0} / {1} is not known +CODESYSTEM_CS_COUNT_COMPLETE_WRONG = The code system is complete, but the number of concepts ({0}) does not match the stated total number ({1}) +CODESYSTEM_CS_COUNT_FRAGMENT_WRONG = The code system is a fragment/example, but the number of concepts ({0}) exceeds or matches the stated total number ({1}) +CODESYSTEM_CS_COUNT_NOTPRESENT_ZERO = The code system has no content, but the exceeds the stated total number is 0 concepts - check that this isn''t a complete code system that has no concepts, or update/remove the stated count +CODESYSTEM_CS_COUNT_NO_CONTENT_ALLOWED = The code system says it has no content present, but concepts are found +CODESYSTEM_CS_COUNT_SUPPLEMENT_WRONG = The code system supplement states the total number of concepts as {1}, but this is different to the underlying code system that states a value of {0} +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7 Defined CodeSystems SHALL have a stated value for the {0} element so that users know the status and meaning of the code system clearly +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7 Defined CodeSystems SHOULD have a stated value for the {0} element so that users know the status and meaning of the code system clearly +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystems SHOULD NOT have a stated value for the {0} element when they are a supplement +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = CodeSystem Supplements with a content value of ''supplement'' SHALL have a supplements element that specifies which code system is being supplemented +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = CodeSystem Supplements SHALL have a content value of ''supplement'' +CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystems SHOULD have a stated value for the {0} element so that users know the status and meaning of the code system clearly +CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} is a supplement, so can''t be used as a value in Coding.system +CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Review the All Codes Value Set - incomplete CodeSystems generally should not have an all codes value set specified +CODESYSTEM_CS_NO_VS_SUPPLEMENT1 = CodeSystems supplements should not have an all codes value set specified, and if they do, it must match the base code system +CODESYSTEM_CS_NO_VS_SUPPLEMENT2 = CodeSystems supplements should not have an all codes value set specified, and if they do, it must match the base code system, and this one does not (''{0}'') +CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} cannot be found, so can''t check if concepts are valid +CODESYSTEM_CS_SUPP_INVALID_CODE = The code ''{1}'' is not declared in the base CodeSystem {0} so is not valid in the supplement +CODESYSTEM_CS_SUPP_NO_SUPP = The code system is marked as a supplement, but it does not define what code system it supplements +CODESYSTEM_CS_UNK_EXPANSION = The code provided ({2}) is not in the expansion in the value set {0}, and a code is required from this value set. The system {1} could not be found. +CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0} has an ''all system'' value set of {1}, but it is an expansion with the wrong number of concepts (found {2}, expected {3}) +CODESYSTEM_DESIGNATION_DISP_CLASH_LANG = The designation ''{0}'' has no use and is in the same language (''{2}''), so is not differentiated from the base display (''{1}'') +CODESYSTEM_DESIGNATION_DISP_CLASH_NO_LANG = The designation ''{0}'' has no use and no language, so is not differentiated from the base display (''{1}'') +CODESYSTEM_NOT_CONTAINED = CodeSystems are referred to directly from Coding.system, so it''s generally best for them not to be contained resources +CODESYSTEM_PROPERTY_BAD_HL7_URI = Unknown CodeSystem Property ''{0}''. If you are creating your own property, do not create it in the HL7 namespace +CODESYSTEM_PROPERTY_CODE_TYPE_MISMATCH = Wrong type ''{2}'': The code ''{0}'' identifies a property that has the type ''{1}'' +CODESYSTEM_PROPERTY_CODE_WARNING = If the type is ''code'', then the valueSet property should be provided to clarify what kind of code will be found in the element +CODESYSTEM_PROPERTY_DUPLICATE_CODE = A property is already defined with the code ''{0}'' +CODESYSTEM_PROPERTY_DUPLICATE_URI = A property is already defined with the URI ''{0}'' +CODESYSTEM_PROPERTY_KNOWN_CODE_SUGGESTIVE = This property has only the standard code (''{0}'') but not the standard URI ''{1}'', so it has no clearly defined meaning in the terminology ecosystem +CODESYSTEM_PROPERTY_NO_VALUE = The property ''{0}'' has no value, and cannot be understood +CODESYSTEM_PROPERTY_SYNONYM_CHECK = The synonym ''{0}'' is not also defined in the code system. The Synonym property should only used to declare equivalence to other existing codes +CODESYSTEM_PROPERTY_UNDEFINED = The property ''{0}'' has no definition in CodeSystem.property. Many terminology tools won''t know what to do with it +CODESYSTEM_PROPERTY_UNKNOWN_CODE = This property has only a code (''{0}'') and not a URI, so it has no clearly defined meaning in the terminology ecosystem +CODESYSTEM_PROPERTY_URI_CODE_MISMATCH = The URI ''{0}'' is normally assigned the code ''{1}''. Using the code ''{2}'' will usually create confusion in ValueSet filters etc +CODESYSTEM_PROPERTY_URI_TYPE_MISMATCH = Wrong type ''{2}'': The URI ''{0}'' identifies a property that has the type ''{1}'' +CODESYSTEM_PROPERTY_WRONG_TYPE = The property ''{0}'' has the invalid type ''{1}'', when it is defined to have the type ''{2}'' +CODESYSTEM_SHAREABLE_EXTRA_MISSING = Published code systems SHOULD conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} should be present, but it is not +CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = Code systems published by HL7 SHALL conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} should be present, but it is not +CODESYSTEM_SHAREABLE_MISSING = Published code systems SHOULD conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} is mandatory, but it is not present +CODESYSTEM_SHAREABLE_MISSING_HL7 = Code systems published by HL7 SHALL conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} is mandatory, but it is not present +CODESYSTEM_SUPP_NO_DISPLAY = This display (''{0}'') differs from that defined by the base code system (''{1}''). Both displays claim to be the ''primary designation'' for the same language (''{2}''), and the correct interpretation of this is undefined +CODESYSTEM_THO_CHECK = Most code systems defined in HL7 IGs will need to move to THO later during the process. Consider giving this code system a THO URL now (See https://confluence.hl7.org/display/TSMG/Terminology+Play+Book, and/or talk to TSMG) +CODE_CASE_DIFFERENCE = The code ''{0}'' differs from the correct code ''{1}'' by case. Although the code system ''{2}'' is case insensitive, implementers are strongly encouraged to use the correct case anyway +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = The source code ''{0}'' is not valid in the code system {1} +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS = The source code ''{0}'' is not valid in the value set {1} +CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = The source display ''{0}'' for the code ''{2}'' is not valid. Possible displays: {1} +CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Source Code System {0} doesn''t have all content (content = {1}), so the source codes cannot be checked +CONCEPTMAP_GROUP_SOURCE_MISSING = No Source Code System, so the source codes cannot be checked +CONCEPTMAP_GROUP_SOURCE_SERVER_SIDE = Source Code System {0} is only supported on the terminology server, so the source codes are not validated for performance reasons +CONCEPTMAP_GROUP_SOURCE_UNKNOWN = The Source Code System {0} is not fully defined and populated, and no sourceScope is specified, so the source code checking will not be performed +CONCEPTMAP_GROUP_TARGET_CODE_INVALID = The target code ''{0}'' is not valid in the code system {1} +CONCEPTMAP_GROUP_TARGET_CODE_INVALID_VS = The target code ''{0}'' is not valid in the value set {1} +CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = The target display ''{0}'' for the code ''{2}'' is not valid. Possible displays: {1} +CONCEPTMAP_GROUP_TARGET_INCOMPLETE = Target Code System {0} doesn''t have all content (content = {1}), so the target codes cannot be checked +CONCEPTMAP_GROUP_TARGET_MISSING = No Target Code System, so the target codes cannot be checked +CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = The code {0} is invalid in the system {1} +CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = The property code ''{0}'' is not known +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = The type of this property should be {1} not {0} +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = Since no system has been provided, a plain code cannot be used +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = The code system {0} could not be found, so code values can''t be checked +CONCEPTMAP_GROUP_TARGET_SERVER_SIDE = Target Code System {0} is only supported on the terminology server, so the target codes are not validated for performance reasons +CONCEPTMAP_GROUP_TARGET_UNKNOWN = The Target Code System {0} is not fully defined and populated, and no targetScope is specified, so the target code checking will not be performed +CONCEPTMAP_SHAREABLE_EXTRA_MISSING = Published concept maps SHOULD conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} should be present, but it is not +CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = Concept maps published by HL7 SHALL conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} should be present, but it is not +CONCEPTMAP_SHAREABLE_MISSING = Published concept maps SHOULD conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} is mandatory, but it is not present +CONCEPTMAP_SHAREABLE_MISSING_HL7 = Concept maps published by HL7 SHALL conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} is mandatory, but it is not present +CONCEPTMAP_VS_INVALID_CONCEPT_CODE = The code ''{1}'' in the system {0} is not valid in the value set ''{2}'' +CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = The code ''{2}'' in the system {0} version {1} is not valid in the value set ''{3}'' +CONCEPTMAP_VS_TOO_MANY_CODES = The concept map has too many codes to validate ({0}) +CONTAINED_ORPHAN_DOM3 = The contained resource ''{0}'' is not referenced to from elsewhere in the containing resource nor does it refer to the containing resource (dom-3) +CS_SCT_IPS_NOT_IPS = The Snomed CT code {0} ({1}) is not a member of the IPS free set +Can_only_specify_profile_in_the_context = Can only specify profile in the context +Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Can''t have children on an element with a polymorphic type - you must slice and constrain the types first (sortElements: {0}:{1}) CapabalityStatement_CS_SP_WrongType = Type mismatch - SearchParameter ''{0}'' type is {1}, but type here is {2} +Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Circular snapshot references detected; cannot generate snapshot (stack = {0}) CodeSystem_CS_VS_IncludeDetails = CodeSystem {0} has an ''all system'' value set of {1}, but the include has extra details CodeSystem_CS_VS_Invalid = CodeSystem {0} has an ''all system'' value set of {1}, but the value set doesn''t have a single include -CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0} has an ''all system'' value set of {1}, but it is an expansion with the wrong number of concepts (found {2}, expected {3}) CodeSystem_CS_VS_WrongSystem = CodeSystem {0} has an ''all system'' value set of {1}, but the value set doesn''t have a matching system ({2}) +Code_found_in_expansion_however_ = Code found in expansion, however: {0} +Coding_has_no_system__cannot_validate = Coding has no system. A code with no system has no defined meaning, and it cannot be validated. A system should be provided +Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Contained resource does not appear to be a FHIR resource (unknown name ''{0}'') +Could_not_match_discriminator_for_slice_in_profile_one = Could not match discriminator ({0}) for slice {1} in profile {2} - the discriminator {3} does not have fixed value, binding or existence assertions +Could_not_match_discriminator_for_slice_in_profile_other = Could not match any discriminators ({1}) for slice {2} in profile {3} - None of the {0} discriminators {4} have fixed value, binding or existence assertions +DISCRIMINATOR_BAD_PATH = Error processing path expression for discriminator: {0} (src = ''{1}'') +DUPLICATE_ID = Duplicate id value ''{0}'' +DUPLICATE_JSON_PROPERTY_KEY = The JSON property ''{0}'' is a duplicate and will be ignored +Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited versions have exact match for delimiter ''{0}'' : {1} vs {2} +Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Derived profile {0} has no derivation value and so can''t be processed +Derived_profile__has_no_type = Derived profile {0} has no type +Details_for__matching_against_Profile_ = Details for {0} matching against profile {1} +Did_not_find_single_slice_ = Did not find single slice: {0} +Did_not_find_type_root_ = Did not find type root: {0} +Differential_does_not_have_a_slice__b_of_____in_profile_ = Differential in profile {5} does not have a slice at {6} (on {0}, position {1} of {2} / {3} / {4}) +Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential walks into ''{0} (@ {1})'', but the base does not, and there is not a single fixed type. The type is {2}. This is not handled yet +Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = Discriminator ({0}) is based on element existence, but slice {1} neither sets min>=1 or max=0 +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one = +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = Discriminator ({1}) is based on type, but slice {2} in {3} has {0} types: {4} +Discriminator__is_based_on_type_but_slice__in__has_no_types = Discriminator ({0}) is based on type, but slice {1} in {2} has no types +Display_Name_WS_for__should_be_one_of__instead_of_one = Wrong whitespace in Display Name ''{4}'' for {1}#{2}. Valid display is {3} (for the language(s) ''{5}'') +Display_Name_WS_for__should_be_one_of__instead_of_other = Wrong whitespace in Display Name ''{4}'' for {1}#{2}. Valid display is one of {0} choices: {3} (for the language(s) ''{5}'') +Display_Name_for__should_be_one_of__instead_of_one = Wrong Display Name ''{4}'' for {1}#{2}. Valid display is {3} (for the language(s) ''{5}'') +Display_Name_for__should_be_one_of__instead_of_other = Wrong Display Name ''{4}'' for {1}#{2}. Valid display is one of {0} choices: {3} (for the language(s) ''{5}'') +Does_not_match_slice_ = Does not match slice ''{0}'' (discriminator: {1}) +Duplicate_Resource_ = Duplicate Resource {0} of type {3} (existing version {2}, new version {1}) +ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'': {1} +ED_INVARIANT_DIFF_NO_SOURCE = The invariant {0} defined in the differential must have no source, or the source must be the same as the profile +ED_INVARIANT_EXPRESSION_CONFLICT = The constraint ''{0}'' has an expression ''{1}'', which differs from the earlier expression provided of ''{2}'' (invariants are allowed to repeat, but cannot differ) +ED_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'' with expression ''{1}'': {2} +ED_INVARIANT_KEY_ALREADY_USED = The constraint key ''{0}'' already exists in the base profile ''{1}'' +ED_INVARIANT_NO_EXPRESSION = The constraint ''{0}'' has no computable expression, so validators will not be able to check it +ED_INVARIANT_NO_KEY = The constraint has no key, so the content cannot be validated +ED_PATH_WRONG_TYPE_MATCH = The path must be ''{0}'' not ''{1}'' when the type list is not constrained +ED_SEARCH_EXPRESSION_ERROR = Error in search expression ''{0}'': {1} +ELEMENT_CANNOT_BE_NULL = The element is not allowed to be ''null'' +ERROR_GENERATING_SNAPSHOT = Error generating Snapshot: {0} (this usually arises from a problem in the differential) EXTENSION_CONTEXT_UNABLE_TO_CHECK_PROFILE = The extension {0} specifies a context of {1} but the validator cannot check whether the profile is valid or not at this time EXTENSION_CONTEXT_UNABLE_TO_FIND_PROFILE = The extension {0} specifies a context of {1} but the validator cannot find that profile -Extension_EXTP_Context_Wrong = The extension {0} is not allowed to be used at this point (allowed = {1}; this element is {2}) +EXTENSION_EXTM_CONTEXT_WRONG_XVER = The modifier extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) +EXTENSION_EXTP_CONTEXT_WRONG_XVER = The extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) +EXT_VER_URL_IGNORE = Extension URLs don''t have versions. The validator has ignored the version and processed the extension anyway +EXT_VER_URL_MISLEADING = The extension URL contains a ''|'' which makes it look like a versioned URL, but it''s not, and this is confusing for implementers +EXT_VER_URL_NOT_ALLOWED = The extension URL must not contain a version +EXT_VER_URL_NO_MATCH = Extension URLs don''t have versions. The validator wasn''t able to resolve this URL with or without version-based resolution +EXT_VER_URL_REVERSION = The extension URL must not contain a version. The extension was validated against version {0} of the extension +Element_must_have_some_content = Element must have some content +Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Error at {0}#{1}: The target profile {2} is not a valid constraint on the base ({3}) +Error_at_path__Slice_for_type__has_more_than_one_type_ = Error at path {0}: Slice for type ''{1}'' has more than one type ''{2}'' +Error_at_path__Slice_for_type__has_wrong_type_ = Error at path {0}: Slice for type ''{1}'' has wrong type ''{2}'' +Error_at_path__Slice_name_must_be__but_is_ = Error at path {0}: Slice name must be ''{1}'' but is ''{2}'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Error at path {0} in {1}: Type slicing with slicing.discriminator.count() > 1 +Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Error at path {0} in {1}: Type slicing with slicing.discriminator.path != ''$this'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Error at path {0} in {1}: Type slicing with slicing.discriminator.type != ''type'' +Error_at_path__in__Type_slicing_with_slicingordered__true = Error at path {0} in {1}: Type slicing with slicing.ordered = true +Error_expanding_ValueSet_running_without_terminology_services = Error expanding ValueSet: running without terminology services +Error_generating_table_for_profile__ = Error generating table for profile {0}: {1} +Error_in_profile__at__Base_isSummary___derived_isSummary__ = Error in profile {0} at {1}: Base isSummary = {2}, derived isSummary = {3} +Error_parsing_ = Error parsing {0}:{1} +Error_parsing_JSON_ = Error parsing JSON: {0} +Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Error parsing JSON: the primitive value must be a boolean +Error_parsing_JSON_the_primitive_value_must_be_a_number = Error parsing JSON: the primitive value must be a number +Error_parsing_JSON_the_primitive_value_must_be_a_string = Error parsing JSON: the primitive value must be a string +Error_parsing_Turtle_ = Error parsing Turtle: {0} +Error_parsing_XHTML_ = Error parsing XHTML: {0} +Error_reading__from_package__ = Error reading {0} from package {1}#{2}: {3} +Error_validating_code_running_without_terminology_services = Unable to validate code ''{0}'' in system ''{1}'' because the validator is running without terminology services Extension_EXTM_Context_Wrong = The modifier extension {0} is not allowed to be used at this point (allowed = {1}; this element is {2}) +Extension_EXTP_Context_Wrong = The extension {0} is not allowed to be used at this point (allowed = {1}; this element is {2}) Extension_EXT_Count_Mismatch = Extensions count mismatch: expected {0} but found {1} Extension_EXT_Count_NotFound = Extension count mismatch: unable to find extension: {0} Extension_EXT_Fixed_Banned = No extensions allowed, as the specified fixed value doesn''t contain any extensions @@ -54,31 +243,268 @@ Extension_EXT_Type = The Extension ''{0}'' definition allows for the types {1} b Extension_EXT_URL_Absolute = Extension.url must be an absolute URL Extension_EXT_Unknown = Unknown extension {0} Extension_EXT_Unknown_NotHere = The extension {0} could not be found so is not allowed here -Extension_EXT_Url_NotFound = Extension.url is required +Extension_EXT_Url_NotFound = Extension.url is required in order to identify, use and validate the extension Extension_EXT_Version_Internal = Extension url ''{0}'' evaluation state invalid Extension_EXT_Version_Invalid = Extension url ''{0}'' is not valid (invalid Version ''{1}'') Extension_EXT_Version_InvalidId = Extension url ''{0}'' is not valid (invalid Element id ''{1}'') Extension_EXT_Version_NoChange = Extension url ''{0}'' is not valid (Element id ''{1}'' is valid, but cannot be used in a cross-version paradigm because there has been no changes across the relevant versions) +Extension_PROF_Type = The Profile ''{0}'' definition allows for the type {1} but found type {2} +FHIRPATH_ARITHMETIC_MINUS = Error in date arithmetic: Unable to subtract type {0} to {1} +FHIRPATH_ARITHMETIC_PLUS = Error in date arithmetic: Unable to add type {0} to {1} +FHIRPATH_ARITHMETIC_QTY = Error in date arithmetic: attempt to add a definite quantity duration time unit {0} +FHIRPATH_ARITHMETIC_UNIT = Error in date arithmetic: unrecognized time unit {0} +FHIRPATH_AS_COLLECTION = Attempt to use ''as()'' on more than one item (''{0}'', ''{1}'') +FHIRPATH_CANNOT_USE = Error evaluating FHIRPath expression: Cannot use {0} in this context because {1} +FHIRPATH_CANT_COMPARE = Error evaluating FHIRPath expression: Unable to compare values of type {0} and {1} +FHIRPATH_CHECK_FAILED = Error evaluating FHIRPath expression: The check {0} failed +FHIRPATH_CHOICE_NO_TYPE_SPECIFIER = The expression ''{0}'' refers to an element that is a choice, but doesn''t have an .ofType() so that SQL view runners can pre-determine the full element name +FHIRPATH_CHOICE_SPURIOUS_TYPE_SPECIFIER = The expression ''{0}'' refers to an element that is not a choice, but has an .ofType(). SQL view runners are likely to pre-determine an incorrect full element name +FHIRPATH_CODED_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered string, code, uri, Coding, CodeableConcept but found {1} +FHIRPATH_COLLECTION_STATUS_CONTEXT = The context is inherently a collection, and so the expression ''{0}'' may fail, create an error, or return false if there is more than one item in the context ({2}) +FHIRPATH_COLLECTION_STATUS_OPERATION_LEFT = The left side is inherently a collection, and so the expression ''{0}'' may fail or return false if there is more than one item in the content being evaluated +FHIRPATH_COLLECTION_STATUS_OPERATION_RIGHT = The right side is inherently a collection, and so this expression ''{0}'' may fail or return false if there is more than one item in the content being evaluated +FHIRPATH_COLLECTION_STATUS_PARAMETER = Parameter {1} is inherently a collection, and so the expression ''{0}'' may fail, create an error, or return false if there is more than one item in the parameter value ({2}) +FHIRPATH_CONTINUOUS_ONLY= Error evaluating FHIRPath expression: The function {0} can only be used on a decimal or date type but found {1} +FHIRPATH_DECIMAL_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on a decimal but found {1} +FHIRPATH_DISCRIMINATOR_BAD_NAME = Invalid function name {0}() in discriminator +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = Invalid expression syntax in discriminator (const) +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = Invalid expression syntax in discriminator (group ''{0}'') +FHIRPATH_DISCRIMINATOR_CANT_FIND = Unable to resolve discriminator in definitions: {0} in profile {1} on element {2}, looking in profile {3} +FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Unable to resolve discriminator {0} on {2} found in the definitions because the extension {1} wasn''t found in the profile {3} +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_one = +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Error in discriminator at {1}: no children, {0} type profiles +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_one = +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Error in discriminator at {1}: no children, {0} types +FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Error in discriminator at {0}: found a sliced element while resolving the fixed value for one of the slices +FHIRPATH_DISCRIMINATOR_NOTYPE = Error in discriminator at {0}: no children, no type +FHIRPATH_DISCRIMINATOR_NO_CODE = Invalid use of ofType() in discriminator - Type has no code on {0} +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_one = +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = Invalid use of resolve() in discriminator - {0} possible types on {1} (can only be one) +FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Invalid use of resolve() in discriminator - type on {0} is not Reference {1} +FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = Invalid use of resolve() in discriminator - no type on element {0} +FHIRPATH_DISCRIMINATOR_TYPE_NONE = Invalid use of ofType() in discriminator - no type on element {0} +FHIRPATH_FOCUS_one = +FHIRPATH_FOCUS_other = Error evaluating FHIRPath expression: focus for {0} can only have one value, but has {0} values +FHIRPATH_HO_HOST_SERVICES = Internal Error evaluating FHIRPath expression: No host services are provided ({0}) +FHIRPATH_INVALID_TYPE = The type {0} is not valid +FHIRPATH_LEFT_VALUE_WRONG_TYPE = Error evaluating FHIRPath expression: left operand to {0} has the wrong type {1} +FHIRPATH_LEFT_VALUE_one = +FHIRPATH_LEFT_VALUE_other = Error evaluating FHIRPath expression: left operand to {1} can only have 1 value, but has {0} values +FHIRPATH_LOCATION = (at {0}) +FHIRPATH_NOT_A_COLLECTION = Found a use of a collection operator on something that is not a collection at ''{0}'' - check that there''s no mistakes in the expression syntax +FHIRPATH_NOT_IMPLEMENTED = Error evaluating FHIRPath expression: The function {0} is not implemented +FHIRPATH_NO_COLLECTION = Error evaluating FHIRPath expression: The function {0} can only be used on a singleton value but found {1} +FHIRPATH_NO_TYPE = Error evaluating FHIRPath expression: No type provided at {1} +FHIRPATH_NUMERICAL_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on integer, decimal or Quantity but found {1} +FHIRPATH_OFTYPE_IMPOSSIBLE = The type specified in ofType() is {1} which is not a possible candidate for the existing types ({0}) in the expression {2}. Check the paths and types to be sure this is what is intended +FHIRPATH_OP_INCOMPATIBLE = Error evaluating FHIRPath expression {0}: left and right operand have incompatible or invalid types ({1}, {2}) +FHIRPATH_ORDERED_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered collections +FHIRPATH_PARAM_WRONG = Error evaluating FHIRPath expression: The expression type {0} is not supported for parameter {1} on function {2} +FHIRPATH_PRIMITIVE_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on primitives +FHIRPATH_REDEFINE_VARIABLE = The variable ''{0}'' cannot be redefined +FHIRPATH_REFERENCE_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered string, uri, canonical or Reference but found {1} +FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Problem with use of resolve() - profile {0} on {1} could not be resolved +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_one = +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Invalid use of resolve() in discriminator - {0} possible target type profiles on {1} (can only be one) +FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Error evaluating FHIRPath expression: right operand to {0} has the wrong type {1} +FHIRPATH_RIGHT_VALUE_one = +FHIRPATH_RIGHT_VALUE_other = Error evaluating FHIRPath expression: right operand to {1} can only have 1 value, but has {0} values +FHIRPATH_STRING_ORD_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered collection of string, uri, code, id but found {1} +FHIRPATH_STRING_SING_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on string, uri, url, code, id but found {1} +FHIRPATH_UNABLE_BOOLEAN = Unable to evaluate as a boolean: {0} +FHIRPATH_UNKNOWN_CONSTANT = Error evaluating FHIRPath expression: Invalid FHIR Constant {0} +FHIRPATH_UNKNOWN_CONTEXT = Unknown context evaluating FHIRPath expression: {0} +FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Unknown context element evaluating FHIRPath expression: {0} +FHIRPATH_UNKNOWN_EXTENSION = Reference to an unknown extension - double check that the URL ''{0}'' is correct +FHIRPATH_UNKNOWN_NAME = Error evaluating FHIRPath expression: The name ''{0}'' is not valid for any of the possible types: {1} +FHIRPATH_UNKNOWN_TYPE = Error evaluating FHIRPath expression: The type ''{0}'' is unknown or not supported at {1} +FHIRPATH_WRONG_PARAM_TYPE = Error evaluating FHIRPath expression: The parameter type {2} is not legal for {0} parameter {1}. expecting {3} Fixed_Type_Checks_DT_Address_Line = Expected {0} but found {1} line elements Fixed_Type_Checks_DT_Name_Family = Expected {0} but found {1} family elements Fixed_Type_Checks_DT_Name_Given = Expected {0} but found {1} given elements Fixed_Type_Checks_DT_Name_Prefix = Expected {0} but found {1} prefix elements Fixed_Type_Checks_DT_Name_Suffix = Expected {0} but found {1} suffix elements +Found__items_for__resolving_discriminator__from_ = Found {0} items for {1} resolving discriminator {2} from {3} +ILLEGAL_COMMENT_TYPE = The fhir_comments property must be an array of strings +ILLEGAL_PROPERTY = The property ''{0}'' is invalid +INV_FAILED = Constraint failed: {0} +INV_FAILED_SOURCE = Constraint failed: {0} (defined in {1}) +Illegal_path__in_differential_in__illegal_character_ = Invalid path ''{0}'' in differential in {1}: invalid character ''{2}'' +Illegal_path__in_differential_in__illegal_characters_ = Invalid path ''{0}'' in differential in {1}: invalid characters [] +Illegal_path__in_differential_in__must_start_with_ = Invalid path ''{0}'' in input differential in {1}: must start with {2}.{3} +Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Invalid path ''{0}'' in differential in {1}: name portion exceeds 64 chars in length +Illegal_path__in_differential_in__name_portion_mising_ = Invalid path ''{0}'' in differential in {1}: name portion missing (''..'') +Illegal_path__in_differential_in__no_unicode_whitespace = Invalid path ''{0}'' in differential in {1}: no unicode whitespace Internal_INT_Bad_Type = Unhandled fixed value type {0} -Language_XHTML_Lang_Different1 = Resource has a language ({0}), and the XHTML has a lang ({1}), but they differ -Language_XHTML_Lang_Different2 = Resource has a language ({0}), and the XHTML has an xml:lang ({1}), but they differ -Language_XHTML_Lang_Missing1 = Resource has a language, but the XHTML does not have an lang or an xml:lang tag (needs both - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing2 = Resource has a language, but the XHTML does not have a lang tag (needs both lang and xml:lang - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing3 = Resource has a language, but the XHTML does not have an xml:lang tag (needs both lang and xml:lang - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Internal_error___type_not_known_ = Internal error - type not known {0} +Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Invalid slicing: there is more than one type slice at {0}, but one of them ({1}) has min = 1, so the other slices cannot exist +JSON_COMMA_EXTRA = There is an extra comma at the end of the {0} in the JSON +JSON_COMMA_MISSING = A Comma is missing in the JSON +JSON_COMMENTS_NOT_ALLOWED = Comments are not allowed in JSON +JSON_PROPERTY_NO_QUOTES = The JSON property ''{0}'' has no quotes around the name of the property +JSON_PROPERTY_VALUE_NO_QUOTES = The JSON property ''{0}'' has no quotes around the value of the property ''{1}'' +LIQUID_SYNTAX_COLON = Exception evaluating {0}: limit is not followed by '':'' +LIQUID_SYNTAX_EXPECTING = Script {0}: Found ''{1}'' expecting ''{2}'' parsing cycle +LIQUID_SYNTAX_INCLUDE = Script {0}: Error reading include: {1} +LIQUID_SYNTAX_LOOP = Script {0}: Error reading loop: {1} +LIQUID_SYNTAX_NOTERM = Script {0}: Unterminated Liquid statement {1} +LIQUID_SYNTAX_NUMBER = Exception evaluating {0}: limit is not followed by a number +LIQUID_SYNTAX_UNEXPECTED = Exception evaluating {0}: unexpected content at {1} +LIQUID_SYNTAX_UNTERMINATED = Script {0}: Found unterminated string parsing cycle +LIQUID_UNKNOWN_FILTER = Unknown Liquid filter ''{0}'' +LIQUID_UNKNOWN_FLOW_STMT = Script {0}: Unknown flow control statement ''{1}'' +LIQUID_UNKNOWN_NOEND = Script {0}: Found end of script looking for {1} +LIQUID_UNKNOWN_SYNTAX = Unexpected syntax parsing liquid statement +LIQUID_VARIABLE_ALREADY_ASSIGNED = Liquid Exception: The variable ''{0}'' already has an assigned value +LIQUID_VARIABLE_ILLEGAL = Liquid Exception: The variable name ''{0}'' cannot be used +LOGICAL_MODEL_NAME_MISMATCH = The name ''{0}'' does not match the expected name ''{1}'' +LOGICAL_MODEL_QNAME_MISMATCH = The QName ''{0}'' does not match the expected QName ''{1}'' +Language_XHTML_Lang_Different1 = Resource has a language ({0}), and the XHTML has a lang ({1}), but they differ +Language_XHTML_Lang_Different2 = Resource has a language ({0}), and the XHTML has an xml:lang ({1}), but they differ +Language_XHTML_Lang_Missing1 = Resource has a language, but the XHTML does not have an lang or an xml:lang tag (needs both - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing2 = Resource has a language, but the XHTML does not have a lang tag (needs both lang and xml:lang - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing3 = Resource has a language, but the XHTML does not have an xml:lang tag (needs both lang and xml:lang - see https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +MEASURE_MR_GRPST_POP_UNK_CODE = The code for this group stratifier has no match in the measure definition +MEASURE_MR_GRP_DUPL_CODE = The code for this group is duplicated with another group +MEASURE_MR_GRP_MISSING_BY_CODE = The MeasureReport does not include a group for the group ''{0}'' +MEASURE_MR_GRP_NO_CODE = Group should have a code that matches the group definition in the measure +MEASURE_MR_GRP_NO_USABLE_CODE = None of the codes provided are usable for comparison - need both system and code on at least one code +MEASURE_MR_GRP_NO_WRONG_CODE = The code provided ({0}) does not match the code specified in the measure report ({1}) +MEASURE_MR_GRP_POP_COUNT_MISMATCH = Mismatch between count {0} and number of subjects {1} +MEASURE_MR_GRP_POP_COUNT_CANT_CHECK = Unable to check the stated count {0} because the subject list cannot be fully processed ({1}) +MEASURE_MR_GRP_POP_COUNT_NO_REF = Subject reference has no actual reference +MEASURE_MR_GRP_POP_COUNT_UNRESOLVED = Subject reference {0} could not be resolved, and the apparent type is {1} which could not be processed +MEASURE_MR_GRP_POP_COUNT_NO_REF_RES = Subject reference {0} could not be resolved, and so could not be processed +MEASURE_MR_GRP_POP_COUNT_REF_UNPROCESSIBLE = Subject reference {0} resolved to a {1}, which could not be processed +MEASURE_MR_GRP_POP_DUPL_CODE = The code for this group population is duplicated with another group +MEASURE_MR_GRP_POP_NO_CODE = Group should have a code that matches the group population definition in the measure +MEASURE_MR_GRP_POP_NO_COUNT = Count should be present for reports where type is not ''subject-list'' +MEASURE_MR_GRP_POP_NO_SUBJECTS = Reports where type is not ''subject-list'' don''t have subjects listed +MEASURE_MR_GRP_POP_UNK_CODE = The code for this group population has no match in the measure definition +MEASURE_MR_GRP_UNK_CODE = The code for this group has no match in the measure definition +MEASURE_MR_M_SCORING_UNK = The scoring system in this measure is unknown, so the measureScore values cannot be checked +MEASURE_MR_SCORE_FIXED = This value is fixed by the Measure to ''{0}'' +MEASURE_MR_SCORE_PROHIBITED_MS = No measureScore when the scoring of the message is ''cohort'' +MEASURE_MR_SCORE_PROHIBITED_RT = No measureScore when the type of the report is ''data-collection'' +MEASURE_MR_SCORE_REQUIRED = A measureScore is required when the Measure.scoring={0} +MEASURE_MR_SCORE_UNIT_PROHIBITED = A measureScore for this Measure Scoring ({0}) should not have units +MEASURE_MR_SCORE_UNIT_REQUIRED = A unit should be present when the scoring type is {0} +MEASURE_MR_SCORE_VALUE_INVALID_01 = The value is invalid - it must be between 0 and 1 +MEASURE_MR_SCORE_VALUE_REQUIRED = A value is required when the Measure.scoring = {0} +MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Error in {0}: Compiled version of CQL is not valid +MEASURE_M_CRITERIA_CQL_ERROR = Error in {0}: ''{1}'' +MEASURE_M_CRITERIA_CQL_LIB_DUPL = Multiple matching libraries found for the namespace {0} +MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = No matching Library found for the namespace {0} +MEASURE_M_CRITERIA_CQL_NOT_FOUND = The function {1} does not exist in the library {0} +MEASURE_M_CRITERIA_CQL_NO_ELM = Error in {0}: No compiled version of CQL found +MEASURE_M_CRITERIA_CQL_NO_LIB = No CQL Libraries found on this Measure +MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = If the CQL expression does not include a namespace, there can only be one Library for the measure +MEASURE_M_CRITERIA_UNKNOWN = The expression language {0} is not supported, so can''t be validated +MEASURE_M_GROUP_CODE = Groups should have codes when there is more than one group +MEASURE_M_GROUP_POP = Measure Groups should have at least one population +MEASURE_M_GROUP_POP_NO_CODE = A measure group population should have a code when there is more than one population +MEASURE_M_GROUP_STRATA_COMP_NO_CODE = A measure group stratifier component should have a code when there is more than one population +MEASURE_M_GROUP_STRATA_NO_CODE = A measure group stratifier should have a code when there is more than one population +MEASURE_M_LIB_UNKNOWN = The Library {0} could not be resolved, so expression validation may not be correct +MEASURE_M_NO_GROUPS = A measure should contain at least one group +MEASURE_SHAREABLE_EXTRA_MISSING = Published measures SHOULD conform to the ShareableMeasure profile, which says that the element Measure.{0} should be present, but it is not +MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = Measures published by HL7 SHALL conform to the ShareableMeasure profile, which says that the element Measure.{0} should be present, but it is not +MEASURE_SHAREABLE_MISSING = Published measures SHOULD conform to the ShareableMeasure profile, which says that the element Measure.{0} is mandatory, but it is not present +MEASURE_SHAREABLE_MISSING_HL7 = Measures published by HL7 SHALL conform to the ShareableMeasure profile, which says that the element Measure.{0} is mandatory, but it is not present +MSG_DEPENDS_ON_DEPRECATED = The {0} {1} is deprecated +MSG_DEPENDS_ON_DRAFT = The {0} {1} is a draft resource +MSG_DEPENDS_ON_EXPERIMENTAL = The {0} {1} is an experimental resource +MSG_DEPENDS_ON_EXTENSION = extension +MSG_DEPENDS_ON_PROFILE = profile +MSG_DEPENDS_ON_RETIRED = The {0} {1} is retired +MSG_DEPENDS_ON_WITHDRAWN = The {0} {1} is withdrawn +MSG_DEPRECATED = Reference to deprecated {2} {0} +MSG_DEPRECATED_SRC = Reference to deprecated {2} {0} from {1} +MSG_DRAFT = Reference to draft {2} {0} +MSG_DRAFT_SRC = Reference to draft {2} {0} from {1} +MSG_EXPERIMENTAL = Reference to experimental {2} {0} +MSG_EXPERIMENTAL_SRC = Reference to experimental {2} {0} from {1} +MSG_RETIRED = Reference to retired {2} {0} +MSG_RETIRED_SRC = Reference to retired {2} {0} from {1} +MSG_WITHDRAWN = Reference to withdrawn {2} {0} +MSG_WITHDRAWN_SRC = Reference to withdrawn {2} {0} from {1} +MULTIPLE_LOGICAL_MODELS_one= +MULTIPLE_LOGICAL_MODELS_other={0} Logical Models found in supplied profiles, so unable to parse logical model (can only be one, found {1}) +Measure_MR_M_None = No Measure is identified, so no validation can be performed against the Measure +Measure_MR_M_NotFound = The Measure ''{0}'' could not be resolved, so no validation can be performed against the Measure Meta_RES_Security_Duplicate = Duplicate Security Label {0} MustSupport_VAL_MustSupport = The element {0} is not marked as ''mustSupport'' in the profile {1}. Consider not using the element, or marking the element as must-Support in the profile +NO_VALID_DISPLAY_FOUND_one = No valid Display Names found for {1}#{2} in the language {4} +NO_VALID_DISPLAY_FOUND_other = No valid Display Names found for {1}#{2} in the languages {4} +NO_VALID_DISPLAY_FOUND_LANG_SOME_one = ''{5}'' is the default display; no valid Display Names found for {1}#{2} in the language {4} +NO_VALID_DISPLAY_FOUND_LANG_SOME_other = ''{5}'' is the default display; no valid Display Names found for {1}#{2} in the language {4} +NO_VALID_DISPLAY_FOUND_LANG_NONE_one = ''{5}'' is the default display; the code system {1} has no Display Names for the language {4} +NO_VALID_DISPLAY_FOUND_LANG_NINE_other = ''{5}'' is the default display; the code system {1} has no Display Names found for the language {4} +Named_items_are_out_of_order_in_the_slice = Named items are out of order in the slice +No_ExpansionProfile_provided = No ExpansionProfile provided +No_Expansion_Parameters_provided = No Expansion Parameters provided +No_Parameters_provided_to_expandVS = No Parameters provided to expandVS +No_path_on_element_Definition__in_ = No path on element Definition {0} in {1} +No_path_on_element_in_differential_in_ = No path on element in differential in {0} +No_path_value_on_element_in_differential_in_ = No path value on element in differential in {0} +No_processing_instructions_allowed_in_resources = No processing instructions allowed in resources +No_reference_resolving_discriminator__from_ = No reference resolving discriminator {0} from {1} +No_type_found_on_ = No type found on ''{0}'' +No_validator_configured = No validator configured +Node_type__is_not_allowed = Node type {0} is not allowed +None_of_the_provided_codes_are_in_the_value_set_one = The provided code {2} was not found in the value set ''{1}'' +None_of_the_provided_codes_are_in_the_value_set_other = None of the provided codes [{2}] are in the value set ''{1}'' +Not_done_yet = Not done yet +Not_done_yet_ValidatorHostServicescheckFunction = Not done yet (ValidatorHostServices.checkFunction) +Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = Not done yet (ValidatorHostServices.conformsToProfile), when item is not an element +Not_done_yet_ValidatorHostServicesexecuteFunction = Not done yet (ValidatorHostServices.executeFunction) +Not_done_yet__resolve__locally_2 = Not done yet - resolve {0} locally (2) +Not_handled_yet_sortElements_ = Not handled yet (sortElements: {0}:{1}) +OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = This object cannot be an keyed Array in Json because it does not have two children in the definitions (children = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = This object is defined as a keyed Array in Json but the value property named in the definitions is a choice - this is not supported (value property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = This object is defined as a keyed Array in Json but the value property named in the definitions is a list - this is not supported (value property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = This object is defined as a keyed Array in Json but the definition does not name the first child element as the key (children = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = This object is defined as a keyed Array in Json but the key property named in the definitions is not a primitive type (children = {0}, type = {1}) +Object_must_have_some_content = Object must have some content +PACKAGE_VERSION_MISMATCH = FHIR Version mismatch in package {0}: version is {2} but must be {1} (path: {3}) +PATTERN_CHECK_STRING = The pattern [{0}] defined in the profile {1} not found. Issues: {2} +PRIMITIVE_MUSTHAVEVALUE_MESSAGE = The element definition ``{0}`` in the profile ''{1}'' requires that a value be present in this element +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = The element definition ``{0}`` in the profile ''{1}'' requires that if a value is not present, the extension ''{2}'' must be present +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = The element definition ``{0}`` in the profile ''{1}'' requires that if a value is not present, one of the extensions ''{2}'' must be present +Parser_Type__not_supported = Parser Type {0} not supported +Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Problem evaluating slicing expression for element in profile {0} path {1} (fhirPath = {2}): {3} +Problem_processing_expression__in_profile__path__ = Problem processing expression ''{0}'' in profile ''{1}'' at path ''{2}'': {3} Profile_EXT_Not_Here = The extension {0} is not allowed to be used at this point (based on context invariant ''{1}'') Profile_VAL_MissingElement = Missing element ''{0}'' - required by fixed value assigned in profile {1} Profile_VAL_NotAllowed = The element {0} is present in the instance but not allowed in the applicable {1} specified in profile -Measure_MR_M_None = No Measure is identified, so no validation can be performed against the Measure -Measure_MR_M_NotFound = The Measure ''{0}'' could not be resolved, so no validation can be performed against the Measure -Questionnaire_QR_Item_BadOption = The code ''{1}'' in the system ''{0}'' is not in the options value set ({2}) specified by the questionnaire. Terminology Error: {3} +Profile___Error_generating_snapshot = Profile {0} ({1}). Error generating snapshot +Profile___base__could_not_be_resolved = Profile {0} ({1}) base {2} could not be resolved +Profile___element__Error_generating_snapshot_ = Profile {0} ({1}), element {2}. Error generating snapshot: {3} +Profile___has_no_base_and_no_snapshot = Profile {0} ({1}) has no base and no snapshot +Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profile {0} does not match for {1} because of the following profile issues: {2} +Profile_based_discriminators_must_have_a_type__in_profile_ = Profile based discriminators must have a type ({0} in profile {1}) +Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Profile based discriminators must have a type with a profile ({0} in profile {1}) +Profile_based_discriminators_must_have_only_one_type__in_profile_one = +Profile_based_discriminators_must_have_only_one_type__in_profile_other = Profile based discriminators must have only one type ({1} in profile {2}) but found {0} types QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = The code provided {1} cannot be validated in the options value set ({2}) in the questionnaire because the system {0} could not be found +QUESTIONNAIRE_Q_DERIVATION_TYPE_IGNORED = The derivation type ''{0}'' means that no derivation checking has been performed against this questionnaire +QUESTIONNAIRE_Q_DERIVATION_TYPE_UNKNOWN = The derivation type ''{0}'' is unknown, which means that no derivation checking has been performed against this questionnaire +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS = The item with linkId ''{1}'' found in questionnaire ''{0}'' has answerOptions, so this item must have some too +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS_NEW = The item with linkId ''{1}'' found in questionnaire ''{0}'' does not have this answerOption, so it is not valid +QUESTIONNAIRE_Q_ITEM_DERIVED_DEFINITION = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}'', so this should be repeated here +QUESTIONNAIRE_Q_ITEM_DERIVED_MAXLENGTH = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}'', so this item must also have a max length +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_ANSWER_TYPE = The item with linkId ''{1}'' found in questionnaire ''{0}'' has answer{2}, while this has answer{3}. This might be valid, but the vaidator can''t check that (yet?) +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_DEFINITION = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}''. Is it intended to change this? +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_MAXLENGTH = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the maxLength of ''{2}'', so the max length cannot be greater than that +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REPEATS = The item with linkId ''{1}'' found in questionnaire ''{0}'' does not repeat, so it cannot repeat here +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REQUIRED = The item with linkId ''{1}'' found in questionnaire ''{0}'' is required, so it must be required here +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_TYPE = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the type ''{2}'', and this cannot change to ''{3}'' +QUESTIONNAIRE_Q_ITEM_DERIVED_NI_ANSWER_VS = The validator can''t check derived item value set consistency (yet?) +QUESTIONNAIRE_Q_ITEM_NOT_DERIVED = No item with linkId ''{1}'' found in questionnaire ''{0}'' +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE = The questionnaire ''{0}'' has no derivation type specified using the ''http://hl7.org/fhir/StructureDefinition/questionnaire-derivationType'' extension, so derivation has not been checked +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE_VALUE = The derivation extension has no value +QUESTIONNAIRE_Q_UNKNOWN_DERIVATION = The questionnaire ''{0}'' referred to in the derivation could not be found +Questionnaire_QR_Item_BadOption = The code ''{1}'' in the system ''{0}'' is not in the options value set ({2}) specified by the questionnaire. Terminology Error: {3} Questionnaire_QR_Item_Coding = Error {0} validating Coding against Questionnaire Options Questionnaire_QR_Item_CodingNoOptions = Cannot validate Coding option because no option list is provided Questionnaire_QR_Item_DateNoOptions = Cannot validate date answer option because no option list is provided @@ -104,7 +530,6 @@ Questionnaire_QR_Item_NotEnabled = Item has answer (2), even though it is not en Questionnaire_QR_Item_NotEnabled2 = Item has answer, even though it is not enabled (item id = ''{0}'') Questionnaire_QR_Item_NotFound = LinkId ''{0}'' not found in questionnaire Questionnaire_QR_Item_OnlyOneA = Only one response answer item with this linkId allowed -#The following error cannot occur for a single item. _one case left intentionally blank. Questionnaire_QR_Item_OnlyOneI_one = Questionnaire_QR_Item_OnlyOneI_other = Only one response item with the linkId {1} allowed - found {0} items Questionnaire_QR_Item_Order = Structural Error: items are out of order @@ -120,6 +545,10 @@ Questionnaire_Q_EnableWhen_IsInner = Questions with an enableWhen cannot refer t Questionnaire_Q_EnableWhen_NoLink = Questions with an enableWhen must have a value for the question link Questionnaire_Q_EnableWhen_NoTarget = Unable to find an item with the linkId ''{0}'' which is referenced in the enableWhen for ''{1}'' Questionnaire_Q_EnableWhen_Self = Target for this question enableWhen can''t reference itself +REFERENCE_REF_QUERY_INVALID = The query part of the conditional reference is not a valid query string ({0}) +REFERENCE_REF_SUSPICIOUS = The syntax of the reference ''{0}'' looks incorrect, and it should be checked +REFERENCE_REF_WRONGTARGET_LOAD = The type ''{2}'' is not a valid Target for the element {0} (must be {1}) +RESOURCETYPE_PROPERTY_WRONG_TYPE = The JSON element ''resourceType'' has the wrong JSON type: {0} Reference_REF_Aggregation = Reference is {0} which isn''t supported by the specified aggregation mode(s) for the reference ({1}) Reference_REF_BadTargetType = Invalid Resource target type. Found {0}, but expected one of ({1}) Reference_REF_BadTargetType2 = The type ''{0}'' implied by the reference URL {1} is not a valid Target for this element (must be one of {2}) @@ -127,975 +556,588 @@ Reference_REF_CantMatchChoice = Unable to find a match for profile {0} among cho Reference_REF_CantMatchType = Unable to find a match for profile {0} (by type) among choices: {1} Reference_REF_CantResolve = Unable to resolve resource with reference ''{0}'' Reference_REF_CantResolveProfile = Unable to resolve the profile reference ''{0}'' -Reference_REF_Format1 = Relative URLs must be of the format [ResourceName]/[id], or a search URL is allowed ([type]?parameters. Encountered {0}) -Reference_REF_Format2 = Relative URLs must be of the format [ResourceName]/[id]. Encountered {0} +Reference_REF_Format1 = Relative URLs must be of the format [ResourceName]/[id], or a search URL is allowed ([type]?parameters. Encountered {0}) +Reference_REF_Format2 = Relative URLs must be of the format [ResourceName]/[id]. Encountered {0} Reference_REF_MultipleMatches = Found multiple matching profiles for {0} among choices: {1} Reference_REF_NoDisplay = A Reference without an actual reference or identifier should have a display Reference_REF_NoType = Unable to determine type of target resource Reference_REF_NotFound_Bundle = Bundled or contained reference not found within the bundle/resource {0} Reference_REF_ResourceType = Matching reference for reference {0} has resourceType {1} Reference_REF_WrongTarget = The type ''{0}'' is not a valid Target for this element (must be one of {1}) -REFERENCE_REF_WRONGTARGET_LOAD = The type ''{2}'' is not a valid Target for the element {0} (must be {1}) -Resource_RES_ID_Malformed_Length = Invalid Resource id: Too long ({0} chars) +Reference__refers_to_a__not_a_ValueSet = Reference {0} refers to a {1} not a ValueSet Resource_RES_ID_Malformed_Chars = Invalid Resource id: Invalid Characters (''{0}'') +Resource_RES_ID_Malformed_Length = Invalid Resource id: Too long ({0} chars) Resource_RES_ID_Missing = Resource requires an id, but none is present Resource_RES_ID_Prohibited = Resource has an id, but none is allowed -Terminology_PassThrough_TX_Message = {0} (for ''{1}#{2}'') -Terminology_TX_Binding_CantCheck = Binding by URI reference cannot be checked -Terminology_TX_Binding_Missing = Binding for CodeableConcept {0} missing -Terminology_TX_Binding_Missing2 = Binding for Coding {0} missing -Terminology_TX_Binding_NoServer = The value provided ([{0}]) could not be validated in the absence of a terminology server -Terminology_TX_Binding_NoSource = Binding for path {0} has no source, so can''t be checked -Terminology_TX_Binding_NoSource2 = Binding has no source, so can''t be checked -Terminology_TX_Code_NotValid = Code {0} is not a valid code in code system {1} -Terminology_TX_Code_Unknown = Unknown Code ({0}#{1}) -Terminology_TX_Code_ValueSet = No code provided, and a code is required from the value set {0} -Terminology_TX_Code_ValueSet_MISSING = No code provided, and a code is required from the value set -Terminology_TX_Code_ValueSetMax = No code provided, and a code must be provided from the value set {0} (max value set {1}) -Terminology_TX_Code_ValueSet_Ext = No code provided, and a code should be provided from the value set {0} -Terminology_TX_Coding_Count = Expected {0} but found {1} coding elements -Terminology_TX_Confirm_1_CC = Could not confirm that the codings provided are in the value set {0} and a coding from this value set is required (class = {1}) -Terminology_TX_Confirm_2_CC = Could not confirm that the codings provided are in the value set {0} and a coding should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) (class = {1}) -Terminology_TX_Confirm_3_CC = Could not confirm that the codings provided are in the value set {0} and a coding is recommended to come from this value set (class = {1}) -Terminology_TX_Confirm_4a = The code provided ({2}) was not found in the value set {0}, and a code from this value set is required: {1} -Terminology_TX_Confirm_4b = The codes provided ({2}) are not in the value set {0}, and a code from this value set is required: {1} -Terminology_TX_Confirm_5 = The code provided ({1}) is not in the value set in the value set {0}, and a code should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) -Terminology_TX_Confirm_6 = The code provided ({1}) is not in the value set in the value set {0}, and a code is recommended to come from this value set -Terminology_TX_Display_Wrong = Display should be ''{0}'' -Terminology_TX_Error_CodeableConcept = Error {0} validating CodeableConcept -Terminology_TX_Error_CodeableConcept_Max = Error {0} validating CodeableConcept using maxValueSet -Terminology_TX_Error_Coding1 = Error {0} validating Coding -Terminology_TX_Error_Coding2 = Error {0} validating Coding: {1} -Terminology_TX_NoValid_1_CC = None of the codings provided are in the value set {0}, and a coding from this value set is required) (codes = {1}) -Terminology_TX_NoValid_10 = The code provided is not in the maximum value set {0}, and a code from this value set is required) (code = {1}#{2}) -Terminology_TX_NoValid_11 = The code provided is not in the maximum value set {0}, and a code from this value set is required) (code = {1}#{2}), error = {3}) -Terminology_TX_NoValid_12 = The Coding provided ({2}) was not found in the value set {0}, and a code is required from this value set. {1} -Terminology_TX_NoValid_13 = The Coding provided ({2}) was not found in the value set {0}, and a code should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable). {1} -Terminology_TX_NoValid_14 = The Coding provided ({2}) was not found in the value set {0}, and a code is recommended to come from this value set. {1} -Terminology_TX_NoValid_15 = The value provided (''{0}'') could not be validated in the absence of a terminology server -Terminology_TX_NoValid_15A = The value provided (''{0}'') could not be validated because the code system {1} is not known -Terminology_TX_NoValid_16 = The value provided (''{0}'') was not found in the value set {1}, and a code is required from this value set {2} -Terminology_TX_NoValid_17 = The value provided (''{0}'') was not found in the value set {1}, and a code should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable) {2} -Terminology_TX_NoValid_18 = The value provided (''{0}'') was not found in the value set {1}, and a code is recommended to come from this value set){2} -Terminology_TX_NoValid_2_CC = None of the codings provided are in the value set {0}, and a coding should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable) (codes = {1}) -Terminology_TX_NoValid_3_CC = None of the codings provided are in the value set {0}, and a coding is recommended to come from this value set) (codes = {1}) -Terminology_TX_NoValid_4 = The Coding provided ({2}) was not found in the value set {0}, and a code is required from this value set {1} -Terminology_TX_NoValid_5 = The Coding provided ({2}) was not found in the value set {0}, and a code should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) {1} -Terminology_TX_NoValid_6 = The Coding provided ({2}) was not found in the value set {0}, and a code is recommended to come from this value set {1} -Terminology_TX_NoValid_7 = None of the codes provided could be validated against the maximum value set {0}, (error = {2}) -Terminology_TX_NoValid_8 = None of the codes provided are in the maximum value set {0}, and a code from this value set is required) (codes = {1}) -Terminology_TX_NoValid_9 = The code provided ({2}) could not be validated against the maximum value set {0}, (error = {1}) -Terminology_TX_System_Invalid = Invalid System URI: {0} -Terminology_TX_System_NotKnown = A definition for CodeSystem ''{0}'' could not be found, so the code cannot be validated -TERMINOLOGY_TX_SYSTEM_NOT_USABLE = The definition for the Code System with URI ''{0}'' doesn't provide any codes so the code cannot be validated -Terminology_TX_System_Relative = Coding.system must be an absolute reference, not a local reference -Terminology_TX_System_Unknown = Unknown Code System ''{0}'' -Terminology_TX_System_ValueSet = Invalid System URI: {0} - cannot use a value set URI as a system -Terminology_TX_System_ValueSet2 = The Coding references a value set, not a code system (''{0}'') -Terminology_TX_ValueSet_NotFound = ValueSet {0} not found -Terminology_TX_ValueSet_NotFound_CS = Found a reference to a CodeSystem ({0}) where a ValueSet belongs -Type_Specific_Checks_DT_Base64_Valid = The value ''{0}'' is not a valid Base64 value -Type_Specific_Checks_DT_Boolean_Value = Boolean values must be ''true'' or ''false'' -Type_Specific_Checks_DT_Code_WS = The code ''{0}'' is not valid (whitespace rules) -Type_Specific_Checks_DT_DateTime_Reasonable = The value ''{0}'' is outside the range of reasonable years - check for data entry error -Type_Specific_Checks_DT_DateTime_Regex = The instant ''{0}'' is not valid (by regex) -Type_Specific_Checks_DT_DateTime_TZ = If a date has a time, it must have a timezone -Type_Specific_Checks_DT_DateTime_Valid = Not a valid date/time ({0}) -Type_Specific_Checks_DT_Date_Valid = Not a valid date ({0}) -Type_Specific_Checks_DT_Decimal_Range = The value ''{0}'' is outside the range of commonly/reasonably supported decimals -Type_Specific_Checks_DT_Decimal_Valid = The value ''{0}'' is not a valid decimal -Type_Specific_Checks_DT_Decimal_GT = value is greater than permitted maximum value of {0} -Type_Specific_Checks_DT_Decimal_LT = value is less than permitted minimum value of {0} -Type_Specific_Checks_DT_ID_Valid = id value ''{0}'' is not valid -Type_Specific_Checks_DT_Identifier_System = Identifier.system must be an absolute reference, not a local reference -Type_Specific_Checks_DT_Instant_Valid = Not a valid instant ({0}) -Type_Specific_Checks_DT_Integer64_Valid = The value ''{0}'' is not a valid integer64 -Type_Specific_Checks_DT_Integer_GT = value is greater than permitted maximum value of {0} -Type_Specific_Checks_DT_Integer_LT = value is less than permitted minimum value of {0} -Type_Specific_Checks_DT_Integer_LT0 = value is less than permitted minimum value of 0 -Type_Specific_Checks_DT_Integer_LT1 = value is less than permitted minimum value of 1 -Type_Specific_Checks_DT_Integer_Valid = The value ''{0}'' is not a valid integer -Type_Specific_Checks_DT_OID_Start = OIDs must start with urn:oid: -Type_Specific_Checks_DT_OID_Valid = OIDs must be valid ({0}) -Type_Specific_Checks_DT_Primitive_Length = value is longer than permitted maximum length of {0} -Type_Specific_Checks_DT_Primitive_NotEmpty = value cannot be empty -Type_Specific_Checks_DT_Primitive_Regex = Element value ''{0}'' does not meet regex ''{1}'' -TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = Exception evaluating regex ''{0}'' on type {1}: {2} -Type_Specific_Checks_DT_Primitive_Regex_Type = Element value ''{0}'' does not meet {1} regex ''{2}'' -TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_TYPE_ALT = Neither the element value ''{0}'' or the formatted value ''{1}'' meet {2} regex ''{3}'' -Type_Specific_Checks_DT_Primitive_ValueExt = Primitive types must have a value or must have child extensions -Type_Specific_Checks_DT_Primitive_WS = Primitive types should not only be whitespace -Type_Specific_Checks_DT_String_Length = value is longer than permitted maximum length of 1 MB (1048576 bytes) -Type_Specific_Checks_DT_String_WS = value should not start or finish with whitespace ''{0}'' -Type_Specific_Checks_DT_String_WS_ALL = value should not be all whitespace ''{0}'' -Type_Specific_Checks_DT_Time_Valid = Not a valid time ({0}) -Type_Specific_Checks_DT_URI_OID = URI values cannot start with oid: -Type_Specific_Checks_DT_URI_UUID = URI values cannot start with uuid: -Type_Specific_Checks_DT_URI_WS = URI values cannot have whitespace(''{0}'') -Type_Specific_Checks_DT_URL_Resolve = URL value ''{0}'' does not resolve -Type_Specific_Checks_DT_UUID_Strat = UUIDs must start with urn:uuid: -Type_Specific_Checks_DT_UUID_Valid = UUIDs must be valid and lowercase ({0}) -Validation_BUNDLE_Message = The first entry in a message must be a MessageHeader -Validation_VAL_Content_Unknown = Unrecognized Content {0} -Validation_VAL_NoType = Unknown type {0} -Validation_VAL_Profile_MatchMultiple = Profile {0}, Element matches more than one slice - {1}, {2} -## for the next 4 messages, the available parameters are: 0: profile url, 1: ed.path, 2: ed.id, 3: ed.sliceName, 4: ed.label, 5: element.path, 6: ed.min and optionally 7: actual count -Validation_VAL_Profile_Maximum_one = {3}: max allowed = {7}, but found {0} (from {1}) -Validation_VAL_Profile_Maximum_other = {3}: max allowed = {7}, but found {0} (from {1}) -Validation_VAL_Profile_Minimum_one = {3}: minimum required = {7}, but only found {0} (from {1}) -Validation_VAL_Profile_Minimum_other = {3}: minimum required = {7}, but only found {0} (from {1}) -VALIDATION_VAL_PROFILE_MINIMUM_MAGIC = {0}: magic LOINC code {1} required, but not found (from {2}). Note that other Observation codes are allowed in addition to this required magic code -Validation_VAL_Profile_NoCheckMax_one = {3}: Found {0} match, but unable to check max allowed ({2}) due to lack of slicing validation (from {1}) -Validation_VAL_Profile_NoCheckMax_other = {3}: Found {0} matches, but unable to check max allowed ({2}) due to lack of slicing validation (from {1}) -Validation_VAL_Profile_NoCheckMin_one = {3}: Found {0} match, but unable to check minimum required ({2}) due to lack of slicing validation (from {1}) -Validation_VAL_Profile_NoCheckMin_other = {3}: Found {0} matches, but unable to check minimum required ({2}) due to lack of slicing validation (from {1}) -Validation_VAL_Profile_MultipleMatches_one = Found multiple matching profiles among {0} choice: {1} -Validation_VAL_Profile_MultipleMatches_other = Found multiple matching profiles among {0} choices: {1} -Validation_VAL_Profile_NoDefinition = No definition found for resource type ''{0}'' -Validation_VAL_Profile_NoMatch = Unable to find a match for the specified profile among choices: {0} -Validation_VAL_Profile_NoSnapshot = StructureDefinition {0} has no snapshot - validation is against the snapshot, so it must be provided -Validation_VAL_Profile_NoType = The type of element {0} is not known - it could not be determined from the information available. Valid types at this point are {1} -Validation_VAL_Profile_NotAllowed = This element is not allowed by the profile {0} -Validation_VAL_Profile_NotSlice = This element does not match any known slice {0} and slicing is CLOSED: {1} -Validation_VAL_Profile_OutOfOrder = As specified by profile {0}, Element ''{1}'' is out of order (found after {2}) -Validation_VAL_Profile_SliceOrder = As specified by profile {0}, Element ''{1}'' is out of order in ordered slice -Validation_VAL_Profile_Unknown = Profile reference ''{0}'' has not been checked because it could not be found -VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = Profile reference ''{0}'' has not been checked because it could not be found, and the validator is set to not fetch unknown profiles -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = Profile reference ''{0}'' has not been checked because it could not be found, and fetching it resulted in the error {1} -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = Profile reference ''{0}'' has not been checked because it could not be found, and the host {1} cannot be found -Validation_VAL_Unknown_Profile = Unknown profile {0} -VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = Profile {1} identifies {2} as a dependency (using the extension http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), but this profile could not be found -XHTML_XHTML_Attribute_Illegal = Invalid attribute name in the XHTML (''{0}'' on ''{1}'') -XHTML_XHTML_Element_Illegal = Invalid element name in the XHTML (''{0}'') -XHTML_XHTML_Entity_Illegal = Invalid entity in the XHTML (''{0}'') -XHTML_XHTML_Image_Reference_Illegal = Invalid Image Reference in the XHTML (''{0}'') -XHTML_XHTML_NS_InValid = Wrong namespace on the XHTML (''{0}'', should be ''{1}'') -XHTML_XHTML_Name_Invalid = Wrong name on the XHTML (''{0}'') - must start with div -_DT_Fixed_Wrong = Value is ''{0}'' but must be ''{1}'' -All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = Best Practice Recommendation: In general, all observations should have an effective[x] ({0}) -All_observations_should_have_a_performer = Best Practice Recommendation: In general, all observations should have a performer -All_observations_should_have_a_subject = Best Practice Recommendation: In general, all observations should have a subject -Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Unable to resolve slice matching - no fixed value or required value set -Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Unable to resolve slice matching - slice matching by value set not done -Problem_processing_expression__in_profile__path__ = Problem processing expression ''{0}'' in profile ''{1}'' at path ''{2}'': {3} -Unable_to_find_element_with_id_ = Unable to find element with id ''{0}'' -Slice_encountered_midway_through_set_path___id___ = Slice encountered midway through set (path = {0}, id = {1}); {2} -Unable_to_resolve_actual_type_ = Unable to resolve actual type {0} -Unsupported_version_R1 = Unsupported version R1 -Unsupported_version_R2 = Unsupported version R2 -Unsupported_version_R2B = Unsupported version R2B -Unsupported_fixed_value_type_for_discriminator_for_slice__ = Unsupported fixed value type for discriminator ({0}) for slice {1}: {2} -Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - extensions are not allowed - for discriminator ({0}) for slice {1} -Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - must have at least one coding - for discriminator ({0}) for slice {1} -Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - using text - for discriminator ({0}) for slice {1} -Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Unsupported Identifier pattern - extensions are not allowed - for discriminator ({0}) for slice {1} -Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Unsupported fixed pattern type for discriminator ({0}) for slice {1}: {2} -Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Problem evaluating slicing expression for element in profile {0} path {1} (fhirPath = {2}): {3} -Could_not_match_discriminator_for_slice_in_profile_one = Could not match discriminator ({0}) for slice {1} in profile {2} - the discriminator {3} does not have fixed value, binding or existence assertions -Could_not_match_discriminator_for_slice_in_profile_other = Could not match any discriminators ({1}) for slice {2} in profile {3} - None of the {0} discriminators {4} have fixed value, binding or existence assertions -Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = Discriminator ({0}) is based on element existence, but slice {1} neither sets min>=1 or max=0 -Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Profile based discriminators must have a type with a profile ({0} in profile {1}) -#The following error cannot occur for a single item. _one case left intentionally blank. -Profile_based_discriminators_must_have_only_one_type__in_profile_one = -Profile_based_discriminators_must_have_only_one_type__in_profile_other = Profile based discriminators must have only one type ({1} in profile {2}) but found {0} types -Profile_based_discriminators_must_have_a_type__in_profile_ = Profile based discriminators must have a type ({0} in profile {1}) -Discriminator__is_based_on_type_but_slice__in__has_no_types = Discriminator ({0}) is based on type, but slice {1} in {2} has no types -#The following error cannot occur for a single item. _one case left intentionally blank. -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one = -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = Discriminator ({1}) is based on type, but slice {2} in {3} has {0} types: {4} -Found__items_for__resolving_discriminator__from_ = Found {0} items for {1} resolving discriminator {2} from {3} -Unable_to_find__resolving_discriminator__from_ = Unable to find {0} resolving discriminator {1} from {2} -Unable_to_find_resource__at__resolving_discriminator__from_ = Unable to find resource {0} at {1} resolving discriminator {2} from {3} -No_reference_resolving_discriminator__from_ = No reference resolving discriminator {0} from {1} -Unable_to_resolve_element__in_profile_ = Unable to resolve element {0} in profile {1} -Unable_to_resolve_profile_ = Unable to resolve profile {0} -Resource_resolution_services_not_provided = Resource resolution services not provided -Unrecognised_extension_context_ = Unrecognized extension context {0} -Unable_to_locate_the_profile__in_order_to_validate_against_it = Unable to locate the profile ''{0}'' in order to validate against it -Reference__refers_to_a__not_a_ValueSet = Reference {0} refers to a {1} not a ValueSet -Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = Not done yet (ValidatorHostServices.conformsToProfile), when item is not an element -Not_supported_yet = Not supported yet -Unable_to_resolve_ = Unable to resolve the reference {0} -Not_done_yet__resolve__locally_2 = Not done yet - resolve {0} locally (2) -Not_done_yet_ValidatorHostServicesexecuteFunction = Not done yet (ValidatorHostServices.executeFunction) -Not_done_yet_ValidatorHostServicescheckFunction = Not done yet (ValidatorHostServices.checkFunction) -Not_done_yet_ValidatorHostServicesresolveFunction_ = Not done yet (ValidatorHostServices.resolveFunction): {0} -Unable_to_find_base_definition_for_logical_model__from_ = Unable to find base definition for logical model: {0} from {1} -Same_id_on_multiple_elements__in_ = Same id ''{0}'' on multiple elements {1}/{2} in {3} -No_path_on_element_Definition__in_ = No path on element Definition {0} in {1} -needs_a_snapshot = Needs a snapshot -not_the_right_kind_of_structure_to_generate_schematrons_for = Not the right kind of structure to generate schematrons for -Not_handled_yet_sortElements_ = Not handled yet (sortElements: {0}:{1}) -Unable_to_resolve_profile__in_element_ = Unable to resolve profile {0} in element {1} -Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Can''t have children on an element with a polymorphic type - you must slice and constrain the types first (sortElements: {0}:{1}) -Unable_to_find_profile__at_ = Unable to find profile ''{0}'' at {1} -Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Unhandled situation: resource is profiled to more than one option - cannot sort profile -Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_ = Internal recursion detection: find() loop path recursion > {0} - check paths are valid (for path {1}/{2}) -Internal_error___type_not_known_ = Internal error - type not known {0} -Unable_to_find_element_ = Unable to find element {0} -Error_generating_table_for_profile__ = Error generating table for profile {0}: {1} -StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} at {1}: invalid constrained type {2} from {3} in {4} -Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Error at {0}#{1}: The target profile {2} is not a valid constraint on the base ({3}) -Error_in_profile__at__Base_isSummary___derived_isSummary__ = Error in profile {0} at {1}: Base isSummary = {2}, derived isSummary = {3} -StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_ = StructureDefinition {0} at {1}: invalid attempt to change a binding from {2} to {3} -Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Unexpected condition in differential: invalid type at {0}/{1} -Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Unexpected condition in differential: implicit slice name does not contain a valid type (''{0}''?) at {1}/{2} -Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Attempt to use a snapshot on profile ''{0}'' as {1} before it is generated -null_min = Null min -_has_children__for_type__in_profile__but_cant_find_type = {0} has children ({1}) for type {2} in profile {3}, but can''t find type -_has_children__and_multiple_types__in_profile_ = {0} has children ({1}) and multiple types ({2}) in profile {3} -Adding_wrong_path = Adding wrong path -Named_items_are_out_of_order_in_the_slice = Named items are out of order in the slice -The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = The base snapshot marks a slicing as closed, but the differential tries to extend it in {0} at {1} ({2}) -Not_done_yet = Not done yet -Unknown_type__at_ = Unknown type {0} at {1} -Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential walks into ''{0} (@ {1})'', but the base does not, and there is not a single fixed type. The type is {2}. This is not handled yet -Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicing rules on differential ({0}) do not match those on base ({1}) - rule @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicing rules on differential ({0}) do not match those on base ({1}) - discriminator @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicing rules on differential ({0}) do not match those on base ({1}) - order @ {2} ({3}) -not_done_yet__slicing__types__ = Not done yet - slicing / types @ {0} -Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Invalid slicing: there is more than one type slice at {0}, but one of them ({1}) has min = 1, so the other slices cannot exist -Did_not_find_type_root_ = Did not find type root: {0} -Error_at_path__Slice_for_type__has_wrong_type_ = Error at path {0}: Slice for type ''{1}'' has wrong type ''{2}'' -Error_at_path__Slice_for_type__has_more_than_one_type_ = Error at path {0}: Slice for type ''{1}'' has more than one type ''{2}'' -Error_at_path__Slice_name_must_be__but_is_ = Error at path {0}: Slice name must be ''{1}'' but is ''{2}'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Error at path {0} in {1}: Type slicing with slicing.discriminator.path != ''$this'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Error at path {0} in {1}: Type slicing with slicing.discriminator.type != ''type'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Error at path {0} in {1}: Type slicing with slicing.discriminator.count() > 1 -Error_at_path__in__Type_slicing_with_slicingordered__true = Error at path {0} in {1}: Type slicing with slicing.ordered = true -Adding_wrong_path_in_profile___vs_ = Adding wrong path in profile {0}: {1} vs {2} -_has_no_children__and_no_types_in_profile_ = {0} has no children ({1}) and no types in profile {2} -Did_not_find_single_slice_ = Did not find single slice: {0} -Differential_does_not_have_a_slice__b_of_____in_profile_ = Differential in profile {5} does not have a slice at {6} (on {0}, position {1} of {2} / {3} / {4}) -Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Attempt to a slice an element that does not repeat: {0}/{1} from {2} in {3}, at element {4} (slice = {5}) -Unable_to_resolve_reference_to_ = Unable to resolve reference to {0} -Unable_to_find_element__in_ = Unable to find element {0} in {1} -Unable_to_find_base__for_ = Unable to find base {0} for {1} -Adding_wrong_path__outcomegetPath___resultPathBase__ = Adding wrong path - outcome.getPath() = {0}, resultPathBase = {1} -Illegal_path__in_differential_in__illegal_characters_ = Invalid path ''{0}'' in differential in {1}: invalid characters [] -Illegal_path__in_differential_in__illegal_character_ = Invalid path ''{0}'' in differential in {1}: invalid character ''{2}'' -Illegal_path__in_differential_in__no_unicode_whitespace = Invalid path ''{0}'' in differential in {1}: no unicode whitespace -Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Invalid path ''{0}'' in differential in {1}: name portion exceeds 64 chars in length -Illegal_path__in_differential_in__name_portion_mising_ = Invalid path ''{0}'' in differential in {1}: name portion missing (''..'') -Illegal_path__in_differential_in__must_start_with_ = Invalid path ''{0}'' in input differential in {1}: must start with {2}.{3} -No_path_value_on_element_in_differential_in_ = No path value on element in differential in {0} -No_path_on_element_in_differential_in_ = No path on element in differential in {0} -Unxpected_internal_condition__no_source_on_diff_element = Unexpected internal condition - no source on diff element -type_on_first_snapshot_element_for__in__from_ = Type on first snapshot element for {0} in {1} from {2} -type_on_first_differential_element = Type on first differential element! -Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Circular snapshot references detected; cannot generate snapshot (stack = {0}) -Base__Derived_profiles_have_different_types____vs___ = Base & Derived profiles have different types ({0} = {1} vs {2} = {3}) -Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Derived profile {0} has no derivation value and so can''t be processed -Derived_profile__has_no_type = Derived profile {0} has no type -Base_profile__has_no_type = Base profile {0} has no type -no_derived_structure_provided = No derived structure provided -no_base_profile_provided = No base profile provided -element_id__null__on_ = Element id = null: {0} on {1} -element__null_ = Element = null: {0} -getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList should only be called when the element has slicing -Unable_to_resolve_name_reference__at_path_ = Unable to resolve name reference {0} at path {1} -Details_for__matching_against_Profile_ = Details for {0} matching against profile {1} -Does_not_match_slice_ = Does not match slice ''{0}'' (discriminator: {1}) -Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profile {0} does not match for {1} because of the following profile issues: {2} -This_element_does_not_match_any_known_slice_ = This element does not match any known slice {0} (this may not be a problem, but you should check that it''s not intended to match a slice) -defined_in_the_profile = Defined in the profile -This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = This content cannot be parsed (unknown or unrecognized resource name ''{0}'') -This_cannot_be_parsed_as_a_FHIR_object_no_name = This content cannot be parsed (no name) -This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = This content cannot be parsed (unknown or unrecognized XML Root element namespace/name ''{0}::{1}'') -This__cannot_be_parsed_as_a_FHIR_object_no_namespace = This ''{0}'' cannot be parsed (no namespace on the XML Root element) -Unable_to_find_resourceType_property = Unable to find resourceType property -Error_parsing_JSON_the_primitive_value_must_be_a_string = Error parsing JSON: the primitive value must be a string -Error_parsing_JSON_the_primitive_value_must_be_a_number = Error parsing JSON: the primitive value must be a number -Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Error parsing JSON: the primitive value must be a boolean -Error_parsing_XHTML_ = Error parsing XHTML: {0} -This_property_must_be_an_object_not_ = This property must be an object, not {0} ({1} at {2}) -This_property_must_be_an_simple_value_not_ = This property must be a simple value, not {0} ({1} at {2}) -This_property_must_be__not_ = The property {2} must be {0}, not {1} (at {3}) -This_property_must_be_an_Array_not_ = The property {1} must be a JSON Array, not {0} (at {2}) -OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = This object cannot be an keyed Array in Json because it does not have two children in the definitions (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = This object is defined as a keyed Array in Json but the definition does not name the first child element as the key (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = This object is defined as a keyed Array in Json but the key property named in the definitions is not a primitive type (children = {0}, type = {1}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = This object is defined as a keyed Array in Json but the value property named in the definitions is a choice - this is not supported (value property = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = This object is defined as a keyed Array in Json but the value property named in the definitions is a list - this is not supported (value property = {0}) -Unrecognised_property_ = Unrecognized property ''{0}'' -Object_must_have_some_content = Object must have some content -Error_parsing_JSON_ = Error parsing JSON: {0} -Node_type__is_not_allowed = Node type {0} is not allowed -CDATA_is_not_allowed = CDATA is not allowed -Undefined_element_ = Undefined element ''{0}'' at {1} -Undefined_attribute__on__for_type__properties__ = Undefined attribute ''@{0}'' on {1} for type {2} -Text_should_not_be_present = Text should not be present (''{0}'') -Wrong_namespace__expected_ = Wrong namespace - expected ''{0}'' -Element_must_have_some_content = Element must have some content -No_processing_instructions_allowed_in_resources = No processing instructions allowed in resources -Unknown_resource_type_missing_rdfstype = Unknown resource type (missing rdfs:type) -reference_to__cannot_be_resolved = reference to {0} cannot be resolved -This_property_must_be_a_URI_or_bnode_not_ = This property must be a URI or bnode, not {0} -This_property_must_be_a_Literal_not_ = This property must be a Literal, not {0} -Unrecognised_predicate_ = Unrecognized predicate ''{0}'' -Error_parsing_Turtle_ = Error parsing Turtle: {0} -Unexpected_datatype_for_rdfstype = Unexpected datatype for rdfs:type -Attempt_to_replace_element_name_for_a_nonchoice_type=Attempt to replace element name for a non-choice type -Wrong_type_for_resource = Wrong type for resource -Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Contained resource does not appear to be a FHIR resource (unknown name ''{0}'') -Unknown_Date_format_ = Unknown Date format ''{0}'' -Unknown_Data_format_ = Unknown Data format ''{0}'' -No_type_found_on_ = No type found on ''{0}'' -error_writing_number__to_JSON = Error writing number ''{0}'' to JSON -Unable_to_process_request_for_resource_for___ = Unable to process request for resource for {0} / {1} -Resource_type_mismatch_for___ = Resource type mismatch for {0} / {1} -not_done_yet_cant_fetch_ = Not done yet: can''t fetch {0} -Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Attempt to use Terminology server when no Terminology server is available -No_ExpansionProfile_provided = No ExpansionProfile provided -Can_only_specify_profile_in_the_context = Can only specify profile in the context -no_url_in_expand_value_set_2 = No url in expand value set 2 -no_url_in_expand_value_set = No url in expand value set -no_value_set = ValueSet has no url property -No_Parameters_provided_to_expandVS = No Parameters provided to expandVS -No_Expansion_Parameters_provided = No Expansion Parameters provided -Unable_to_resolve_value_Set_ = Unable to resolve value Set {0} -Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited versions have exact match for delimiter ''{0}'' : {1} vs {2} -Duplicate_Resource_ = Duplicate Resource {0} of type {3} (existing version {2}, new version {1}) -DUPLICATE_RESOURCE_VERSION = Duplicate Resource {0} Version {1} of type {2} -Error_expanding_ValueSet_running_without_terminology_services = Error expanding ValueSet: running without terminology services -Error_validating_code_running_without_terminology_services = Error validating code: running without terminology services -Unable_to_validate_code_without_using_server = Unable to validate code without using server because: {0} -UNABLE_TO_VALIDATE_LOCALLY = Unable to validate code locally: {0} -Profile___Error_generating_snapshot = Profile {0} ({1}). Error generating snapshot -Profile___element__Error_generating_snapshot_ = Profile {0} ({1}), element {2}. Error generating snapshot: {3} -Profile___base__could_not_be_resolved = Profile {0} ({1}) base {2} could not be resolved -Profile___has_no_base_and_no_snapshot = Profile {0} ({1}) has no base and no snapshot -No_validator_configured = No validator configured -Parser_Type__not_supported = Parser Type {0} not supported -Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Version mismatch. The context has version {0} loaded, and the new content being loaded is version {1} -Error_reading__from_package__ = Error reading {0} from package {1}#{2}: {3} -Error_parsing_ = Error parsing {0}:{1} -Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Unable to connect to terminology server at {1}. Use parameter ''-tx n/a'' to run without using terminology services to validate LOINC, SNOMED, ICD-X etc. Error = {0} -Display_Name_for__should_be_one_of__instead_of_one = Wrong Display Name ''{4}'' for {1}#{2} - should be {3} (for the language(s) ''{5}'') -Display_Name_for__should_be_one_of__instead_of_other = Wrong Display Name ''{4}'' for {1}#{2} - should be one of {0} choices: {3} (for the language(s) ''{5}'') -Display_Name_WS_for__should_be_one_of__instead_of_one = Wrong whitespace in Display Name ''{4}'' for {1}#{2} - should be {3} (for the language(s) ''{5}'') -Display_Name_WS_for__should_be_one_of__instead_of_other = Wrong whitespace in Display Name ''{4}'' for {1}#{2} - should be one of {0} choices: {3} (for the language(s) ''{5}'') -Unknown_Code_in = Unknown code ''{0}'' in the CodeSystem ''{1}'' -Unknown_Code_in_Version = Unknown code ''{0}'' in the CodeSystem ''{1}'' version ''{2}'' -UNKNOWN_CODE_IN_FRAGMENT = Unknown Code ''{0}'' in the system ''{1}'' version ''{2}'' - note that the code system is labeled as a fragment, so the code may be valid in some other fragment -Code_found_in_expansion_however_ = Code found in expansion, however: {0} -None_of_the_provided_codes_are_in_the_value_set_one = The provided code {2} was not found in the value set ''{1}'' -None_of_the_provided_codes_are_in_the_value_set_other = None of the provided codes [{2}] are in the value set ''{1}'' -Coding_has_no_system__cannot_validate = Coding has no system. A code with no system has no defined meaning, and it cannot be validated. A system should be provided -Unable_to_handle_system__concept_filter_with_op__ = Unable to handle system {0} concept filter with op = {1} -UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = Unable to handle system {0} property filter with op = {1} -Unable_to_handle_system__filter_with_property__ = Unable to handle system {0} filter with property = {1}, op = {2} -Unable_to_resolve_system__value_set_has_include_with_no_system = Unable to resolve system - value set {0} include #{1} has no system -UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = The code system {1} referred to from value set {0} has a grammar, and the code might be valid in it -Unable_to_resolve_system__value_set_has_include_with_unknown_system = Unable to resolve system - value set {0} include #{1} has system {2} which icould not be found, and the server returned error {3} -Unable_to_resolve_system__value_set_has_include_with_filter = Unable to resolve system - value set {0} include #{1} has a filter on system {2} -Unable_to_resolve_system__value_set_has_imports = Unable to resolve system - value set has imports -Unable_to_resolve_system__value_set_has_multiple_matches = Unable to resolve system - value set expansion has multiple matches: {0} -Unable_to_resolve_system__value_set_expansion_has_multiple_systems = Unable to resolve system - value set expansion has multiple systems -Unable_to_resolve_system__value_set_has_no_includes_or_expansion = Unable to resolve system - value set {0} has no includes or expansion -Unable_to_resolve_system__no_value_set = Unable to resolve system - no value set -Unable_to_resolve_system__value_set_has_no_matches = Unable to determine system - value set has no matches for code ''{0}'' -This_base_property_must_be_an_Array_not_ = This base property must be an Array, not {0} -documentmsg = (document) -xml_attr_value_invalid = The XML Attribute {0} has an invalid character -xml_encoding_invalid = The XML encoding is invalid (must be UTF-8) -xml_stated_encoding_invalid = The XML encoding stated in the header is invalid (must be ''UTF-8'' if stated) -XHTML_URL_INVALID = The URL is not valid because ''({1})'': {0} -MEASURE_MR_GRP_NO_CODE = Group should have a code that matches the group definition in the measure -MEASURE_MR_GRP_UNK_CODE = The code for this group has no match in the measure definition -MEASURE_MR_GRP_DUPL_CODE = The code for this group is duplicated with another group -MEASURE_MR_GRP_MISSING_BY_CODE = The MeasureReport does not include a group for the group ''{0}'' -MEASURE_MR_GRP_NO_USABLE_CODE = None of the codes provided are usable for comparison - need both system and code on at least one code -MEASURE_MR_GRP_NO_WRONG_CODE = The code provided ({0}) does not match the code specified in the measure report ({1}) -DUPLICATE_ID = Duplicate id value ''{0}'' -MEASURE_MR_GRP_POP_NO_CODE = Group should have a code that matches the group population definition in the measure -MEASURE_MR_GRP_POP_UNK_CODE = The code for this group population has no match in the measure definition -MEASURE_MR_GRPST_POP_UNK_CODE = The code for this group stratifier has no match in the measure definition -MEASURE_MR_GRP_POP_DUPL_CODE = The code for this group population is duplicated with another group -MEASURE_MR_GRP_POP_MISSING_BY_CODE = The MeasureReport does not include a population group for the population group {0} -MEASURE_MR_GRP_POP_COUNT_MISMATCH = Mismatch between count {0} and number of subjects {1} -MEASURE_MR_GRP_POP_NO_SUBJECTS = Reports where type is not ''subject-list'' don''t have subjects listed -MEASURE_MR_GRP_POP_NO_COUNT = Count should be present for reports where type is not ''subject-list'' -MEASURE_M_NO_GROUPS = A measure should contain at least one group -MEASURE_M_GROUP_CODE = Groups should have codes when there is more than one group -MEASURE_M_GROUP_POP = Measure Groups should have at least one population -MEASURE_M_GROUP_STRATA = Measure Groups should have at least one stratifier -MEASURE_M_GROUP_POP_NO_CODE = A measure group population should have a code when there is more than one population -MEASURE_M_GROUP_STRATA_NO_CODE = A measure group stratifier should have a code when there is more than one population -MEASURE_M_GROUP_STRATA_COMP_NO_CODE = A measure group stratifier component should have a code when there is more than one population -MEASURE_M_LIB_UNKNOWN = The Library {0} could not be resolved, so expression validation may not be correct -TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Canonical URLs must be absolute URLs if they are not fragment references ({0}) -TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Canonical URLs in contained resources must be absolute URLs if present ({0}) -MEASURE_MR_SCORE_PROHIBITED_RT = No measureScore when the type of the report is ''data-collection'' -MEASURE_MR_SCORE_PROHIBITED_MS = No measureScore when the scoring of the message is ''cohort'' -MEASURE_MR_SCORE_REQUIRED = A measureScore is required when the Measure.scoring={0} -MEASURE_MR_M_SCORING_UNK = The scoring system in this measure is unknown, so the measureScore values cannot be checked -MEASURE_MR_SCORE_UNIT_PROHIBITED = A measureScore for this Measure Scoring ({0}) should not have units -MEASURE_MR_SCORE_VALUE_REQUIRED = A value is required when the Measure.scoring = {0} -MEASURE_MR_SCORE_VALUE_INVALID_01 = The value is invalid - it must be between 0 and 1 -MEASURE_MR_SCORE_FIXED = This value is fixed by the Measure to ''{0}'' -MEASURE_MR_SCORE_UNIT_REQUIRED = A unit should be present when the scoring type is {0} -MEASURE_M_CRITERIA_UNKNOWN = The expression language {0} is not supported, so can''t be validated -MEASURE_M_CQL_NOT_FOUND = None of the include CQL Libraries define a function {0} -MEASURE_M_CRITERIA_CQL_NO_LIB = No CQL Libraries found on this Measure -MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = If the CQL expression does not include a namespace, there can only be one Library for the measure -MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = No matching Library found for the namespace {0} -MEASURE_M_CRITERIA_CQL_LIB_DUPL = Multiple matching libraries found for the namespace {0} -MEASURE_M_CRITERIA_CQL_ERROR = Error in {0}: ''{1}'' -MEASURE_M_CRITERIA_CQL_NO_ELM = Error in {0}: No compiled version of CQL found -MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Error in {0}: Compiled version of CQL is not valid -MEASURE_M_CRITERIA_CQL_NOT_FOUND = The function {1} does not exist in the library {0} -XHTML_URL_EMPTY = URL is empty -XHTML_URL_INVALID_CHARS_one = URL contains Invalid Character ({1}) -XHTML_URL_INVALID_CHARS_other = URL contains {0} Invalid Characters ({1}) -TERMINOLOGY_TX_SYSTEM_HTTPS = The system URL ''{0}'' wrongly starts with https: not http: -CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Review the All Codes Value Set - incomplete CodeSystems generally should not have an all codes value set specified -TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = if identifier.system is ''urn:ietf:rfc:3986'', then the identifier.value must be a full URI (e.g. start with a scheme), not ''{0}'' -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = Stated Attachment Size {0} is not valid -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = Stated Attachment Size {0} does not match actual attachment size {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = Attachment size cannot be checked because the validator has not been set up to access the network (url = {0}) -TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = Attachment size cannot be checked because the validator doesn''t understand how to access {0} -TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = Attachment size cannot be checked because there was an error accesssing {0}: {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = Attachment size is {0} bytes which exceeds the stated limit of {1} bytes -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Attachments have data and/or url, or else SHOULD have either contentType and/or language -TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64 size is {0} bytes which exceeds the stated limit of {1} bytes -TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = Found {0} decimal places which exceeds the stated limit of {1} digits -Validation_VAL_Profile_WrongType = Specified profile type was ''{0}'' in profile ''{2}'', but found type ''{1}'' -Validation_VAL_Profile_WrongType2 = Type mismatch processing profile {0} at path {1}: The element type is {4}, but the profile {3} is for a different type {2} -VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Invalid constraint in profile {0} at path {1} - cannot constrain to type {2} from base types {3} -EXTENSION_EXTP_CONTEXT_WRONG_XVER = The extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) -EXTENSION_EXTM_CONTEXT_WRONG_XVER = The modifier extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) -SECURITY_STRING_CONTENT_ERROR = The string value contains text that looks like embedded HTML tags, which are not allowed for security reasons in this context -SECURITY_STRING_CONTENT_WARNING = The string value contains text that looks like embedded HTML tags. If this content is rendered to HTML without appropriate post-processing, it may be a security risk -ALL_OK = All OK -SEARCHPARAMETER_NOTFOUND = Unable to find the base Search Parameter {0} so can''t check that this SearchParameter is a proper derivation from it -SEARCHPARAMETER_BASE_WRONG = The resource type {1} is not listed as a base in the SearchParameter this is derived from ({0}) -SEARCHPARAMETER_TYPE_WRONG = The type {1} is different to the type {0} in the derivedFrom SearchParameter -SEARCHPARAMETER_EXP_WRONG = The expression ''{2}'' is not compatible with the expression ''{1}'' in the derivedFrom SearchParameter {0}, and this likely indicates that the derivation relationship is not valid -SEARCHPARAMETER_MISSING_COMPONENTS = When the SearchParameter has a type of 'composite', then the SearchParameter must define two or more components -VALUESET_NO_SYSTEM_WARNING = No System specified, so Concepts and Filters can't be checked -VALUESET_INCLUDE_INVALID_CONCEPT_CODE = The code ''{1}'' is not valid in the system {0} -VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = The code ''{2}'' is not valid in the system {0} version {1} -VALUESET_EXAMPLE_SYSTEM_HINT = Example System ''{0}'' specified, so Concepts and Filters can''t be checked -VALUESET_EXAMPLE_SYSTEM_ERROR = Example System ''{0}'' specified, which is illegal. Concepts and Filters can''t be checked -VALUESET_UNC_SYSTEM_WARNING = Unknown System ''{0}'' specified, so Concepts and Filters can''t be checked (Details: {1}) -VALUESET_UNC_SYSTEM_WARNING_VER = Unknown System/Version ''{0}'' specified, so Concepts and Filters can''t be checked (Details: {1}) -Extension_PROF_Type = The Profile ''{0}'' definition allows for the type {1} but found type {2} -TYPE_CHECKS_PATTERN_CC = The pattern [system {0}, code {1}, and display ''{2}''] defined in the profile {3} not found. Issues: {4} -TYPE_CHECKS_PATTERN_CC_US = The pattern [system {0}, code {1}, display ''{2}'' and userSelected {5}] defined in the profile {3} not found. Issues: {4} -TYPE_CHECKS_FIXED_CC = The pattern [system {0}, code {1}, and display ''{2}''] defined in the profile {3} not found. Issues: {4} -TYPE_CHECKS_FIXED_CC_US = The pattern [system {0}, code {1}, display ''{2}'' and userSelected {5}] defined in the profile {3} not found. Issues: {4} -VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = Global Profile reference ''{0}'' from IG {1} could not be resolved, so has not been checked -VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Validate resource against profile -VALIDATION_VAL_PROFILE_SIGNPOST = Validate resource against profile {0} -VALIDATION_VAL_PROFILE_SIGNPOST_META = Validate resource against profile {0} (per meta) -VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Validate resource against profile {0} (per http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) -VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Validate resource against profile {0} - provided as bundle param -VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Validate resource against profile {0} - a global profile in {1} -ERROR_GENERATING_SNAPSHOT = Error generating Snapshot: {0} (this usually arises from a problem in the differential) -SNAPSHOT_EXISTING_PROBLEM = The generated snapshot has a different number of elements {1} than the originally provided snapshot {0} -FHIRPATH_LOCATION = (at {0}) -FHIRPATH_UNKNOWN_CONTEXT = Unknown context evaluating FHIRPath expression: {0} -FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Unknown context element evaluating FHIRPath expression: {0} -FHIRPATH_ALIAS_COLLECTION = Attempt to alias a collection, not a singleton evaluating FHIRPath expression -FHIRPATH_UNKNOWN_NAME = Error evaluating FHIRPath expression: The name ''{0}'' is not valid for any of the possible types: {1} -FHIRPATH_UNKNOWN_CONSTANT = Error evaluating FHIRPath expression: Invalid FHIR Constant {0} -FHIRPATH_CANNOT_USE = Error evaluating FHIRPath expression: Cannot use {0} in this context because {1} -FHIRPATH_CANT_COMPARE = Error evaluating FHIRPath expression: Unable to compare values of type {0} and {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_LEFT_VALUE_one = -FHIRPATH_LEFT_VALUE_other = Error evaluating FHIRPath expression: left operand to {1} can only have 1 value, but has {0} values -FHIRPATH_LEFT_VALUE_WRONG_TYPE = Error evaluating FHIRPath expression: left operand to {0} has the wrong type {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RIGHT_VALUE_one = -FHIRPATH_RIGHT_VALUE_other = Error evaluating FHIRPath expression: right operand to {1} can only have 1 value, but has {0} values -FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Error evaluating FHIRPath expression: right operand to {0} has the wrong type {1} -FHIRPATH_OP_INCOMPATIBLE = Error evaluating FHIRPath expression {0}: left and right operand have incompatible or invalid types ({1}, {2}) -FHIRPATH_HO_HOST_SERVICES = Internal Error evaluating FHIRPath expression: No host services are provided ({0}) -FHIRPATH_WRONG_PARAM_TYPE = Error evaluating FHIRPath expression: The parameter type {2} is not legal for {0} parameter {1}. expecting {3} -FHIRPATH_ORDERED_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered collections -FHIRPATH_PRIMITIVE_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on primitives -FHIRPATH_REFERENCE_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered string, uri, canonical or Reference but found {1} -FHIRPATH_CODED_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered string, code, uri, Coding, CodeableConcept but found {1} -FHIRPATH_STRING_ORD_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered collection of string, uri, code, id but found {1} -FHIRPATH_STRING_SING_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on string, uri, url, code, id but found {1} -FHIRPATH_NO_COLLECTION = Error evaluating FHIRPath expression: The function {0} can only be used on a singleton value but found {1} -FHIRPATH_NOT_IMPLEMENTED = Error evaluating FHIRPath expression: The function {0} is not implemented -FHIRPATH_PARAM_WRONG = Error evaluating FHIRPath expression: The expression type {0} is not supported for parameter {1} on function {2} -FHIRPATH_CHECK_FAILED = Error evaluating FHIRPath expression: The check {0} failed -FHIRPATH_NO_TYPE = Error evaluating FHIRPath expression: No type provided at {1} -FHIRPATH_UNKNOWN_TYPE = Error evaluating FHIRPath expression: The type ''{0}'' is unknown or not supported at {1} -FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Error in discriminator at {0}: found a sliced element while resolving the fixed value for one of the slices -FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = Problem with use of resolve() - profile {0} on {1} could not be resolved -FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = Invalid use of resolve() in discriminator - no type on element {0} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = Invalid use of resolve() in discriminator - {0} possible types on {1} (can only be one) -FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Invalid use of resolve() in discriminator - type on {0} is not Reference {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_one = -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Invalid use of resolve() in discriminator - {0} possible target type profiles on {1} (can only be one) -FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Problem with use of resolve() - profile {0} on {1} could not be resolved -FHIRPATH_DISCRIMINATOR_TYPE_NONE = Invalid use of ofType() in discriminator - no type on element {0} -FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = Invalid use of ofType() in discriminator - Multiple possible types on {0} -FHIRPATH_DISCRIMINATOR_NO_CODE = Invalid use of ofType() in discriminator - Type has no code on {0} -FHIRPATH_DISCRIMINATOR_BAD_NAME = Invalid function name {0}() in discriminator -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = Invalid expression syntax in discriminator (group ''{0}'') -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = Invalid expression syntax in discriminator (const) -FHIRPATH_DISCRIMINATOR_CANT_FIND = Unable to resolve discriminator in definitions: {0} in profile {1} on element {2}, looking in profile {3} -FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Unable to resolve discriminator {0} on {2} found in the definitions because the extension {1} wasn''t found in the profile {3} -FHIRPATH_DISCRIMINATOR_NOTYPE = Error in discriminator at {0}: no children, no type -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Error in discriminator at {1}: no children, {0} types -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Error in discriminator at {1}: no children, {0} type profiles -FHIRPATH_UNABLE_BOOLEAN = Unable to evaluate as a boolean: {0} -XHTML_XHTML_DOCTYPE_ILLEGAL = Malformed XHTML: Found a DocType declaration, and these are not allowed (XXE security vulnerability protection) -PACKAGE_VERSION_MISMATCH = FHIR Version mismatch in package {0}: version is {2} but must be {1} (path: {3}) -VALUESET_REFERENCE_UNKNOWN = The value set import {0} could not be found so cannot be checked -VALUESET_REFERENCE_INVALID_TYPE = The value set import {0} points to a resource of type {1} which is not valid -SD_MUST_HAVE_DERIVATION = StructureDefinition {0} must have a derivation, since it has a baseDefinition -VALIDATION_VAL_PROFILE_OTHER_VERSION = Profile is for a different version of FHIR ({0}) so has been ignored -VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profile for this version of FHIR - all OK -VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profile is for this version of FHIR, but is an invalid type {0} -RENDER_BUNDLE_HEADER_ROOT = Bundle {0} of type {1} -RENDER_BUNDLE_HEADER_ENTRY = Entry {0} -RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - fullUrl = {1} -RENDER_BUNDLE_RESOURCE = Resource {0}: -RENDER_BUNDLE_SEARCH = Search: -RENDER_BUNDLE_SEARCH_MODE = Mode = {0} -RENDER_BUNDLE_SEARCH_SCORE = Score = {0} -RENDER_BUNDLE_RESPONSE = Response: -RENDER_BUNDLE_LOCATION = Location = {0} -RENDER_BUNDLE_ETAG = ETag = {0} -RENDER_BUNDLE_LAST_MOD = LastModified = {0} -RENDER_BUNDLE_REQUEST = Request: -RENDER_BUNDLE_IF_NON_MATCH = If-None-Match = {0} -RENDER_BUNDLE_IF_MOD = If-Modified-Since = {0} -RENDER_BUNDLE_IF_MATCH = If-Match = {0} -RENDER_BUNDLE_IF_NONE = If-None-Exist = {0} -BUNDLE_RULE_NONE = No Rule -BUNDLE_RULE_UNKNOWN = Bundle Rule refers to invalid resource {0} -BUNDLE_RULE_INVALID_INDEX = Bundle Rules index is invalid ({0}) -BUNDLE_RULE_PROFILE_UNKNOWN = Bundle Rules profile {1} is unknown for {0} -RENDER_BUNDLE_DOCUMENT_CONTENT = Additional Document Content -RENDER_BUNDLE_HEADER_DOC_ENTRY_URD = {0}. {1} ({2}/{3}) -RENDER_BUNDLE_HEADER_DOC_ENTRY_U = {0}. {1} -RENDER_BUNDLE_HEADER_DOC_ENTRY_RD = {0}. {2}/{3} -UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = Unable to check whether the code is in the value set {0} because the code system {1} was not found -TERMINOLOGY_TX_SYSTEM_WRONG_HTML = The code system reference {0} is wrong - the code system reference cannot be to an HTML page. This may be the correct reference: {1} -TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = The code system reference {0} is wrong - the code system reference cannot be a reference to build.fhir.org. This may be the correct reference: {1} -FHIRPATH_BAD_DATE = Unable to parse Date {0} -FHIRPATH_NUMERICAL_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on integer, decimal or Quantity but found {1} -FHIRPATH_DECIMAL_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on a decimal but found {1} -FHIRPATH_CONTINUOUS_ONLY= Error evaluating FHIRPath expression: The function {0} can only be used on a decimal or date type but found {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_FOCUS_one = -FHIRPATH_FOCUS_other = Error evaluating FHIRPath expression: focus for {0} can only have one value, but has {0} values -REFERENCE_REF_SUSPICIOUS = The syntax of the reference ''{0}'' looks incorrect, and it should be checked -XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = Invalid element name inside a paragraph in the XHTML (''{0}'') -UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Unsupported property {3} on type {2} for pattern for discriminator ({0}) for slice {1} -UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Unsupported: no properties with values found on type {2} for pattern for discriminator ({0}) for slice {1} -SD_NESTED_MUST_SUPPORT_DIFF = The element {0} has types/profiles/targets that are marked as must support, but the element itself is not marked as must-support. The inner must-supports will be ignored unless the element inherits must-support = true -SD_NESTED_MUST_SUPPORT_SNAPSHOT = The element {0} has types/profiles/targets that are marked as must support, but the element itself is not marked as must-support -Unable_to_connect_to_terminology_server = Unable to connect to terminology server at {1}. Error = {0} -SD_ED_TYPE_PROFILE_UNKNOWN = Unable to resolve profile {0} -SD_ED_TYPE_PROFILE_NOTYPE = Found profile {0}, but unable to determine the type it applies to -SD_ED_TYPE_PROFILE_WRONG = Profile {0} is for type {1}, but the {3} element has type {2} +Resource_resolution_services_not_provided = Resource resolution services not provided +Resource_type_mismatch_for___ = Resource type mismatch for {0} / {1} +SCT_NO_MRCM = Not validated against the Machine Readable Concept Model (MRCM) +SD_CONSTRAINED_KIND_NO_MATCH = The kind {0} must be the same as the kind {1} in the base structure {3} (base type = {2}) +SD_CONSTRAINED_TYPE_NO_MATCH = The type {0} must be the same as the type in the base structure {1} that is being constrained +SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = Review the extension type for {1}: extensions should not have a context of {0} unless it''s really intended that they can be used anywhere +SD_CONTEXT_SHOULD_NOT_BE_FHIRPATH = Review the extension type for {1}: the context of {0} appears to be a simple element, so the context type should be ''element'' not ''fhirpath'' +SD_DERIVATION_KIND_MISMATCH = The structure definition constrains a kind of {0}, but has a different kind ({1}) +SD_ED_BIND_MULTIPLE_TYPES = The element {0} has a binding, and has multiple types subject to bindings ({1}). The binding will apply to all the types +SD_ED_BIND_NOT_VS = The valueSet reference {1} on element {0} points to something that is not a value set ({2}) +SD_ED_BIND_NO_BINDABLE = The element {0} has a binding, but no bindable types are present {1} +SD_ED_BIND_UNKNOWN_VS = The valueSet reference {1} on element {0} could not be resolved +SD_ED_SHOULD_BIND = The element {0} has a type that should have a binding ({1}), but no binding is present +SD_ED_SHOULD_BIND_WITH_VS = The element {0} has a type that should have a binding ({1}), but the binding has no value set +SD_ED_TYPE_NO_TARGET_PROFILE = Type {0} does not allow for target Profiles SD_ED_TYPE_PROFILE_IS_MODIFIER = Profile {0} is for not for a modifier extension, but the {3} element is a modifier +SD_ED_TYPE_PROFILE_NOTYPE = Found profile {0}, but unable to determine the type it applies to SD_ED_TYPE_PROFILE_NOT_MODIFIER = Profile {0} is for a modifier extension, but the {3} element is not a modifier +SD_ED_TYPE_PROFILE_UNKNOWN = Unable to resolve profile {0} +SD_ED_TYPE_PROFILE_WRONG = Profile {0} is for type {1}, but the {3} element has type {2} SD_ED_TYPE_PROFILE_WRONG_TARGET = Profile {0} is for type {1}, which is not a {4} (which is required because the {3} element has type {2}) -SD_ED_TYPE_NO_TARGET_PROFILE = Type {0} does not allow for target Profiles -TERMINOLOGY_TX_NOSVC_BOUND_REQ = Could not confirm that the codes provided are from the required value set {0} because there is no terminology service -TERMINOLOGY_TX_NOSVC_BOUND_EXT = Could not confirm that the codes provided are from the extensible value set {0} because there is no terminology service -ARRAY_CANNOT_BE_EMPTY = Array cannot be empty - the property should not be present if it has no values -XHTML_URL_DATA_NO_DATA = No data found in data: URL -XHTML_URL_DATA_DATA_INVALID_COMMA = Comma found in data portion of data URL: {0} -XHTML_URL_DATA_DATA_INVALID = The data should be valid base64 content for a data: URL: {0} -XHTML_URL_DATA_MIMETYPE = The mimetype portion of the data: URL is not valid ({1}) in URL: {0} -SD_ED_SHOULD_BIND = The element {0} has a type that should have a binding ({1}), but no binding is present -SD_ED_SHOULD_BIND_WITH_VS = The element {0} has a type that should have a binding ({1}), but the binding has no value set -SD_ED_BIND_UNKNOWN_VS = The valueSet reference {1} on element {0} could not be resolved -SD_ED_BIND_NOT_VS = The valueSet reference {1} on element {0} points to something that is not a value set ({2}) -SD_ED_BIND_NO_BINDABLE = The element {0} has a binding, but no bindable types are present {1} -SD_ED_BIND_MULTIPLE_TYPES = The element {0} has a binding, and has multiple types subject to bindings ({1}). The binding will apply to all the types -DISCRIMINATOR_BAD_PATH = Error processing path expression for discriminator: {0} (src = ''{1}'') -SLICING_CANNOT_BE_EVALUATED = Slicing cannot be evaluated: {0} -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' does not resolve -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' exists, but can''t be loaded, so it can''t be checked for validity -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' refers to a resource that has the wrong type. Found {1} expecting one of {2} -CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} is a supplement, so can''t be used as a value in Coding.system -CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} cannot be found, so can''t check if concepts are valid -CODESYSTEM_CS_SUPP_INVALID_CODE = The code ''{1}'' is not declared in the base CodeSystem {0} so is not valid in the supplement -SD_VALUE_TYPE_IILEGAL = The element {0} has a {1} of type {2}, which is not in the list of allowed types ({3}) -SD_VALUE_TYPE_REPEAT_HINT = The repeating element has a {1}. The {1} will apply to all the repeats (this has not been clear to all users) -SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = The repeating element has a {1} value for a primitive type. The DotNet validator will not apply this to all the repeats - this is an error -SD_NO_TYPES_OR_CONTENTREF = The element {0} has no assigned types, and no content reference -CODESYSTEM_CS_UNK_EXPANSION = The code provided ({2}) is not in the expansion in the value set {0}, and a code is required from this value set. The system {1} could not be found. -BUNDLE_SEARCH_NOSELF = SearchSet Bundles should have a self link that specifies what the search was -BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = No types could be determined from the search string, so the types can''t be checked -BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entries must have resources -BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Unable to determine if this resource is a valid resource type for this search -BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Search results must have ids -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = This is not a matching resource type for the specified search ({0} expecting {1}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = This is not an OperationOutcome ({0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = This is not a matching resource type for the specified search (is a search mode needed?) ({0} expecting {1}) -BUNDLE_SEARCH_NO_MODE = SearchSet bundles should have search modes on the entries -INV_FAILED = Constraint failed: {0} -INV_FAILED_SOURCE = Constraint failed: {0} (defined in {1}) -PATTERN_CHECK_STRING = The pattern [{0}] defined in the profile {1} not found. Issues: {2} -TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = Example URLs are not allowed in this context ({0}) -UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = The Unicode sequence has bi-di control characters which are not allowed in this context: {0} -UNICODE_BIDI_CONTROLS_CHARS_MATCH = The Unicode sequence has unterminated bi-di control characters (see CVE-2021-42574): {0} -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7 Defined CodeSystems SHALL have a stated value for the {0} element so that users know the status and meaning of the code system clearly -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7 Defined CodeSystems SHOULD have a stated value for the {0} element so that users know the status and meaning of the code system clearly -CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystems SHOULD have a stated value for the {0} element so that users know the status and meaning of the code system clearly -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystems SHOULD NOT have a stated value for the {0} element when they are a supplement -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = CodeSystem Supplements SHALL have a content value of 'supplement' -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = CodeSystem Supplements with a content value of 'supplement' SHALL have a supplements element that specifies which code system is being supplemented -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_QTY = Found {0} of type {2} in the profile validating a Quantity (so it must be a Quantity) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = The minValue in the profile has a system of {0} which is different to the system in the value {1} so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = The minValue in the profile has a system code of {0} which is different to the system code in the value {1} so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = The minValue in the profile doesn''t have an actual value, so the minimum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = The quantity doesn''t have an actual value, so the minimum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = The minValue in the profile has no system so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = The value has no system so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = The minValue in the profile has no code so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = The value has no code so the minimum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = There is no UCUM service, and the UCUM codes aren''t identical, so the minimum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Unable to convert value {0} from unit {1} to minValue unit {2} based on UCUM definitions; minimum value is not valid -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = The value in the instance ({2}) is less than the specified minimum value ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = The value in the instance ({0} {1}) is less than the specified minValue ({2} {3}) after UCUM conversion -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_QTY = Found {0} of type {2} in the profile validating a Quantity (so it must be a Quantity) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = The maxValue in the profile has a system of {0} which is different to the system in the value {1} so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = The maxValue in the profile has a system code of {0} which is different to the system code in the value {1} so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = The maxValue in the profile doesn''t have an actual value, so the maximum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = The quantity doesn''t have an actual value, so the maximum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = The maxValue in the profile has no system so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = The value has no system so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = The maxValue in the profile has no code so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = The value has no code so the maximum value cannot be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = There is no UCUM service, and the UCUM codes aren''t identical, so the maximum value can''t be checked -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Unable to convert value {0} from unit {1} to maxValue unit {2} based on UCUM definitions; maximum value is not valid -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = The value in the instance ({2}) is greater than the specified maximum value ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = The value in the instance ({0} {1}) is greater than the specified maxValue ({2} {3}) after UCUM conversion -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64 encoded values are not allowed to contain any whitespace (per RFC 4648). Note that non-validating readers are encouraged to accept whitespace anyway -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64 encoded values SHOULD not contain any whitespace (per RFC 4648). Note that non-validating readers are encouraged to accept whitespace anyway -SD_DERIVATION_KIND_MISMATCH = The structure definition constrains a kind of {0}, but has a different kind ({1}) -VALUESET_IMPORT_UNION_INTERSECTION = This value set has a single include with multiple imported value sets. Per issue https://jira.hl7.org/browse/FHIR-25179, there has been confusion in the past whether these value sets are unioned or intersectioned. If this value set is contained in a package published prior to March 31 2022, it will be treated as a union, otherwise it will be treated as an intersection. If want a union, split the value set imports across multiple includes -TX_SERVER_NO_BATCH_RESPONSE = The server return null from a batch validation request -BUNDLE_POSSSIBLE_MATCHES = The bundle contains no match for {1} by the rules of Bundle reference resolution, but it has multiple resources that match {0} by resource type and id -BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = Entry {0} matches the reference {1} by type and id but it does not match the full target URL {2} by Bundle resolution rules -BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = Entry {0} matches the reference {1} by type and id but it''s fullUrl {2} does not match the full target URL {3} by Bundle resolution rules +SD_ED_TYPE_PROFILE_WRONG_TYPE_one = The type {0} is not in the list of allowed type {1} in the profile {2} +SD_ED_TYPE_PROFILE_WRONG_TYPE_other = The type {0} is not in the list of allowed types {1} in the profile {2} +SD_ELEMENT_FIXED_WRONG_TYPE = The base element has a fixed type of ''{0}'', so this element must have a fixed value of the same type, not ''{1}'' +SD_ELEMENT_NOT_IN_CONSTRAINT = The element definition for {1} has a property {0} which is not allowed in a profile +SD_ELEMENT_PATTERN_WRONG_TYPE = The base element has a pattern type of ''{0}'', so this element must have a pattern value of the same type, not ''{1}'' +SD_ELEMENT_REASON_DERIVED = , because the value must match the fixed value define in ''{0}'' +SD_EXTENSION_URL_MISMATCH = The fixed value for the extension URL is {1} which doesn''t match the canonical URL {0} +SD_EXTENSION_URL_MISSING = The value of Extension.url is not fixed to the extension URL {0} SD_ILLEGAL_CHARACTERISTICS = This element has a {0} but the types {1} do not make this kind of constraint relevant -SD_VALUE_COMPLEX_FIXED = For the complex type {0}, consider using a pattern rather than a fixed value to avoid over-constraining the instance -VALUESET_SHAREABLE_MISSING = Published value sets SHOULD conform to the ShareableValueSet profile, which says that the element ValueSet.{0} is mandatory, but it is not present -VALUESET_SHAREABLE_EXTRA_MISSING = Published value sets SHOULD conform to the ShareableValueSet profile, which says that the element ValueSet.{0} should be present, but it is not -VALUESET_SHAREABLE_MISSING_HL7 = Published value sets SHALL conform to the ShareableValueSet profile, which says that the element ValueSet.{0} is mandatory, but it is not present -VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = Published value sets SHALL conform to the ShareableValueSet profile, which says that the element ValueSet.{0} should be present, but it is not -CODESYSTEM_SHAREABLE_MISSING = Published code systems SHOULD conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} is mandatory, but it is not present -CODESYSTEM_SHAREABLE_EXTRA_MISSING = Published code systems SHOULD conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} should be present, but it is not -CODESYSTEM_SHAREABLE_MISSING_HL7 = Published code systems SHALL conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} is mandatory, but it is not present -CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = Published code systems SHALL conform to the ShareableCodeSystem profile, which says that the element CodeSystem.{0} should be present, but it is not -CONCEPTMAP_SHAREABLE_MISSING = Published concept maps SHOULD conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} is mandatory, but it is not present -CONCEPTMAP_SHAREABLE_EXTRA_MISSING = Published concept maps SHOULD conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} should be present, but it is not -CONCEPTMAP_SHAREABLE_MISSING_HL7 = Published concept maps SHALL conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} is mandatory, but it is not present -CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = Published concept maps SHALL conform to the ShareableConceptMap profile, which says that the element ConceptMap.{0} should be present, but it is not -MEASURE_SHAREABLE_MISSING = Published measures SHOULD conform to the ShareableMeasure profile, which says that the element Measure.{0} is mandatory, but it is not present -MEASURE_SHAREABLE_EXTRA_MISSING = Published measures SHOULD conform to the ShareableMeasure profile, which says that the element Measure.{0} should be present, but it is not -MEASURE_SHAREABLE_MISSING_HL7 = Published measures SHALL conform to the ShareableMeasure profile, which says that the element Measure.{0} is mandatory, but it is not present -MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = Published measures SHALL conform to the ShareableMeasure profile, which says that the element Measure.{0} should be present, but it is not -TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = The markdown contains content that appears to be an embedded HTML tag starting at ''{0}''. This will (or SHOULD) be escaped by the presentation layer. The content should be checked to confirm that this is the desired behaviour -TYPE_SPECIFIER_ILLEGAL_TYPE = The Type specifier {1} specified an invalid type {0} -TYPE_SPECIFIER_ABSTRACT_TYPE = The Type specifier {1} specified an abstract type {0} -TYPE_SPECIFIER_NM_ILLEGAL_TYPE = No Type specifier matched, and the underlying type {0} is not valid -TYPE_SPECIFIER_NM_ABSTRACT_TYPE = No Type specifier matched, and the underlying type {0} is not abstract -ELEMENT_CANNOT_BE_NULL = The element is not allowed to be ''null'' -#The following error cannot occur for a single item. _one case left intentionally blank. -MULTIPLE_LOGICAL_MODELS_one= -MULTIPLE_LOGICAL_MODELS_other={0} Logical Models found in supplied profiles, so unable to parse logical model (can only be one, found {1}) -UNRECOGNISED_PROPERTY_TYPE = Invalid JSON type {0} for the element {1}; valid types = {2} -UNRECOGNISED_PROPERTY_TYPE_WRONG = Invalid type {2} for the element {1}; valid types = {3}, JSON type = {0} +SD_MUST_HAVE_DERIVATION = StructureDefinition {0} must have a derivation, since it has a baseDefinition +SD_NESTED_MUST_SUPPORT_DIFF = The element {0} has types/profiles/targets that are marked as must support, but the element itself is not marked as must-support. The inner must-supports will be ignored unless the element inherits must-support = true +SD_NESTED_MUST_SUPPORT_SNAPSHOT = The element {0} has types/profiles/targets that are marked as must support, but the element itself is not marked as must-support +SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = The type is {0} so an extension context invariants should not be specified +SD_NO_CONTEXT_WHEN_NOT_EXTENSION = The type is {0} so an extension context should not be specified +SD_NO_SLICING_ON_ROOT = Slicing is not allowed at the root of a profile +SD_NO_TYPES_OR_CONTENTREF = The element {0} has no assigned types, and no content reference +SD_NO_TYPE_CODE_ON_CODE = Snapshot for {1} element {0} has type.code without a value +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_BASE = The profile ''{0}'' has a different base ''{1}'' from that expected ''{2}'' +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_TYPE = The profile ''{0}'' is not marked as an obligation profile +SD_OBGLIGATION_INHERITS_PROFILE_NO_TARGET = Unable to read a value from this extension +SD_OBGLIGATION_INHERITS_PROFILE_TARGET_NOT_FOUND = The profile ''{0}'' could not be found +SD_OBGLIGATION_PROFILE_DERIVATION = Only profiles that constrain another profile can be marked as an obligation profile +SD_OBGLIGATION_PROFILE_ILLEGAL = The element ''{0}'' has a property ''{1}'' which is not allowed in Obligation profiles +SD_OBGLIGATION_PROFILE_ILLEGAL_BINDING = The element ''{0}'' has a binding when the base element does not, and this is not allowed in Obligation profiles +SD_OBGLIGATION_PROFILE_ILLEGAL_ON_BINDING = The element ''{0}'' has a binding property ''{1}'' which is not allowed in Obligation profiles +SD_OBGLIGATION_PROFILE_INVALID_BINDING_CODE = The element ''{0}'' has an additional binding purpose of ''{1}'' which is not allowed in Obligation profiles +SD_OBGLIGATION_PROFILE_INVALID_BINDING_STRENGTH =The element ''{0}'' has a different binding strength (''{1}'') from the base (''{2}'') which is not allowed in Obligation profiles +SD_OBGLIGATION_PROFILE_PATH_WRONG = The element ''{0}'' path value of ''{1}'' doesn''t match the base path ''{2}'' +SD_OBGLIGATION_PROFILE_UKNOWN = The profile is marked as an obligation profile, but it''s correctness cannot be checked since the base profile ''{0}'' is not known +SD_OBGLIGATION_PROFILE_UNMATCHED = The element ''{0}'' has no equivalent in the profile ''{1}'' on which this Obligation Profile is based +SD_PATH_TYPE_MISMATCH = The path {1} must start with the type of the structure {0} +SD_SPECIALIZED_TYPE_MATCHES = The type {0} must not be the same as the type in the base structure {1} that is being specialised SD_TYPE_MISSING = No type found -SD_TYPE_NOT_MATCH_NS = The type namespace {0} SHOULD match the url namespace {1} for the definition of the type SD_TYPE_NOT_DERIVED = The type {0} can only be used as a type when constraining the base definition of the type SD_TYPE_NOT_LOCAL = The type {0} is not legal because it is not defined in the FHIR specification. Other types must have a namespace on them -SD_TYPE_NOT_LOGICAL = The type {0} can only be defined if the kind is 'logical' not {1} -SD_CONSTRAINED_TYPE_NO_MATCH = The type {0} must be the same as the type in the base structure {1} that is being constrained -SD_SPECIALIZED_TYPE_MATCHES = The type {0} must not be the same as the type in the base structure {1} that is being specialised -SD_CONSTRAINED_KIND_NO_MATCH = The kind {0} must be the same as the kind {1} in the base structure {3} (base type = {2}) -SD_PATH_TYPE_MISMATCH = The path {1} must start with the type of the structure {0} -UNABLE_TO_RESOLVE_CONTENT_REFERENCE = Unable to resolve the content reference {0} on element {1} (path = {2}) -UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = Unable to resolve the content reference {0} on element {1} (path = {2}) in this context -RESOURCETYPE_PROPERTY_WRONG_TYPE = The JSON element ''resourceType'' has the wrong JSON type: {0} -DUPLICATE_JSON_PROPERTY = The JSON property ''{0}'' is a duplicate and will be ignored -DUPLICATE_JSON_PROPERTY_KEY = The JSON property ''{0}'' is a duplicate and will be ignored -JSON_PROPERTY_NO_QUOTES = The JSON property ''{0}'' has no quotes around the name of the property -JSON_PROPERTY_VALUE_NO_QUOTES = The JSON property ''{0}'' has no quotes around the value of the property ''{1}'' -JSON_COMMA_MISSING = A Comma is missing in the JSON -JSON_COMMA_EXTRA = There is an extra comma at the end of the {0} in the JSON -JSON_COMMENTS_NOT_ALLOWED = Comments are not allowed in JSON -BUNDLE_LINK_UNKNOWN = The link relationship type ''{0}'' is unknown and not allowed in this context -BUNDLE_LINK_SEARCH_PROHIBITED = The link relationship type ''{0}'' used in search sets is prohibited in this context -BUNDLE_LINK_SEARCH_NO_DUPLICATES = The link relationship type ''{0}'' can only occur once -BUNDLE_LINK_STYELSHEET_EXTERNAL = External Stylesheets other than https://hl7.org/fhir/fhir.css SHOULD not be used -BUNDLE_LINK_STYELSHEET_INSECURE = The stylesheet reference is not secure -BUNDLE_LINK_STYELSHEET_LINKABLE = The stylesheet reference is not a resolvable link -BUNDLE_LINK_STYELSHEET_NOT_FOUND = The stylesheet reference could not be resolved in this bundle -EXT_VER_URL_NO_MATCH = Extension URLs don''t have versions. The validator wasn''t able to resolve this URL with or without version-based resolution -EXT_VER_URL_IGNORE = Extension URLs don''t have versions. The validator has ignored the version and processed the extension anyway -EXT_VER_URL_MISLEADING = The extension URL contains a ''|'' which makes it look like a versioned URL, but it''s not, and this is confusing for implementers -EXT_VER_URL_NOT_ALLOWED = The extension URL must not contain a version -EXT_VER_URL_REVERSION = The extension URL must not contain a version. The extension was validated against version {0} of the extension -ILLEGAL_COMMENT_TYPE = The fhir_comments property must be an array of strings -SD_NO_SLICING_ON_ROOT = Slicing is not allowed at the root of a profile -REFERENCE_REF_QUERY_INVALID = The query part of the conditional reference is not a valid query string ({0}) -SM_RULEGROUP_NOT_FOUND = The group {0} could not be resolved -SM_RULEGROUP_PARAM_COUNT_MISMATCH = The group {0} is invoked using {1} parameters, but it actually takes {2} instead -SM_NAME_INVALID = The name {0} is not valid -SM_GROUP_NAME_DUPLICATE = The Group name ''{0}'' is already used -SM_GROUP_INPUT_DUPLICATE = The name {0} is already used +SD_TYPE_NOT_LOGICAL = The type {0} can only be defined if the kind is ''logical'' not {1} +SD_TYPE_NOT_MATCH_NS = The type namespace {0} SHOULD match the url namespace {1} for the definition of the type +SD_VALUE_COMPLEX_FIXED = For the complex type {0}, consider using a pattern rather than a fixed value to avoid over-constraining the instance +SD_VALUE_TYPE_IILEGAL = The element {0} has a {1} of type {2}, which is not in the list of allowed types ({3}) +SD_VALUE_TYPE_REPEAT_HINT = The repeating element has a {1}. The {1} will apply to all the repeats (this has not been clear to all users) +SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = The repeating element has a {1} value for a primitive type. The DotNet validator will not apply this to all the repeats - this is an error +SEARCHPARAMETER_BASE_WRONG = The resource type {1} is not listed as a base in the SearchParameter this is derived from ({0}) +SEARCHPARAMETER_EXP_WRONG = The expression ''{2}'' is not compatible with the expression ''{1}'' in the derivedFrom SearchParameter {0}, and this likely indicates that the derivation relationship is not valid +SEARCHPARAMETER_MISSING_COMPONENTS = When the SearchParameter has a type of ''composite'', then the SearchParameter must define two or more components +SEARCHPARAMETER_NOTFOUND = Unable to find the base Search Parameter {0} so can''t check that this SearchParameter is a proper derivation from it +SEARCHPARAMETER_TYPE_WRONG = The type {1} is different to the type {0} in the derivedFrom SearchParameter +SECURITY_STRING_CONTENT_ERROR = The string value contains text that looks like embedded HTML tags, which are not allowed for security reasons in this context +SECURITY_STRING_CONTENT_WARNING = The string value contains text that looks like embedded HTML tags. If this content is rendered to HTML without appropriate post-processing, it may be a security risk +SLICING_CANNOT_BE_EVALUATED = Slicing cannot be evaluated: {0} +SM_DEPENDENT_PARAM_MODE_MISMATCH = The parameter {0} refers to the variable {1} but it''s mode is {2} which is not the same as the mode required for the group {3} +SM_DEPENDENT_PARAM_NOT_FOUND = The {1} parameter ''{0}'' was not found +SM_DEPENDENT_PARAM_TYPE_MISMATCH = The parameter ''{0}'' refers to the variable ''{1}'' but it''s type is ''{2}'' which is not compatible with the type required for the group ''{3}'', which is ''{4}'' (from map ''{5}'') +SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = The group {0} has already been used with different parameters, so the type checking may be incorrect (other = [{1}]; this = [{2}]) +SM_GROUP_INPUT_DUPLICATE = The name {0} is already used SM_GROUP_INPUT_MODE_INVALID = The group parameter {0} mode {1} isn''t valid +SM_GROUP_INPUT_MODE_MISMATCH = The type ''{0}'' has mode ''{1}'' which doesn''t match the structure definition mode of ''{2}'' SM_GROUP_INPUT_NO_TYPE = Group {1} parameter {0} has no type, so the paths cannot be validated SM_GROUP_INPUT_TYPE_NOT_DECLARED = The type {0} is not declared and is unknown -SM_GROUP_INPUT_MODE_MISMATCH = The type ''{0}'' has mode ''{1}'' which doesn''t match the structure definition mode of ''{2}'' SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = The type {0} which maps to the canonical URL {1} is not known, so the paths cannot be validated SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = The type {0} is not known, so the paths cannot be validated -SM_SOURCE_CONTEXT_UNKNOWN = The source context {0} is not known at this point -SM_SOURCE_PATH_INVALID = The source path {0}.{1} refers to the path {2} which is unknown -SM_RULE_SOURCE_MIN_REDUNDANT = The min value of {0} is redundant since the valid min is {0} -SM_RULE_SOURCE_MAX_REDUNDANT = The max value of {0} is redundant since the valid max is {0} -SM_RULE_SOURCE_LISTMODE_REDUNDANT = The listMode value of {0} is redundant since the valid max is {0} -SM_TARGET_CONTEXT_UNKNOWN = The target context ''{0}'' is not known at this point -SM_TARGET_PATH_INVALID = The target path {0}.{1} refers to the path {2} which is unknown -SM_NO_LIST_MODE_NEEDED = A list mode should not be provided since this is a rule that can only be executed once -SM_NO_LIST_RULE_ID_NEEDED = A list ruleId should not be provided since this is a rule that can only be executed once +SM_GROUP_NAME_DUPLICATE = The Group name ''{0}'' is already used +SM_IMPORT_NOT_FOUND = No maps were found to match {0} - validation may be wrong SM_LIST_RULE_ID_ONLY_WHEN_SHARE = A ruleId should only be provided when the rule mode is ''share'' +SM_MATCHING_RULEGROUP_NOT_FOUND = Unable to find a default rule for the type pair source={0} and target={1} +SM_NAME_INVALID = The name {0} is not valid +SM_NO_LIST_MODE_NEEDED = A list mode should not be provided since this is a rule that can only be executed once +SM_NO_LIST_RULE_ID_NEEDED = A list ruleId should not be provided since this is a rule that can only be executed once +SM_ORPHAN_GROUP = The group {0} is not called successfully from within this mapping script, and does not have types on it''s inputs, so type verification is not possible +SM_RULEGROUP_NOT_FOUND = The group {0} could not be resolved +SM_RULEGROUP_PARAM_COUNT_MISMATCH = The group {0} is invoked using {1} parameters, but it actually takes {2} instead +SM_RULE_SOURCE_MAX_REDUNDANT = The max value of {0} is redundant since the valid max is {0} +SM_RULE_SOURCE_MIN_REDUNDANT = The min value of {0} is redundant since the valid min is {0} SM_RULE_SOURCE_UNASSIGNED = The source statement doesn''t assign a variable to the source - check that this is what is intended -SM_TARGET_PATH_MULTIPLE_MATCHES = The target path {0}.{1} refers to the path {2} which could be a reference to multiple elements ({3}). No further checking can be performed +SM_SOURCE_CONTEXT_UNKNOWN = The source context {0} is not known at this point +SM_SOURCE_PATH_INVALID = The source path {0}.{1} refers to the path {2} which is unknown SM_SOURCE_TYPE_INVALID = The type {0} is not valid in the source context {1}. The possible types are [{2}] -SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = Transform {0} takes {1}-{2} parameter(s) but {3} were found -SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = Transform {0} takes {1} parameter(s) but {2} were found -SM_TARGET_TRANSFORM_NOT_CHECKED = Transform {0} not checked yet +SM_SOURCE_TYPE_NOT_FOUND = No source type was found, so the default group for this implied dependent rule could not be determined +SM_TARGET_CONTEXT_UNKNOWN = The target context ''{0}'' is not known at this point SM_TARGET_NO_TRANSFORM_NO_CHECKED = When there is no transform, parameters can''t be provided -SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = The value of the type parameter for {0} could not be processed -SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = The parameter at index {0} could not be processed (type = {1}) +SM_TARGET_PATH_INVALID = The target path {0}.{1} refers to the path {2} which is unknown +SM_TARGET_PATH_MULTIPLE_MATCHES = The target path {0}.{1} refers to the path {2} which could be a reference to multiple elements ({3}). No further checking can be performed SM_TARGET_TRANSFORM_EXPRESSION_ERROR = The FHIRPath expression passed as the evaluate parameter is invalid: {0} -SM_IMPORT_NOT_FOUND = No maps were found to match {0} - validation may be wrong -SM_TARGET_TYPE_MULTIPLE_POSSIBLE = Multiple types are possible here ({0}) so further type checking is not possible -SM_TARGET_TRANSFORM_TYPE_UNKNOWN = The type ''{0}'' is not known -SM_DEPENDENT_PARAM_MODE_MISMATCH = The parameter {0} refers to the variable {1} but it''s mode is {2} which is not the same as the mode required for the group {3} -SM_DEPENDENT_PARAM_NOT_FOUND = The {1} parameter ''{0}'' was not found -SM_DEPENDENT_PARAM_TYPE_MISMATCH = The parameter ''{0}'' refers to the variable ''{1}'' but it''s type is ''{2}'' which is not compatible with the type required for the group ''{3}'', which is ''{4}'' (from map ''{5}'') -SM_ORPHAN_GROUP = The group {0} is not called successfully from within this mapping script, and does not have types on it''s inputs, so type verification is not possible -SM_SOURCE_TYPE_NOT_FOUND = No source type was found, so the default group for this implied dependent rule could not be determined -SM_TARGET_TYPE_NOT_FOUND = No target type was found, so the default group for this implied dependent rule could not be determined -SM_MATCHING_RULEGROUP_NOT_FOUND = Unable to find a default rule for the type pair source={0} and target={1} SM_TARGET_TRANSFORM_MISSING_PARAMS = One or more parameters to the translate operation are missing (should be 3, was {0}) -SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = No value for the {0} parameter found -SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = The source variable {0} is unknown -SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = The {1} variable {2} is unknown for the transform {0} +SM_TARGET_TRANSFORM_NOT_CHECKED = Transform {0} not checked yet SM_TARGET_TRANSFORM_OP_INVALID_TYPE = The {1} variable {0} type {2} is invalid - must be a primitive -SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = The map_uri ''{0}'' could not be resolved, so the map can''t be checked +SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = The {1} variable {2} is unknown for the transform {0} +SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = Transform {0} takes {1}-{2} parameter(s) but {3} were found +SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = Transform {0} takes {1} parameter(s) but {2} were found +SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = The parameter at index {0} could not be processed (type = {1}) SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = The value ''{0}'' for the output parameter is incorrect +SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = The map_uri ''{0}'' could not be resolved, so the map can''t be checked +SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = No value for the {0} parameter found +SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = The source variable {0} is unknown +SM_TARGET_TRANSFORM_TYPE_UNKNOWN = The type ''{0}'' is not known +SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = The value of the type parameter for {0} could not be processed SM_TARGET_TRANSLATE_BINDING_SOURCE = The source variable does not have a required binding, so this concept map can''t be checked -SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = The source variable refers to an unknown value set ''{0}'', so this concept map can''t be checked -SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = There was an error expanding the source value set, so this concept map can''t be checked: ''{0}'' SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = The source value set includes one or more codes that the map does not translate: {0} SM_TARGET_TRANSLATE_BINDING_TARGET = The target variable does not have a required binding, so this concept map can''t be checked -SM_TARGET_TRANSLATE_BINDING_VS_TARGET = The target variable refers to an unknown value set ''{0}'', so this concept map can''t be checked +SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = The map produces one or more codes that the target value set does not include: {0} +SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = There was an error expanding the source value set, so this concept map can''t be checked: ''{0}'' SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = There was an error expanding the target value set, so this concept map can''t be checked: ''{0}'' -SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = The map produces one or more codes that the target value set does not include: {0} -CONCEPTMAP_GROUP_SOURCE_MISSING = No Source Code System, so the source codes cannot be checked -CONCEPTMAP_GROUP_SOURCE_UNKNOWN = The Source Code System {0} is not fully defined and populated, and no sourceScope is specified, so the source code checking will not be performed -CONCEPTMAP_GROUP_TARGET_MISSING = No Target Code System, so the target codes cannot be checked -CONCEPTMAP_GROUP_TARGET_UNKNOWN = The Target Code System {0} is not fully defined and populated, and no targetScope is specified, so the target code checking will not be performed -CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = The source code ''{0}'' is not valid in the code system {1} -CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS = The source code ''{0}'' is not valid in the value set {1} -CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = The source display ''{0}'' is not valid. Possible codes {1} -CONCEPTMAP_GROUP_TARGET_CODE_INVALID = The target code ''{0}'' is not valid in the code system {1} -CONCEPTMAP_GROUP_TARGET_CODE_INVALID_VS = The target code ''{0}'' is not valid in the value set {1} -CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = The target display ''{0}'' is not valid. Possible displays {1} -CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = The property code ''{0}'' is not known -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = The type of this property should be {1} not {0} -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = Since no system has been provided, a plain code cannot be used -CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = The code {0} is invalid in the system {1} -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = The code system {0} could not be found, so code values can''t be checked -SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = The group {0} has already been used with different parameters, so the type checking may be incorrect (other = [{1}]; this = [{2}]) -CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Source Code System {0} doesn''t have all content (content = {1}), so the source codes cannot be checked -CONCEPTMAP_GROUP_TARGET_INCOMPLETE = Target Code System {0} doesn''t have all content (content = {1}), so the target codes cannot be checked -SD_NO_TYPE_CODE_ON_CODE = Snapshot for {1} element {0} has type.code without a value -UNKNOWN_CODESYSTEM = A definition for CodeSystem ''{0}'' could not be found, so the code cannot be validated -UNKNOWN_CODESYSTEM_VERSION = A definition for CodeSystem ''{0}'' version ''{1}'' could not be found, so the code cannot be validated. Valid versions: {2} -UNABLE_TO_INFER_CODESYSTEM = The System URI could not be determined for the code {0} in the ValueSet {1} -VALUESET_TOO_COSTLY = The value set {0} has too many codes to display ({1}) -VALUESET_TOO_COSTLY_TIME = The value set {0} took too long to process (>{1}sec) -NO_VALID_DISPLAY_FOUND_one = No valid Display Names found for {1}#{2} in the language {4} -NO_VALID_DISPLAY_FOUND_other = No valid Display Names found for {1}#{2} in the languages {4} -SD_NO_CONTEXT_WHEN_NOT_EXTENSION = The type is {0} so an extension context should not be specified -SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = The type is {0} so an extension context invariants should not be specified -SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = Review the extension type for {1}: extensions should not have a context of {0} unless it''s really intended that they can be used anywhere -SD_CONTEXT_SHOULD_NOT_BE_FHIRPATH = Review the extension type for {1}: the context of {0} appears to be a simple element, so the context type should be 'element' not 'fhirpath' -ED_PATH_WRONG_TYPE_MATCH = The path must be ''{0}'' not ''{1}'' when the type list is not constrained -ATTEMPT_TO_CHANGE_SLICING = The element at {0} defines the slicing {1} but then an element in the slicing {2} tries to redefine the slicing to {3} -REPEAT_SLICING_IGNORED = The element at {0} defines the slicing but then an element in the slicing {2} repeats it, which is ignored -SD_ELEMENT_NOT_IN_CONSTRAINT = The element definition for {1} has a property {0} which is not allowed in a profile -SD_OBGLIGATION_PROFILE_UKNOWN = The profile is marked as an obligation profile, but it's correctness cannot be checked since the base profile ''{0}'' is not known -SD_OBGLIGATION_PROFILE_DERIVATION = Only profiles that constrain another profile can be marked as an obligation profile -SD_OBGLIGATION_PROFILE_UNMATCHED = The element ''{0}'' has no equivalent in the profile ''{1}'' on which this Obligation Profile is based -SD_OBGLIGATION_PROFILE_PATH_WRONG = The element ''{0}'' path value of ''{1}'' doesn't match the base path ''{2}'' -SD_OBGLIGATION_PROFILE_ILLEGAL = The element ''{0}'' has a property ''{1}'' which is not allowed in Obligation profiles -SD_OBGLIGATION_PROFILE_ILLEGAL_ON_BINDING = The element ''{0}'' has a binding property ''{1}'' which is not allowed in Obligation profiles -SD_OBGLIGATION_PROFILE_ILLEGAL_BINDING = The element ''{0}'' has a binding when the base element does not, and this is not allowed in Obligation profiles -SD_OBGLIGATION_PROFILE_INVALID_BINDING_CODE = The element ''{0}'' has an additional binding purpose of ''{1}'' which is not allowed in Obligation profiles -SD_OBGLIGATION_PROFILE_INVALID_BINDING_STRENGTH =The element ''{0}'' has a different binding strength (''{1}'') from the base (''{2}'') which is not allowed in Obligation profiles -SD_OBGLIGATION_INHERITS_PROFILE_NO_TARGET = Unable to read a value from this extension -SD_OBGLIGATION_INHERITS_PROFILE_TARGET_NOT_FOUND = The profile ''{0}'' could not be found -SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_TYPE = The profile ''{0}'' is not marked as an obligation profile -SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_BASE = The profile ''{0}'' has a different base ''{1}'' from that expected ''{2}'' -RND_CS_CONTENT_COMPLETE = This code system defines the following codes: -RND_CS_CONTENT_EXAMPLE = This code system provides some codes that are example only: -RND_CS_CONTENT_FRAGMENT = This code system provides a fragment that includes following codes: -RND_CS_CONTENT_NOTPRESENT = This code system defines codes, but no codes are represented here -RND_CS_CONTENT_SUPPLEMENT = This code system defines {0} on the following codes: -QUESTIONNAIRE_Q_UNKNOWN_DERIVATION = The questionnaire ''{0}'' referred to in the derivation could not be found -QUESTIONNAIRE_Q_NO_DERIVATION_TYPE = The questionnaire ''{0}'' has no derivation type specified using the ''http://hl7.org/fhir/StructureDefinition/questionnaire-derivationType'' extension, so derivation has not been checked -QUESTIONNAIRE_Q_NO_DERIVATION_TYPE_VALUE = The derivation extension has no value -QUESTIONNAIRE_Q_DERIVATION_TYPE_IGNORED = The derivation type ''{0}'' means that no derivation checking has been performed against this questionnaire -QUESTIONNAIRE_Q_DERIVATION_TYPE_UNKNOWN = The derivation type ''{0}'' is unknown, which means that no derivation checking has been performed against this questionnaire -QUESTIONNAIRE_Q_ITEM_NOT_DERIVED = No item with linkId ''{1}'' found in questionnaire ''{0}'' -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_TYPE = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the type ''{2}'', and this cannot change to ''{3}'' -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REPEATS = The item with linkId ''{1}'' found in questionnaire ''{0}'' does not repeat, so it cannot repeat here -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REQUIRED = The item with linkId ''{1}'' found in questionnaire ''{0}'' is required, so it must be required here -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_DEFINITION = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}''. Is it intended to change this? -QUESTIONNAIRE_Q_ITEM_DERIVED_DEFINITION = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}'', so this should be repeated here -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_MAXLENGTH = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the maxLength of ''{2}'', so the max length cannot be greater than that -QUESTIONNAIRE_Q_ITEM_DERIVED_MAXLENGTH = The item with linkId ''{1}'' found in questionnaire ''{0}'' has the definition ''{2}'', so this item must also have a max length -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_ANSWER_TYPE = The item with linkId ''{1}'' found in questionnaire ''{0}'' has answer{2}, while this has answer{3}. This might be valid, but the vaidator can''t check that (yet?) -QUESTIONNAIRE_Q_ITEM_DERIVED_NI_ANSWER_VS = The validator can''t check derived item value set consistency (yet?) -QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS = The item with linkId ''{1}'' found in questionnaire ''{0}'' has answerOptions, so this item must have some too -QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS_NEW = The item with linkId ''{1}'' found in questionnaire ''{0}'' does not have this answerOption, so it is not valid -PRIMITIVE_MUSTHAVEVALUE_MESSAGE = The element definition ``{0}`` in the profile ''{1}'' requires that a value be present in this element -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = The element definition ``{0}`` in the profile ''{1}'' requires that if a value is not present, the extension ''{2}'' must be present -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = The element definition ``{0}`` in the profile ''{1}'' requires that if a value is not present, one of the extensions ''{2}'' must be present -ED_INVARIANT_NO_KEY = The constraint has no key, so the content cannot be validated -ED_INVARIANT_KEY_ALREADY_USED = The constraint key ''{0}'' already exists in the base profile ''{1}'' -ED_INVARIANT_NO_EXPRESSION = The constraint ''{0}'' has no computable expression, so validators will not be able to check it -ED_INVARIANT_EXPRESSION_CONFLICT = The constraint ''{0}'' has an expression ''{1}'', which differs from the earlier expression provided of ''{2}'' (invariants are allowed to repeat, but cannot differ) -ED_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'' with expression ''{1}'': {2} -SNAPSHOT_IS_EMPTY = The snapshot for the profile ''{0}'' is empty. This is usually due to a processing logged elsewhere +SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = The source variable refers to an unknown value set ''{0}'', so this concept map can''t be checked +SM_TARGET_TRANSLATE_BINDING_VS_TARGET = The target variable refers to an unknown value set ''{0}'', so this concept map can''t be checked +SM_TARGET_TYPE_MULTIPLE_POSSIBLE = Multiple types are possible here ({0}) so further type checking is not possible +SM_TARGET_TYPE_NOT_FOUND = No target type was found, so the default group for this implied dependent rule could not be determined +SNAPSHOT_EXISTING_PROBLEM = The generated snapshot has a different number of elements {1} than the originally provided snapshot {0} +SNAPSHOT_IS_EMPTY = The snapshot for the profile ''{0}'' is empty. This is usually due to a processing error logged elsewhere +STATUS_CODE_HINT = The code is {0} +STATUS_CODE_HINT_CODE = The code ''{1}'' is {0} +STATUS_CODE_WARNING = The code is valid but is {0} +STATUS_CODE_WARNING_CODE = The code ''{1}'' is valid but is {0} +Same_id_on_multiple_elements__in_ = Same id ''{0}'' on multiple elements {1}/{2} in {3} +Slice_encountered_midway_through_set_path___id___ = Slice encountered midway through set (path = {0}, id = {1}); {2} +Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicing rules on differential ({0}) do not match those on base ({1}) - discriminator @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicing rules on differential ({0}) do not match those on base ({1}) - order @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicing rules on differential ({0}) do not match those on base ({1}) - rule @ {2} ({3}) +StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} at {1}: invalid constrained type {2} from {3} in {4} TERMINOLOGY_TX_HINT = {1} +TERMINOLOGY_TX_NOSVC_BOUND_EXT = Could not confirm that the codes provided are from the extensible value set {0} because there is no terminology service +TERMINOLOGY_TX_NOSVC_BOUND_REQ = Could not confirm that the codes provided are from the required value set {0} because there is no terminology service +TERMINOLOGY_TX_OID_MULTIPLE_MATCHES = The OID ''{0}'' matches multiple resources ({1}) +TERMINOLOGY_TX_OID_MULTIPLE_MATCHES_CHOSEN = The OID ''{0}'' matches multiple resources ({2}); {1} was chosen as the most appropriate +TERMINOLOGY_TX_SYSTEM_HTTPS = The system URL ''{0}'' wrongly starts with https: not http: +TERMINOLOGY_TX_SYSTEM_NOT_USABLE = The definition for the Code System with URI ''{0}'' doesn''t provide any codes so the code cannot be validated +TERMINOLOGY_TX_SYSTEM_NO_CODE = A code with no system has no defined meaning, and it cannot be validated. A system should be provided +TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = The code system reference {0} is wrong - the code system reference cannot be a reference to build.fhir.org. This may be the correct reference: {1} +TERMINOLOGY_TX_SYSTEM_WRONG_HTML = The code system reference {0} is wrong - the code system reference cannot be to an HTML page. This may be the correct reference: {1} +TERMINOLOGY_TX_UNKNOWN_OID = The OID ''{0}'' is not known, so the code can''t be validated TERMINOLOGY_TX_WARNING = {1} -SD_ED_TYPE_WRONG_TYPE_one = The element has a type {0} which is different to the type {1} on the base profile {2} -SD_ED_TYPE_WRONG_TYPE_other = The element has a type {0} which is not in the types {1} on the base profile {2} -VALUESET_CONCEPT_DISPLAY_PRESENCE_MIXED = This include has some concepts with displays and some without - check that this is what is intended -VALUESET_CONCEPT_DISPLAY_SCT_TAG_MIXED = This SNOMED-CT based include has some concepts with semantic tags (FSN terms) and some without (preferred terms) - check that this is what is intended (examples for FSN: {0} and examples for no FSN: {1}) -CS_SCT_IPS_NOT_IPS = The Snomed CT code {0} ({1}) is not a member of the IPS free set +TX_GENERAL_CC_ERROR_MESSAGE = No valid coding was found for the value set ''{0}'' +TX_SERVER_NO_BATCH_RESPONSE = The server return null from a batch validation request +TYPE_CHECKS_FIXED_CC = The fixed value [system {0}, code {1}, and display ''{2}''] defined in the profile {3} not found. Issues: {4} +TYPE_CHECKS_FIXED_CC_US = The fixed value [system {0}, code {1}, display ''{2}'' and userSelected {5}] defined in the profile {3} not found. Issues: {4} +TYPE_CHECKS_PATTERN_CC = The pattern [system {0}, code {1}, and display ''{2}''] defined in the profile {3} not found. Issues: {4} +TYPE_CHECKS_PATTERN_CC_US = The pattern [system {0}, code {1}, display ''{2}'' and userSelected {5}] defined in the profile {3} not found. Issues: {4} +TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Canonical URLs must be absolute URLs if they are not fragment references ({0}) +TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Canonical URLs in contained resources must be absolute URLs if present ({0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Attachments have data and/or url, or else SHOULD have either contentType and/or language +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = Attachment size cannot be checked because the validator has not been set up to access the network (url = {0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = Stated Attachment Size {0} does not match actual attachment size {1} +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = Stated Attachment Size {0} is not valid +TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = Attachment size is {0} bytes which exceeds the stated limit of {1} bytes +TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = Attachment size cannot be checked because the validator doesn''t understand how to access {0} +TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = Attachment size cannot be checked because there was an error accesssing {0}: {1} +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64 encoded values are not allowed to contain any whitespace (per RFC 4648). Note that non-validating readers are encouraged to accept whitespace anyway +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64 encoded values SHOULD not contain any whitespace (per RFC 4648). Note that non-validating readers are encouraged to accept whitespace anyway +TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64 size is {0} bytes which exceeds the stated limit of {1} bytes +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_MULTIPLE_POSSIBLE_VERSIONS = There are multiple different potential matches for the url ''{0}''. It might be a good idea to fix to the correct version to reduce the likelihood of a wrong version being selected by an implementation/implementer. Using version ''{1}'', found versions: {2} +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' does not resolve +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' exists, but can''t be loaded, so it can''t be checked for validity +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' refers to a resource that has the wrong type. Found {1} expecting one of {2} +TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = Found {0} decimal places which exceeds the stated limit of {1} digits +TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = if identifier.system is ''urn:ietf:rfc:3986'', then the identifier.value must be a full URI (e.g. start with a scheme), not ''{0}'' +TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = The markdown contains content that appears to be an embedded HTML tag starting at ''{0}''. This will (or SHOULD) be escaped by the presentation layer. The content should be checked to confirm that this is the desired behaviour +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = Exception evaluating regex ''{0}'' on type {1}: {2} +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_TYPE_ALT = Neither the element value ''{0}'' or the formatted value ''{1}'' meet {2} regex ''{3}'' +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = The maxValue in the profile has a system code of {0} which is different to the system code in the value {1} so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = The maxValue in the profile has no code so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Unable to convert value {0} from unit {1} to maxValue unit {2} based on UCUM definitions; maximum value is not valid +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = The maxValue in the profile has no system so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = The maxValue in the profile doesn''t have an actual value, so the maximum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_NO_QTY = Found {0} of type {2} in the profile validating a Quantity (so it must be a Quantity) +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = There is no UCUM service, and the UCUM codes aren''t identical, so the maximum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = The maxValue in the profile has a system of {0} which is different to the system in the value {1} so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = The value has no code so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = The value has no system so the maximum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = The quantity doesn''t have an actual value, so the maximum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = The value in the instance ({2}) is greater than the specified maximum value ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = The value in the instance ({0} {1}) is greater than the specified maxValue ({2} {3}) after UCUM conversion +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = The minValue in the profile has a system code of {0} which is different to the system code in the value {1} so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = The minValue in the profile has no code so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Unable to convert value {0} from unit {1} to minValue unit {2} based on UCUM definitions; minimum value is not valid +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = The minValue in the profile has no system so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = The minValue in the profile doesn''t have an actual value, so the minimum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = There is no UCUM service, and the UCUM codes aren''t identical, so the minimum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = The minValue in the profile has a system of {0} which is different to the system in the value {1} so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = The value has no code so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = The value has no system so the minimum value cannot be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = The quantity doesn''t have an actual value, so the minimum value can''t be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = The value in the instance ({2}) is less than the specified minimum value ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = The value in the instance ({0} {1}) is less than the specified minValue ({2} {3}) after UCUM conversion +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NOT_IN_UNIT = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked, and the Quantity.unit ''{1}'' SHOULD contain the annotation (it does not) +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NO_UNIT = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked, and the Quantity.unit SHOULD contain the annotation +TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = Example URLs are not allowed in this context ({0}) +TYPE_SPECIFIC_CHECKS_DT_XHTML_MULTIPLE_MATCHES = Hyperlink ''{0}'' at ''{1}'' for ''{2}'' resolves to multiple targets ({3}) +TYPE_SPECIFIER_ABSTRACT_TYPE = The Type specifier {1} specified an abstract type {0} +TYPE_SPECIFIER_ILLEGAL_TYPE = The Type specifier {1} specified an invalid type {0} +TYPE_SPECIFIER_NM_ABSTRACT_TYPE = No Type specifier matched, and the underlying type {0} is not abstract +TYPE_SPECIFIER_NM_ILLEGAL_TYPE = No Type specifier matched, and the underlying type {0} is not valid +Terminology_PassThrough_TX_Message = {0} (for ''{1}#{2}'') +Terminology_TX_Binding_CantCheck = Binding by URI reference cannot be checked +Terminology_TX_Binding_Missing = Binding for CodeableConcept {0} missing +Terminology_TX_Binding_Missing2 = Binding for Coding {0} missing +Terminology_TX_Binding_NoServer = The value provided ([{0}]) could not be validated in the absence of a terminology server +Terminology_TX_Binding_NoSource = Binding for path {0} has no source, so can''t be checked +Terminology_TX_Binding_NoSource2 = Binding has no source, so can''t be checked +Terminology_TX_Code_ValueSet = No code provided, and a code is required from the value set {0} +Terminology_TX_Code_ValueSetMax = No code provided, and a code must be provided from the value set {0} (max value set {1}) +Terminology_TX_Code_ValueSet_Ext = No code provided, and a code should be provided from the value set {0} +Terminology_TX_Code_ValueSet_MISSING = No code provided, and a code is required from the value set +Terminology_TX_Coding_Count = Expected {0} but found {1} coding elements +Terminology_TX_Confirm_1_CC = Could not confirm that the codings provided are in the value set {0} and a coding from this value set is required (class = {1}) +Terminology_TX_Confirm_2_CC = Could not confirm that the codings provided are in the value set {0} and a coding should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) (class = {1}) +Terminology_TX_Confirm_3_CC = Could not confirm that the codings provided are in the value set {0} and a coding is recommended to come from this value set (class = {1}) +Terminology_TX_Confirm_4a = The code provided ({2}) was not found in the value set {0}, and a code from this value set is required: {1} +Terminology_TX_Confirm_5 = The code provided ({1}) is not in the value set {0}, and a code should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) +Terminology_TX_Confirm_6 = The code provided ({1}) is not in the value set {0}, and a code is recommended to come from this value set +Terminology_TX_Display_Wrong = Display should be ''{0}'' +Terminology_TX_Error_CodeableConcept = Error {0} validating CodeableConcept +Terminology_TX_Error_CodeableConcept_Max = Error {0} validating CodeableConcept using maxValueSet +Terminology_TX_Error_Coding1 = Error {0} validating Coding +Terminology_TX_Error_Coding2 = Error {0} validating Coding: {1} +Terminology_TX_NoValid_10 = The code provided is not in the maximum value set {0}, and a code from this value set is required) (code = {1}#{2}) +Terminology_TX_NoValid_11 = The code provided is not in the maximum value set {0}, and a code from this value set is required) (code = {1}#{2}), error = {3}) +Terminology_TX_NoValid_12 = The Coding provided ({2}) was not found in the value set {0}, and a code is required from this value set. {1} +Terminology_TX_NoValid_13 = The Coding provided ({2}) was not found in the value set {0}, and a code should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable). {1} +Terminology_TX_NoValid_14 = The Coding provided ({2}) was not found in the value set {0}, and a code is recommended to come from this value set. {1} +Terminology_TX_NoValid_15 = The value provided (''{0}'') could not be validated in the absence of a terminology server +Terminology_TX_NoValid_16 = The value provided (''{0}'') was not found in the value set {1}, and a code is required from this value set {2} +Terminology_TX_NoValid_17 = The value provided (''{0}'') was not found in the value set {1}, and a code should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable) {2} +Terminology_TX_NoValid_18 = The value provided (''{0}'') was not found in the value set {1}, and a code is recommended to come from this value set{2} +Terminology_TX_NoValid_1_CC = None of the codings provided are in the value set {0}, and a coding from this value set is required) (codes = {1}) +Terminology_TX_NoValid_2_CC = None of the codings provided are in the value set {0}, and a coding should come from this value set unless it has no suitable code (note that the validator cannot judge what is suitable) (codes = {1}) +Terminology_TX_NoValid_3_CC = None of the codings provided are in the value set {0}, and a coding is recommended to come from this value set (codes = {1}) +Terminology_TX_NoValid_4 = The Coding provided ({2}) was not found in the value set {0}, and a code is required from this value set {1} +Terminology_TX_NoValid_5 = The Coding provided ({2}) was not found in the value set {0}, and a code should come from this value set unless it has no suitable code (the validator cannot judge what is suitable) {1} +Terminology_TX_NoValid_6 = The Coding provided ({2}) was not found in the value set {0}, and a code is recommended to come from this value set {1} +Terminology_TX_NoValid_7 = None of the codes provided could be validated against the maximum value set {0}, (error = {2}) +Terminology_TX_NoValid_8 = None of the codes provided are in the maximum value set {0}, and a code from this value set is required) (codes = {1}) +Terminology_TX_NoValid_9 = The code provided ({2}) could not be validated against the maximum value set {0}, (error = {1}) +Terminology_TX_System_Invalid = Invalid System URI: {0} +Terminology_TX_System_Relative = Coding.system must be an absolute reference, not a local reference +Terminology_TX_System_Unknown = Unknown Code System ''{0}'' +Terminology_TX_System_ValueSet = Invalid System URI: {0} - cannot use a value set URI as a system +Terminology_TX_System_ValueSet2 = The Coding references a value set, not a code system (''{0}'') +Terminology_TX_ValueSet_NotFound = ValueSet ''{0}'' not found +Terminology_TX_ValueSet_NotFound_CS = Found a reference to a CodeSystem ''{0}'' where a ValueSet belongs +Text_should_not_be_present = Text should not be present (''{0}'') +The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = The base snapshot marks a slicing as closed, but the differential tries to extend it in {0} at {1} ({2}) +This__cannot_be_parsed_as_a_FHIR_object_no_namespace = This ''{0}'' cannot be parsed (no namespace on the XML Root element) +This_base_property_must_be_an_Array_not_ = This base property must be an Array, not {0} +This_cannot_be_parsed_as_a_FHIR_object_no_name = This content cannot be parsed (no name) +This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = This content cannot be parsed (unknown or unrecognized resource name ''{0}'') +This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = This content cannot be parsed (unknown or unrecognized XML Root element namespace/name ''{0}::{1}'') +This_element_does_not_match_any_known_slice_ = This element does not match any known slice {0} (this may not be a problem, but you should check that it''s not intended to match a slice) +This_property_must_be__not_ = The property {2} must be {0}, not {1} (at {3}) +This_property_must_be_a_Literal_not_ = This property must be a Literal, not {0} +This_property_must_be_a_URI_or_bnode_not_ = This property must be a URI or bnode, not {0} +This_property_must_be_an_Array_not_ = The property {1} must be a JSON Array, not {0} (at {2}) +This_property_must_be_an_object_not_ = This property must be an object, not {0} ({1} at {2}) +This_property_must_be_an_simple_value_not_ = This property must be a simple value, not {0} ({1} at {2}) +Type_Specific_Checks_DT_Base64_Valid = The value ''{0}'' is not a valid Base64 value +Type_Specific_Checks_DT_Boolean_Value = Boolean values must be ''true'' or ''false'' +Type_Specific_Checks_DT_Code_WS = The code ''{0}'' is not valid (whitespace rules) +Type_Specific_Checks_DT_DateTime_Reasonable = The value ''{0}'' is outside the range of reasonable years - check for data entry error +Type_Specific_Checks_DT_DateTime_Regex = The instant ''{0}'' is not valid (by regex) +Type_Specific_Checks_DT_DateTime_TZ = If a date has a time, it must have a timezone +Type_Specific_Checks_DT_DateTime_Valid = Not a valid date/time ({0}) +Type_Specific_Checks_DT_Date_Valid = Not a valid date ({0}) +Type_Specific_Checks_DT_Decimal_GT = decimal value is greater than permitted maximum value of {0} +Type_Specific_Checks_DT_Decimal_LT = decimal value is less than permitted minimum value of {0} +Type_Specific_Checks_DT_Decimal_Range = The value ''{0}'' is outside the range of commonly/reasonably supported decimals +Type_Specific_Checks_DT_Decimal_Valid = The value ''{0}'' is not a valid decimal +Type_Specific_Checks_DT_ID_Valid = id value ''{0}'' is not valid +Type_Specific_Checks_DT_Identifier_System = Identifier.system must be an absolute reference, not a local reference +Type_Specific_Checks_DT_Instant_Valid = Not a valid instant ({0}) +Type_Specific_Checks_DT_Integer64_Valid = The value ''{0}'' is not a valid integer64 +Type_Specific_Checks_DT_Integer_GT = integer value is greater than permitted maximum value of {0} +Type_Specific_Checks_DT_Integer_LT = integer value is less than permitted minimum value of {0} +Type_Specific_Checks_DT_Integer_LT0 = value is less than permitted minimum value of 0 +Type_Specific_Checks_DT_Integer_LT1 = value is less than permitted minimum value of 1 +Type_Specific_Checks_DT_Integer_Valid = The value ''{0}'' is not a valid integer +Type_Specific_Checks_DT_OID_Start = OIDs must start with urn:oid: +Type_Specific_Checks_DT_OID_Valid = OIDs must be valid ({0}) +Type_Specific_Checks_DT_Primitive_Length = value is longer than permitted maximum length of {0} +Type_Specific_Checks_DT_Primitive_NotEmpty = value cannot be empty +Type_Specific_Checks_DT_Primitive_Regex = Element value ''{0}'' does not meet regex ''{1}'' +Type_Specific_Checks_DT_Primitive_Regex_Type = Element value ''{0}'' does not meet {1} regex ''{2}'' +Type_Specific_Checks_DT_Primitive_ValueExt = Primitive types must have a value or must have child extensions +Type_Specific_Checks_DT_Primitive_WS = Primitive types should not only be whitespace +Type_Specific_Checks_DT_String_Length = value is longer than permitted maximum length of 1 MB (1048576 bytes) +Type_Specific_Checks_DT_String_WS = value should not start or finish with whitespace ''{0}'' +Type_Specific_Checks_DT_String_WS_ALL = value should not be all whitespace ''{0}'' +Type_Specific_Checks_DT_Time_Valid = Not a valid time ({0}) +Type_Specific_Checks_DT_URI_OID = URI values cannot start with oid: +Type_Specific_Checks_DT_URI_UUID = URI values cannot start with uuid: +Type_Specific_Checks_DT_URI_WS = URI values cannot have whitespace(''{0}'') +Type_Specific_Checks_DT_URL_Resolve = URL value ''{0}'' does not resolve +Type_Specific_Checks_DT_UUID_Strat = UUIDs must start with urn:uuid: +Type_Specific_Checks_DT_UUID_Valid = UUIDs must be valid and lowercase ({0}) +Type_Specific_Checks_DT_XHTML_Resolve = Hyperlink ''{0}'' at ''{1}'' for ''{2}'' does not resolve +Type_Specific_Checks_DT_XHTML_Resolve_Img = Image source ''{0}'' at ''{1}'' does not resolve +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = Unable to check whether the code is in the value set ''{0}'' +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_CS = Unable to check whether the code is in the value set ''{0}'' because the code system {1} was not found +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_VS = Unable to check whether the code is in the value set ''{0}'' because the value set {1} was not found +UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV = The types could not be determined from the extension context, so the invariant can''t be validated (types = {0}) +UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = Unable to handle system {0} property filter with op = {1} +UNABLE_TO_INFER_CODESYSTEM = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'' +UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = Unable to resolve the content reference {0} on element {1} (path = {2}) in this context +UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = The code system {1} referred to from value set {0} has a grammar, and the code might be valid in it +UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = The Unicode sequence has bi-di control characters which are not allowed in this context: {0} +UNICODE_BIDI_CONTROLS_CHARS_MATCH = The Unicode sequence has unterminated bi-di control characters (see CVE-2021-42574): {0} UNICODE_XML_BAD_CHARS_one = This content includes the character {1} (hex value). This character is illegal in the XML version of FHIR, and there is generally no valid use for such characters UNICODE_XML_BAD_CHARS_other = This content includes the characters {1} (hex values). These characters are illegal in the XML version of FHIR, and there is generally no valid use for such characters -LIQUID_UNKNOWN_FILTER = Unknown Liquid filter '''{0}'' -LIQUID_UNKNOWN_SYNTAX = Unexpected syntax parsing liquid statement -LIQUID_SYNTAX_EXPECTING = Script {0}: Found ''{1}'' expecting ''{2}'' parsing cycle -LIQUID_SYNTAX_UNTERMINATED = Script {0}: Found unterminated string parsing cycle -LIQUID_UNKNOWN_FLOW_STMT = Script {0}: Unknown flow control statement ''{1}'' -LIQUID_UNKNOWN_NOEND = Script {0}: Found end of script looking for {1} -LIQUID_SYNTAX_INCLUDE = Script {0}: Error reading include: {1} -LIQUID_SYNTAX_LOOP = Script {0}: Error reading loop: {1} -LIQUID_SYNTAX_NOTERM = Script {0}: Unterminated Liquid statement {1} -LIQUID_UNKNOWN_NOTERM = Script {0}: Unterminated Liquid statement {1} -LIQUID_SYNTAX_COLON = Exception evaluating {0}: limit is not followed by '':'' -LIQUID_SYNTAX_NUMBER = Exception evaluating {0}: limit is not followed by a number -LIQUID_SYNTAX_UNEXPECTED = Exception evaluating {0}: unexpected content at {1} -LIQUID_VARIABLE_ALREADY_ASSIGNED = Liquid Exception: The variable ''{0}'' already has an assigned value -LIQUID_VARIABLE_ILLEGAL = Liquid Exception: The variable name ''{0}'' cannot be used -ED_INVARIANT_DIFF_NO_SOURCE = The invariant {0} defined in the differential must have no source, or the source must be the same as the profile -FHIRPATH_COLLECTION_STATUS_OPERATION_LEFT = The left side is inherently a collection, and so the expression ''{0}'' may fail or return false if there is more than one item in the content being evaluated -FHIRPATH_COLLECTION_STATUS_OPERATION_RIGHT = The right side is inherently a collection, and so this expression ''{0}'' may fail or return false if there is more than one item in the content being evaluated -FHIRPATH_OFTYPE_IMPOSSIBLE = The type specified in ofType() is {1} which is not a possible candidate for the existing types ({0}) in the expression {2}. Check the paths and types to be sure this is what is intended -FHIRPATH_AS_IMPOSSIBLE = The type specified in as() is {1} which is not a possible candidate for the existing types ({0}) in the expression {2}. Check the paths and types to be sure this is what is intended -ED_SEARCH_EXPRESSION_ERROR = Error in search expression ''{0}'': {1} -SD_EXTENSION_URL_MISMATCH = The fixed value for the extension URL is {1} which doesn''t match the canonical URL {0} -SD_EXTENSION_URL_MISSING = The value of Extension.url is not fixed to the extension URL {0} -MSG_DEPRECATED = Reference to deprecated {2} {0} -MSG_WITHDRAWN = Reference to withdrawn {2} {0} -MSG_RETIRED = Reference to retired {2} {0} -MSG_EXPERIMENTAL = Reference to experimental {2} {0} -MSG_DRAFT = Reference to draft {2} {0} -MSG_DEPRECATED_SRC = Reference to deprecated {2} {0} from {1} -MSG_WITHDRAWN_SRC = Reference to withdrawn {2} {0} from {1} -MSG_RETIRED_SRC = Reference to retired {2} {0} from {1} -MSG_EXPERIMENTAL_SRC = Reference to experimental {2} {0} from {1} -MSG_DRAFT_SRC = Reference to draft {2} {0} from {1} -STATUS_CODE_WARNING = The code is valid but is {0} -STATUS_CODE_HINT = The code is {0} -STATUS_CODE_WARNING_CODE = The code ''{1}'' is valid but is {0} -STATUS_CODE_HINT_CODE = The code ''{1}'' is {0} -SD_ED_TYPE_PROFILE_WRONG_TYPE_one = The type {0} is not in the list of allowed type {1} in the profile {2} -SD_ED_TYPE_PROFILE_WRONG_TYPE_other = The type {0} is not in the list of allowed types {1} in the profile {2} -MSG_DEPENDS_ON_DEPRECATED = The {0} {1} is deprecated -MSG_DEPENDS_ON_WITHDRAWN = The {0} {1} is withdrawn -MSG_DEPENDS_ON_RETIRED = The {0} {1} is retired -MSG_DEPENDS_ON_EXPERIMENTAL = The {0} {1} is an experimental resource -MSG_DEPENDS_ON_DRAFT = The {0} {1} is a draft resource -MSG_DEPENDS_ON_EXTENSION = extension -MSG_DEPENDS_ON_PROFILE = profile +UNKNOWN_CODESYSTEM = A definition for CodeSystem ''{0}'' could not be found, so the code cannot be validated +UNKNOWN_CODESYSTEM_VERSION = A definition for CodeSystem ''{0}'' version ''{1}'' could not be found, so the code cannot be validated. Valid versions: {2} +UNKNOWN_CODE_IN_FRAGMENT = Unknown Code ''{0}'' in the system ''{1}'' version ''{2}'' - note that the code system is labeled as a fragment, so the code may be valid in some other fragment +UNRECOGNISED_PROPERTY_TYPE = Invalid JSON type {0} for the element {1}; valid types = {2} +UNRECOGNISED_PROPERTY_TYPE_WRONG = Invalid type {2} for the element {1}; valid types = {3}, JSON type = {0} +UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Unsupported: no properties with values found on type {2} for pattern for discriminator ({0}) for slice {1} +UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Unsupported property {3} on type {2} for pattern for discriminator ({0}) for slice {1} +Unable_to_connect_to_terminology_server = Unable to connect to terminology server at {1}. Error = {0} +Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Unable to connect to terminology server at {1}. Use parameter ''-tx n/a'' to run without using terminology services to validate LOINC, SNOMED, ICD-X etc. Error = {0} +Unable_to_find__resolving_discriminator__from_ = Unable to find {0} resolving discriminator {1} from {2} +Unable_to_find_base__for_ = Unable to find base {0} for {1} +Unable_to_find_base_definition_for_logical_model__from_ = Unable to find base definition for logical model: {0} from {1} +Unable_to_find_element_ = Unable to find element {0} +Unable_to_find_element__in_ = Unable to find element {0} in {1} +Unable_to_find_element_with_id_ = Unable to find element with id ''{0}'' +Unable_to_find_profile__at_ = Unable to find profile ''{0}'' at {1} +Unable_to_find_resourceType_property = Unable to find resourceType property +Unable_to_find_resource__at__resolving_discriminator__from_ = Unable to find resource {0} at {1} resolving discriminator {2} from {3} +Unable_to_handle_system__concept_filter_with_op__ = Unable to handle system {0} concept filter with op = {1} +Unable_to_handle_system__filter_with_property__ = Unable to handle system {0} filter with property = {1}, op = {2} +Unable_to_locate_the_profile__in_order_to_validate_against_it = Unable to locate the profile ''{0}'' in order to validate against it +Unable_to_process_request_for_resource_for___ = Unable to process request for resource for {0} / {1} +Unable_to_resolve_ = Unable to resolve the reference {0} +Unable_to_resolve_actual_type_ = Unable to resolve actual type {0} +Unable_to_resolve_element__in_profile_ = Unable to resolve element {0} in profile {1} +Unable_to_resolve_name_reference__at_path_ = Unable to resolve name reference {0} at path {1} +Unable_to_resolve_profile__in_element_ = Unable to resolve profile {0} in element {1} +Unable_to_resolve_reference_to_ = Unable to resolve reference to {0} +Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Unable to resolve slice matching - no fixed value or required value set +Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Unable to resolve slice matching - slice matching by value set not done +Unable_to_resolve_system__no_value_set = Unable to resolve system - no value set +Unable_to_resolve_system__value_set_expansion_has_multiple_systems = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': value set expansion has multiple systems +Unable_to_resolve_system__value_set_has_imports = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': value set has imports +Unable_to_resolve_system__value_set_has_include_with_filter = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': include #{2} has a filter on system {3}: {4} +Unable_to_resolve_system__value_set_has_include_with_no_system = Unable to resolve system - value set {0} include #{1} has no system +Unable_to_resolve_system__value_set_has_include_with_unknown_system = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': include #{2} has system {3} which could not be found, and the server returned error {4} +Unable_to_resolve_system__value_set_has_multiple_matches = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': value set expansion has multiple matches: {2} +Unable_to_resolve_system__value_set_has_no_includes_or_expansion = The System URI could not be determined for the code ''{0}'' in the ValueSet ''{1}'': value set has no includes or expansion +Unable_to_resolve_value_Set_ = A definition for the value Set ''{0}'' could not be found +Unable_to_validate_code_without_using_server = Unable to validate code without using server because: {0} +Undefined_attribute__on__for_type__properties__ = Undefined attribute ''@{0}'' on {1} for type {2} +Undefined_element_ = Undefined element ''{0}'' at {1} +Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Unexpected condition in differential: implicit slice name does not contain a valid type (''{0}''?) at {1}/{2} +Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Unexpected condition in differential: invalid type at {0}/{1} +Unexpected_datatype_for_rdfstype = Unexpected datatype for rdfs:type +Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Unhandled situation: resource is profiled to more than one option - cannot sort profile +Unknown_Code_in = Unknown code ''{0}'' in the CodeSystem ''{1}'' +Unknown_Code_in_Version = Unknown code ''{0}'' in the CodeSystem ''{1}'' version ''{2}'' +Unknown_Data_format_ = Unknown Data format ''{0}'' +Unknown_Date_format_ = Unknown Date format ''{0}'' +Unknown_resource_type_missing_rdfstype = Unknown resource type (missing rdfs:type) +Unknown_type__at_ = Unknown type {0} at {1} +Unrecognised_extension_context_ = Unrecognized extension context {0} +Unrecognised_predicate_ = Unrecognized predicate ''{0}'' +Unrecognised_property_ = Unrecognized property ''{0}'' +Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - extensions are not allowed - for discriminator ({0}) for slice {1} +Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - must have at least one coding - for discriminator ({0}) for slice {1} +Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Unsupported CodeableConcept pattern - using text - for discriminator ({0}) for slice {1} +Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Unsupported Identifier pattern - extensions are not allowed - for discriminator ({0}) for slice {1} +Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Unsupported fixed pattern type for discriminator ({0}) for slice {1}: {2} +Unsupported_fixed_value_type_for_discriminator_for_slice__ = Unsupported fixed value type for discriminator ({0}) for slice {1}: {2} +Unsupported_version_R1 = Unsupported version R1 +Unsupported_version_R2 = Unsupported version R2 +Unsupported_version_R2B = Unsupported version R2B +Unxpected_internal_condition__no_source_on_diff_element = Unexpected internal condition - no source on diff element +VALIDATION_HL7_PUBLISHER_MISMATCH = The nominated WG ''{0}'' means that the publisher should be ''{1}'' but ''{2}'' was found +VALIDATION_HL7_PUBLISHER_MISMATCH2 = The nominated WG ''{0}'' means that the publisher should be either ''{1}''or ''{2}'' but ''{3}'' was found +VALIDATION_HL7_PUBLISHER_MISSING = When HL7 is publishing a resource, the publisher must be provided, and for WG ''{0}'' it should be ''{1}'' +VALIDATION_HL7_WG_NEEDED = When HL7 is publishing a resource, the owning committee must be stated using the {0} extension +VALIDATION_HL7_WG_UNKNOWN = The nominated WG ''{0}'' is unknown +VALIDATION_HL7_WG_URL = The nominated WG ''{0}'' means that the contact url should be ''{1}'' but it was not found +VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = Global Profile reference ''{0}'' from IG {1} could not be resolved, so has not been checked +VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Invalid constraint in profile {0} at path {1} - cannot constrain to type {2} from base types {3} +VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = Profile {1} identifies {2} as a dependency (using the extension http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), but this profile could not be found +VALIDATION_VAL_PROFILE_MINIMUM_MAGIC = {0}: magic LOINC code {1} required, but not found (from {2}). Note that other Observation codes are allowed in addition to this required magic code +VALIDATION_VAL_PROFILE_OTHER_VERSION = Profile is for a different version of FHIR ({0}) so has been ignored +VALIDATION_VAL_PROFILE_SIGNPOST = Validate resource against profile {0} +VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Validate resource against profile +VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Validate resource against profile {0} - provided as bundle param +VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Validate resource against profile {0} (per http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) +VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Validate resource against profile {0} - a global profile in {1} +VALIDATION_VAL_PROFILE_SIGNPOST_META = Validate resource against profile {0} (per meta) +VALIDATION_VAL_PROFILE_SIGNPOST_OBS = Validate Observation against the {1} profile ({0}) which is required by the FHIR specification because the {2} code {3} was found +VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profile for this version of FHIR - all OK +VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profile is for this version of FHIR, but is an invalid type {0} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = Profile reference ''{0}'' has not been checked because it could not be found, and fetching it resulted in the error {1} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = Profile reference ''{0}'' has not been checked because it could not be found, and the host {1} cannot be found +VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = Profile reference ''{0}'' has not been checked because it could not be found, and the validator is set to not fetch unknown profiles VALIDATION_VAL_STATUS_INCONSISTENT = The resource status ''{0}'' and the standards status ''{1}'' are not consistent VALIDATION_VAL_STATUS_INCONSISTENT_HINT = The resource status ''{0}'' and the standards status ''{1}'' may not be consistent and should be reviewed -CODESYSTEM_CS_COUNT_COMPLETE_WRONG = The code system is complete, but the number of concepts ({0}) does not match the stated total number ({1}) -CODESYSTEM_CS_COUNT_FRAGMENT_WRONG = The code system is a fragment/example, but the number of concepts ({0}) exceeds or matches the stated total number ({1}) -CODESYSTEM_CS_COUNT_NOTPRESENT_ZERO = The code system has no content, but the exceeds the stated total number is 0 concepts - check that this isn't a complete code system that has no concepts, or update/remove the stated count -CODESYSTEM_CS_COUNT_SUPPLEMENT_WRONG = The code system supplement states the total number of concepts as {1}, but this is different to the underlying code system that states a value of {0} -CODESYSTEM_CS_COUNT_NO_CONTENT_ALLOWED = The code system says it has no content present, but concepts are found +VALUESET_BAD_FILTER_OP = The operation ''{0}'' is not allowed for property ''{1}'' in system ''{3}''. Allowed ops: {2} +VALUESET_BAD_FILTER_VALUE_BOOLEAN = The value for a filter based on property ''{0}'' must be either ''true'' or ''false'', not ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODE = The value for a filter based on property ''{0}'' must be a valid code, not ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODED = The value for a filter based on property ''{0}'' must be in the format system(|version)#code, not ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODED_INVALID = The value for a filter based on property ''{0}'' is ''{1}'' which is not a valid code ({2}) +VALUESET_BAD_FILTER_VALUE_DATETIME = The value for a filter based on property ''{0}'' must be a valid date(/time), not ''{1}'' +VALUESET_BAD_FILTER_VALUE_DECIMAL = The value for a filter based on property ''{0}'' must be a decimal value, not ''{1}'' +VALUESET_BAD_FILTER_VALUE_HAS_COMMA = The filter value has a comma, but the operation is different to ''in'' and ''not-in'', so the comma will be interpreted as part of the {0} value +VALUESET_BAD_FILTER_VALUE_INTEGER = The value for a filter based on property ''{0}'' must be integer value, not ''{1}'' +VALUESET_BAD_FILTER_VALUE_VALID_CODE = The value for a filter based on property ''{0}'' must be a valid code from the system ''{2}'', and ''{1}'' is not ({3}) +VALUESET_BAD_FILTER_VALUE_VALID_CODE_CHANGE = The value for a filter based on property ''{0}'' must be a valid code from the system ''{2}'', and ''{1}'' is not ({3}). Note that this is change from the past; terminology servers are expected to still continue to support this filter +VALUESET_BAD_FILTER_VALUE_VALID_REGEX = The value for a filter based on property ''{0}'' should be a valid regex, not ''{1}'' (err = ''{2}'') +VALUESET_BAD_PROPERTY_NO_REGEX = Cannot apply a regex filter to the property ''{0}'' (usually regex filters are applied to the codes, or a named property of the code system) VALUESET_CIRCULAR_REFERENCE = Found a circularity pointing to {0} processing ValueSet with pathway {1} +VALUESET_CONCEPT_DISPLAY_PRESENCE_MIXED = This include has some concepts with displays and some without - check that this is what is intended +VALUESET_CONCEPT_DISPLAY_SCT_TAG_MIXED = This SNOMED-CT based include has some concepts with semantic tags (FSN terms) and some without (preferred terms) - check that this is what is intended (examples for FSN: {0} and examples for no FSN: {1}) +VALUESET_EXAMPLE_SYSTEM_ERROR = Example System ''{0}'' specified, which is illegal. Concepts and Filters can''t be checked +VALUESET_EXAMPLE_SYSTEM_HINT = Example System ''{0}'' specified, so Concepts and Filters can''t be checked +VALUESET_IMPORT_UNION_INTERSECTION = This value set has a single include with multiple imported value sets. Per issue https://jira.hl7.org/browse/FHIR-25179, there has been confusion in the past whether these value sets are unioned or intersectioned. If this value set is contained in a package published prior to March 31 2022, it will be treated as a union, otherwise it will be treated as an intersection. If want a union, split the value set imports across multiple includes +VALUESET_INCLUDE_CSVER_CONTENT = The value set references CodeSystem ''{0}'' version ''{2}'' which has status ''{1}'' +VALUESET_INCLUDE_CSVER_MULTI_FOUND = Multiple matching contained code systems found for system ''{0}'' version ''{1}'' +VALUESET_INCLUDE_CSVER_NOT_FOUND = No matching contained code system found for system ''{0}'' version ''{1}'' +VALUESET_INCLUDE_CSVER_SUPPLEMENT = The value set references CodeSystem ''{0}'' version ''{2}'' which is a supplement. It must reference the underlying CodeSystem ''{1}'' and use the http://hl7.org/fhir/StructureDefinition/valueset-supplement extension for the supplement +VALUESET_INCLUDE_CS_CONTENT = The value set references CodeSystem ''{0}'' which has status ''{1}'' +VALUESET_INCLUDE_CS_MULTI_FOUND = Multiple matching contained code systems found for system ''{0}'' +VALUESET_INCLUDE_CS_NOT_CS = The include system ''{0}'' is a reference to a contained resource, but the contained resource with that id is not a CodeSystem, it''s a {1} +VALUESET_INCLUDE_CS_NOT_FOUND = No matching contained code system found for system ''{0}'' +VALUESET_INCLUDE_CS_SUPPLEMENT = The value set references CodeSystem ''{0}'' which is a supplement. It must reference the underlying CodeSystem ''{1}'' and use the http://hl7.org/fhir/StructureDefinition/valueset-supplement extension for the supplement +VALUESET_INCLUDE_INVALID_CONCEPT_CODE = The code ''{1}'' is not valid in the system {0} ({2}) +VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = The code ''{2}'' is not valid in the system {0} version {1} ({2}) +VALUESET_INCLUDE_SYSTEM_ABSOLUTE = URI values in ValueSet.compose.include.system must be absolute +VALUESET_INCLUDE_SYSTEM_ABSOLUTE_FRAG = URI values in ValueSet.compose.include.system must be absolute. To reference a contained code system, use the full CodeSystem URL and reference it using the http://hl7.org/fhir/StructureDefinition/valueset-system extension +VALUESET_INC_TOO_MANY_CODES = The value set include has too many codes to validate ({0}), so each individual code has not been checked +VALUESET_NO_SYSTEM_WARNING = No System specified, so Concepts and Filters can''t be checked +VALUESET_REFERENCE_INVALID_TYPE = The value set import {0} points to a resource of type {1} which is not valid +VALUESET_REFERENCE_UNKNOWN = The value set import {0} could not be found so cannot be checked +VALUESET_SHAREABLE_EXTRA_MISSING = Published value sets SHOULD conform to the ShareableValueSet profile, which says that the element ValueSet.{0} should be present, but it is not +VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = Value sets published by HL7 SHALL conform to the ShareableValueSet profile, which says that the element ValueSet.{0} should be present, but it is not +VALUESET_SHAREABLE_MISSING = Published value sets SHOULD conform to the ShareableValueSet profile, which says that the element ValueSet.{0} is mandatory, but it is not present +VALUESET_SHAREABLE_MISSING_HL7 = Value sets published by HL7 SHALL conform to the ShareableValueSet profile, which says that the element ValueSet.{0} is mandatory, but it is not present VALUESET_SUPPLEMENT_MISSING_one = Required supplement not found: {1} VALUESET_SUPPLEMENT_MISSING_other = Required supplements not found: {1} -CONCEPTMAP_VS_TOO_MANY_CODES = The concept map has too many codes to validate ({0}) -CONCEPTMAP_VS_CONCEPT_CODE_UNKNOWN_SYSTEM = The code ''{1}'' comes from the system {0} which could not be found, so it''s not known whether it''s valid in the value set ''{2}'' -CONCEPTMAP_VS_INVALID_CONCEPT_CODE = The code ''{1}'' in the system {0} is not valid in the value set ''{2}'' -CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = The code ''{2}'' in the system {0} version {1} is not valid in the value set ''{3}'' -VALUESET_INC_TOO_MANY_CODES = The value set include has too many codes to validate ({0}) -BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH = The {1} resource did not match any of the allowed profiles (Type {2}: {3}) -BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES = The {1} resource matched more than one of the allowed profiles ({3}) -BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON = The {1} resource did not math the profile {2} because: {3} -VALIDATION_HL7_WG_NEEDED = When HL7 is publishing a resource, the owning committee must be stated using the {0} extension -VALIDATION_HL7_WG_UNKNOWN = The nominated WG ''{0}'' is unknown -VALIDATION_HL7_PUBLISHER_MISMATCH = The nominated WG ''{0}'' means that the publisher should be ''{1}'' but ''{2}'' was found -VALIDATION_HL7_PUBLISHER_MISMATCH2 = The nominated WG ''{0}'' means that the publisher should be either ''{1}''or ''{2}'' but ''{3}'' was found -VALIDATION_HL7_WG_URL = The nominated WG ''{0}'' means that the contact url should be ''{1}'' but it was not found -VALIDATION_HL7_PUBLISHER_MISSING = When HL7 is publishing a resource, the publisher must be provided, and for WG ''{0}'' it should be ''{1}'' -TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NO_UNIT = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked, and the Quantity.unit SHOULD contain the annotation -TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NOT_IN_UNIT = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked, and the Quantity.unit ''{1}'' SHOULD contain the annotation (it does not) -TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS = UCUM Codes that contain human readable annotations like {0} can be misleading (e.g. they are ignored when comparing units). Best Practice is not to depend on annotations in the UCUM code, so this usage should be checked -LOGICAL_MODEL_NAME_MISMATCH = The name ''{0}'' does not match the expected name ''{1}'' -LOGICAL_MODEL_QNAME_MISMATCH = The QName ''{0}'' does not match the expected QName ''{1}'' -FHIRPATH_CHOICE_NO_TYPE_SPECIFIER = The expression ''{0}'' refers to an element that is a choice, but doesn''t have an .ofType() so that SQL view runners can pre-determine the full element name -FHIRPATH_CHOICE_SPURIOUS_TYPE_SPECIFIER = The expression ''{0}'' refers to an element that is not a choice, but has an .ofType(). SQL view runners are likely to pre-determine an incorrect full element name -FHIRPATH_NOT_A_COLLECTION = Found a use of a collection operator on something that is not a collection at ''{0}'' - check that there's no mistakes in the expression syntax -TERMINOLOGY_TX_UNKNOWN_OID = The OID ''{0}'' is not known, so the code can't be validated -TERMINOLOGY_TX_SYSTEM_NO_CODE = A code with no system has no defined meaning, and it cannot be validated. A system should be provided -XSI_TYPE_WRONG = The xsi:type value ''{0}'' is wrong (should be ''{1}''). Note that xsi:type is unnecessary at this point -XSI_TYPE_UNNECESSARY = xsi:type is unnecessary at this point -TERMINOLOGY_TX_OID_MULTIPLE_MATCHES = The OID ''{0}'' matches multiple code systems ({1}) -CDA_UNKNOWN_TEMPLATE = The CDA Template {0} is not known -CDA_UNKNOWN_TEMPLATE_EXT = The CDA Template {0} / {1} is not known -UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV = The types could not be determined from the extension context, so the invariant can't be validated (types = {0}) -ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'': {1} -VALIDATION_VAL_PROFILE_SIGNPOST_OBS = Validate Observation against the {1} profile ({0}) which is required by the FHIR specification because the {2} code {3} was found -FHIRPATH_INVALID_TYPE = The type {0} is not valid -FHIRPATH_AS_COLLECTION = Attempt to use ''as()'' on more than one item (''{0}'', ''{1}'') -FHIRPATH_ARITHMETIC_QTY = Error in date arithmetic: attempt to add a definite quantity duration time unit {0} -FHIRPATH_ARITHMETIC_UNIT = Error in date arithmetic: unrecognized time unit {0} -FHIRPATH_ARITHMETIC_PLUS = Error in date arithmetic: Unable to add type {0} to {1} -FHIRPATH_ARITHMETIC_MINUS = Error in date arithmetic: Unable to subtract type {0} to {1} -BUNDLE_ENTRY_URL_MATCHES_NO_ID = The fullUrl ''{0}'' looks like a RESTful server URL, but the resource has no id -BUNDLE_ENTRY_URL_MATCHES_TYPE_ID = The fullUrl ''{0}'' looks like a RESTful server URL, so it must end with the correct type and id (/{1}/{2}) -BUNDLE_ENTRY_URL_ABSOLUTE = The fullUrl must be an absolute URL (not ''{0}'') -FHIRPATH_COLLECTION_STATUS_PARAMETER = Parameter {1} is inherently a collection, and so the expression ''{0}'' may fail, create an error, or return false if there is more than one item in the parameter value ({2}) -FHIRPATH_COLLECTION_STATUS_CONTEXT = The context is inherently a collection, and so the expression ''{0}'' may fail, create an error, or return false if there is more than one item in the context ({2}) -BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT = Can''t find ''{0}'' in the bundle ({1}) -BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT = Found {0} matches for fragment {2} in resource ''{1}'' in the bundle ({3}) +VALUESET_TOO_COSTLY = The value set ''{0}'' expansion has too many codes to display ({1}) +VALUESET_TOO_COSTLY_COUNT = The value set ''{0}'' expansion has {2} codes, which is too many to display ({1}) +VALUESET_TOO_COSTLY_TIME = The value set ''{0}'' expansion took too long to process (>{1}sec) +VALUESET_UNC_SYSTEM_WARNING = Unknown System ''{0}'' specified, so Concepts and Filters can''t be checked (Details: {1}) +VALUESET_UNC_SYSTEM_WARNING_VER = Unknown System/Version ''{0}'' specified, so Concepts and Filters can''t be checked (Details: {1}) +VALUESET_UNKNOWN_FILTER_PROPERTY = The property ''{0}'' is not known for the system ''{1}'', so may not be understood by the terminology ecosystem. Known properties for this system: {2} +VALUESET_UNKNOWN_FILTER_PROPERTY_NO_CS = No definition can be found for the system {1}, and the property ''{0}'' is not a generally known property, so the property might not be valid, or understood by the terminology ecosystem. In case it''s useful, the list of generally known properties for all systems is {2} +Validation_BUNDLE_Message = The first entry in a message must be a MessageHeader +Validation_VAL_Content_Unknown = Unrecognized Content {0} +Validation_VAL_NoType = Unknown type {0} +Validation_VAL_Profile_MatchMultiple = Profile {0}, Element matches more than one slice - {1}, {2} +Validation_VAL_Profile_Maximum_one = {3}: max allowed = {7}, but found {0} (from {1}) +Validation_VAL_Profile_Maximum_other = {3}: max allowed = {7}, but found {0} (from {1}) +Validation_VAL_Profile_Minimum_SLICE_one = Slice ''{3}'': a matching slice is required, but not found (from {1}). Note that other slices are allowed in addition to this required slice +Validation_VAL_Profile_Minimum_SLICE_other = Slice ''{3}'': minimum required = {0}, but only found {7} (from {1}) +Validation_VAL_Profile_Minimum_one = {3}: minimum required = {7}, but only found {0} (from {1}) +Validation_VAL_Profile_Minimum_other = {3}: minimum required = {7}, but only found {0} (from {1}) +Validation_VAL_Profile_MultipleMatches_one = Found multiple matching profiles among {0} choice: {1} +Validation_VAL_Profile_MultipleMatches_other = Found multiple matching profiles among {0} choices: {1} +Validation_VAL_Profile_NoCheckMax_one = {3}: Found {0} match, but unable to check max allowed ({2}) due to lack of slicing validation (from {1}) +Validation_VAL_Profile_NoCheckMax_other = {3}: Found {0} matches, but unable to check max allowed ({2}) due to lack of slicing validation (from {1}) +Validation_VAL_Profile_NoCheckMin_one = {3}: Found {0} match, but unable to check minimum required ({2}) due to lack of slicing validation (from {1}) +Validation_VAL_Profile_NoCheckMin_other = {3}: Found {0} matches, but unable to check minimum required ({2}) due to lack of slicing validation (from {1}) +Validation_VAL_Profile_NoDefinition = No definition found for resource type ''{0}'' +Validation_VAL_Profile_NoMatch = Unable to find a match for the specified profile among choices: {0} +Validation_VAL_Profile_NoSnapshot = StructureDefinition {0} has no snapshot - validation is against the snapshot, so it must be provided +Validation_VAL_Profile_NoType = The type of element {0} is not known - it could not be determined from the information available. Valid types at this point are {1} +Validation_VAL_Profile_NotAllowed = This element is not allowed by the profile {0} +Validation_VAL_Profile_NotSlice = This element does not match any known slice {0} and slicing is CLOSED: {1} +Validation_VAL_Profile_OutOfOrder = As specified by profile {0}, Element ''{1}'' is out of order (found after {2}) +Validation_VAL_Profile_SliceOrder = As specified by profile {0}, Element ''{1}'' is out of order in ordered slice +Validation_VAL_Profile_Unknown = Profile reference ''{0}'' has not been checked because it could not be found +Validation_VAL_Profile_WrongType = Specified profile type was ''{0}'' in profile ''{2}'', but found type ''{1}'' +Validation_VAL_Profile_WrongType2 = Type mismatch processing profile {0} at path {1}: The element type is {4}, but the profile {3} is for a different type {2} +Validation_VAL_Unknown_Profile = Unknown profile {0} +Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Version mismatch. The context has version {0} loaded, and the new content being loaded is version {1} +Wrong_namespace__expected_ = Wrong namespace - expected ''{0}'' +Wrong_type_for_resource = Wrong type for resource XHTML_IDREF_NOT_FOUND = The target of the HTML idref attribute ''{0}'' was not found in the resource XHTML_IDREF_NOT_MULTIPLE_MATCHES = Multiple matching targets for the HTML idref attribute ''{0}'' were found in the resource -TX_GENERAL_CC_ERROR_MESSAGE = No valid coding was found for the value set ''{0}'' \ No newline at end of file +XHTML_URL_DATA_DATA_INVALID = The data should be valid base64 content for a data: URL: {0} +XHTML_URL_DATA_DATA_INVALID_COMMA = Comma found in data portion of data URL: {0} +XHTML_URL_DATA_MIMETYPE = The mimetype portion of the data: URL is not valid ({1}) in URL: {0} +XHTML_URL_DATA_NO_DATA = No data found in data: URL +XHTML_URL_EMPTY = URL is empty +XHTML_URL_INVALID = The URL is not valid because ''({1})'': {0} +XHTML_URL_INVALID_CHARS_one = URL contains Invalid Character ({1}) +XHTML_URL_INVALID_CHARS_other = URL contains {0} Invalid Characters ({1}) +XHTML_XHTML_Attribute_Illegal = Invalid attribute name in the XHTML (''{0}'' on ''{1}'') +XHTML_XHTML_DOCTYPE_ILLEGAL = Malformed XHTML: Found a DocType declaration, and these are not allowed (XXE security vulnerability protection) +XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = Invalid element name inside a paragraph in the XHTML (''{0}'') +XHTML_XHTML_Element_Illegal = Invalid element name in the XHTML (''{0}'') +XHTML_XHTML_Entity_Illegal = Invalid entity in the XHTML (''{0}'') +XHTML_XHTML_Image_Reference_Illegal = Invalid Image Reference in the XHTML (''{0}'') +XHTML_XHTML_NS_InValid = Wrong namespace on the XHTML (''{0}'', should be ''{1}'') +XHTML_XHTML_Name_Invalid = Wrong name on the XHTML (''{0}'') - must start with div +XSI_TYPE_UNNECESSARY = xsi:type is unnecessary at this point +XSI_TYPE_WRONG = The xsi:type value ''{0}'' is wrong (should be ''{1}''). Note that xsi:type is unnecessary at this point +_DT_Fixed_Wrong = Value is ''{0}'' but must be ''{1}''{2} +_has_children__and_multiple_types__in_profile_ = {0} has children ({1}) and multiple types ({2}) in profile {3} +_has_children__for_type__in_profile__but_cant_find_type = {0} has children ({1}) for type {2} in profile {3}, but can''t find type +_has_no_children__and_no_types_in_profile_ = {0} has no children ({1}) and no types in profile {2} +defined_in_the_profile = Defined in the profile +documentmsg = (document) +element__null_ = Element = null: {0} +element_id__null__on_ = Element id = null: {0} on {1} +error_writing_number__to_JSON = Error writing number ''{0}'' to JSON +getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList should only be called when the element has slicing +needs_a_snapshot = Needs a snapshot +no_base_profile_provided = No base profile provided +no_derived_structure_provided = No derived structure provided +no_url_in_expand_value_set = No url in expand value set +no_url_in_expand_value_set_2 = No url in expand value set 2 +no_value_set = ValueSet has no url property +not_done_yet_cant_fetch_ = Not done yet: can''t fetch {0} +not_the_right_kind_of_structure_to_generate_schematrons_for = Not the right kind of structure to generate schematrons for +null_min = Null min +reference_to__cannot_be_resolved = reference to {0} cannot be resolved +type_on_first_differential_element = Type on first differential element! +type_on_first_snapshot_element_for__in__from_ = Type on first snapshot element for {0} in {1} from {2} +xml_attr_value_invalid = The XML Attribute {0} has an invalid character +xml_encoding_invalid = The XML encoding is invalid (must be UTF-8) +Bundle_BUNDLE_Entry_NotFound = Can''t find ''{0}'' in the bundle ({1}) +CONCEPTMAP_VS_CONCEPT_CODE_UNKNOWN_SYSTEM = The code ''{1}'' comes from the system {0} which could not be found, so it''s not known whether it''s valid in the value set ''{2}'' +CONCEPTMAP_VS_CONCEPT_CODE_UNKNOWN_SYSTEM_VERSION = The code ''{1}'' comes from the system {0} version {3} which could not be found, so it''s not known whether it''s valid in the value set ''{2}'' +SD_TYPE_PARAMETER_MISSING = The type definition ''{2}'' does not declare a type parameter, but it is derived from the type definition ''{0}'' which has the type parameter ''{1}'' +SD_TYPE_PARAMETER_UNKNOWN = The type definition ''{0}'' has the type parameter ''{1}'' but it is not a known type so derivation consistency cannot be checked +SD_TYPE_PARAMETER_INVALID = The type definition ''{2}'' has a type parameter ''{3}'', which is not consistent with it''s ancestor type definition ''{0}'' which has the type parameter ''{1}'' +SD_TYPE_PARAMETER_INVALID_REF = The type ''{0}'' is a reference to ''{1}'' which has a type parameter ''{2}'' with a base type of {3} but the type parameter provided is ''{4}'' which is not the right type +SD_TYPE_PARAM_NOT_SPECIFIED = The type ''{0}'' at {3} is a reference to ''{1}'' which needs a type parameter ''{2}'' but a type parameter is not provided for ''{2}'' +SD_TYPE_PARAMETER_ABSTRACT_WARNING = The type ''{0}'' at {3} refers to the abstract type ''{1}'' but the context is not an abstract type - this is usually an error +IG_DEPENDENCY_DIRECT = The URL should refer directly to the ImplementationGuide resource (e.g. include ''/ImplementationGuide/'') +IG_DEPENDENCY_INVALID_PACKAGEID = The packageId {0} is not valid +IG_DEPENDENCY_CLASH_PACKAGEID = The canonical URL {0} points to the package {1} which is inconsistent with the stated packageId of {2} +IG_DEPENDENCY_CLASH_CANONICAL = The packageId {0} points to the canonical {1} which is inconsistent with the stated canonical of {2} +IG_DEPENDENCY_NO_PACKAGE = No NPM package id could be determined so the version consistency can't be checked +IG_NO_VERSION = No fhir version was specified for the IG so the version consistency can't be checked +IG_DEPENDENCY_NO_VERSION = No version was specified for the package so the version consistency can't be checked +IG_DEPENDENCY_INVALID_PACKAGE_VERSION = The version {0} is not a valid NPM package version +IG_DEPENDENCY_PACKAGE_UNKNOWN = The package {0} could not be found so the version consistency can't be checked +IG_DEPENDENCY_VERSION_ERROR = The ImplementationGuide is based on FHIR version {0} but package {1} is based on FHIR version {2}. Use the package {3} instead +IG_DEPENDENCY_VERSION_WARNING = The ImplementationGuide is based on FHIR version {0} but package {1} is based on FHIR version {2}. In general, this version mismatch should be avoided - some tools will try to make this work with variable degrees of success, but others will not even try +IG_DEPENDENCY_EXCEPTION = Exception checking package version consistency: {0} +NDJSON_EMPTY_LINE_WARNING = The NDJSON source contains an empty line. This may not be accepted by some processors +TYPE_SPECIFIC_CHECKS_DT_XHTML_EMPTY_HREF = Hyperlink at ''{0}'' for ''{1}'' is empty +TYPE_SPECIFIC_CHECKS_DT_XHTML_ACTIVE_HREF = Hyperlink scheme ''{3}'' in ''{0}'' at ''{1}'' for ''{2}'' has active content, which is a security risk and not allowed +TYPE_SPECIFIC_CHECKS_DT_XHTML_UNKNOWN_HREF = Hyperlink scheme ''{3}'' in ''{0}'' at ''{1}'' for ''{2}'' is not a widely supported protocol and should be checked +TYPE_SPECIFIC_CHECKS_DT_XHTML_LITERAL_HREF = Hyperlink scheme ''{3}'' in ''{0}'' at ''{1}'' for ''{2}'' is not a valid hyperlinkable scheme +SM_TARGET_TYPE_UNKNOWN = The type of the target variable is not known: {0} +XHTML_XHTML_ATTRIBUTE_XML_SPACE = The attribute 'xml:space' is legal but has a fixed value of 'preserve'. It''s use is discouraged +VALIDATION_HL7_PUBLISHER_MULTIPLE_WGS = This resource has more than workgroup extension (http://hl7.org/fhir/StructureDefinition/structuredefinition-wg) +NO_VALID_DISPLAY_FOUND_NONE_FOR_LANG = Wrong Display Name ''{0}'' for {1}#{2}. There are no valid display names found for language(s) ''{3}''. Default display is ''{4}'' +NO_VALID_DISPLAY_AT_ALL = Cannot validate display Name ''{0}'' for {1}#{2}: No displays are known + diff --git a/exec/pack/Messages_de.properties b/exec/pack/Messages_de.properties index 8e07ca70b..1ac876795 100644 --- a/exec/pack/Messages_de.properties +++ b/exec/pack/Messages_de.properties @@ -1,909 +1,839 @@ -#InstanceValidator -# If you are going to add messages to this file, you need to convert the umlaut characters to the ISO 8859-1 encoding. -# This can be done by taking the text file containing the new strings and using the tool native2ascii to encode them to -# \uxxxx format, so they will display properly. (native2ascii -encoding UTF-8 infile.properties outfile.properties) - -Bundle_BUNDLE_Entry_Canonical=Die canonical URL ({0}) stimmt nicht mit der fullUrl Url ({1}) \u00fcberein sofern sie sich nicht auf dem canonical Server selbst befindet. -Bundle_BUNDLE_Entry_Document=Der erste Eintrag in einem document muss eine composition sein -Bundle_BUNDLE_Entry_IdUrlMismatch=Die Ressourcen-ID stimmt nicht mit der ID in der fullUrl \u00fcberein (''{0}'' vs. ''{1}'') -Bundle_BUNDLE_Entry_MismatchIdUrl=Die canonical URL ({0}) stimmt nicht mit der fullUrl ({1}) \u00fcberein solange die Ressourcen-ID ({2}) nicht auch \u00fcbereinstimmt -Bundle_BUNDLE_Entry_NoFirst=Documents oder Messages m\u00fcssen mindestens einen Eintrag enthalten -Bundle_BUNDLE_Entry_NoFirstResource=Keine Ressource im ersten entry -Bundle_BUNDLE_Entry_NoFullUrl=Bundle-entry fehlt die fullUrl -Bundle_BUNDLE_Entry_NotFound=''{0}'' konnte nicht in bundle ({1}) gefunden werden -Bundle_BUNDLE_Entry_Type=Der type ''{0}'' ist nicht g\u00fcltig - hier sind keine Ressourcen erlaubt -Bundle_BUNDLE_Entry_Type2=Der type ''{0}'' ist nicht g\u00fcltig - muss {1} sein -Bundle_BUNDLE_Entry_Type3_one=Der type ''{1}'' ist nicht g\u00fcltig - muss einer von {2} sein -Bundle_BUNDLE_Entry_Type3_other=Der type ''{1}'' ist nicht g\u00fcltig - muss einer von {2} sein -Bundle_BUNDLE_FullUrl_Missing=Es besteht eine relative Reference innerhalb des Bundles, dessen Eintrag eine fullUrl fehlt -Bundle_BUNDLE_FullUrl_NeedVersion=Eintr\u00e4ge, die mit fullURL {0} \u00fcbereinstimmen, sollten meta/versionId deklarieren, da versionsspezifische Referenzen vorhanden sind. -Bundle_BUNDLE_MultipleMatches=Mehrere \u00dcbereinstimmungen im Bundle f\u00fcr reference {0} -Bundle_BUNDLE_Not_Local=URN reference ist nicht lokal innerhalb des Bundles contained {0} -Bundle_MSG_Event_Count=Erwartet {0}, aber gefundene {1} event Elemente -Bundle_Document_Date_Missing=Ein Dokument muss ein Datum haben {0} -Bundle_Document_Date_Missing_html=[(type = 'document') impliziert (meta.lastUpdated.hasValue())] -CapabalityStatement_CS_SP_WrongType=Typabweichung - SearchParameter ''{0}'' sollte type {1} sein, ist aber {2} -CodeSystem_CS_VS_IncludeDetails=CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber das Include beeinhaltet zus\u00e4tzliche Details -CodeSystem_CS_VS_Invalid=CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber keinen einzigen include -CodeSystem_CS_VS_WrongSystem=CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber besitzt kein passendes system ({2}) -Extension_EXT_Count_Mismatch=Abweichungen bei Anzahl der Extensions: erwartet {0}, aber gefunden {1} -Extension_EXT_Count_NotFound=Ungleiche Anzahl von Extensions: Extensions {0} kann nicht gefunden werden -Extension_EXT_Fixed_Banned=Keine Extensions erlaubt, da der angegebene fixed value keine Extension enth\u00e4lt -Extension_EXT_Modifier_MismatchN=Abweichung des Extension modifiers: Die Extension ist nicht als modifier gekennzeichnet, im Gegensatz zur zugrunde liegenden Extension -Extension_EXT_Modifier_MismatchY=Abweichung des Extension modifiers: Die Extension ist als modifier gekennzeichnet, im Gegensatz zur zugrunde liegenden Extension -Extension_EXT_Modifier_N=Die Extension ''{0}'' darf nicht als Extension verwendet werden (es handelt sich um eine ModifierExtension) -Extension_EXT_Modifier_Y=Die Extension ''{0}'' muss als modifierExtension verwendet werden -Extension_EXT_SubExtension_Invalid=Die Unter-Extension url ''{0}'' ist nicht durch die Extension {1} definiert -Extension_EXT_Type=Die Definition der Extension ''{0}'' erlaubt die Typen {1}, Typ {2} wurde gefunden -Extension_EXT_URL_Absolute=Extension.url muss eine absolute URL sein. -Extension_EXT_Unknown=Unbekannte extension {0} -Extension_EXT_Unknown_NotHere=Die extension {0} ist nicht bekannt, and hier nicht erlaubt -Extension_EXT_Url_NotFound=Extension.url ist erforderlich -Extension_EXT_Version_Internal=Extension url ''{0}'' Pr\u00fcfung fehlgeschlagen -Extension_EXT_Version_Invalid=Extension url ''{0}'' ist nicht g\u00fcltig (ung\u00fcltige Version ''{1}'') -Extension_EXT_Version_InvalidId=Extension url ''{0}'' ist nicht g\u00fcltig (ung\u00fcltige Element id ''{1}'') -Extension_EXT_Version_NoChange=Die Extension url ''{0}'' ist nicht g\u00fcltig (Element id ''{1}'' ist g\u00fcltig, kann aber nicht in einem versionen\u00fcbergreifenden Paradigma verwendet werden, da es keine \u00c4nderungen in den relevanten Versionen gegeben hat) -Fixed_Type_Checks_DT_Address_Line=Erwartet {0}, aber gefundene {1} line Elemente -Fixed_Type_Checks_DT_Name_Family=Erwartet {0}, aber gefundene {1} family Elemente -Fixed_Type_Checks_DT_Name_Given=Erwartet {0}, aber gefundene {1} given Elemente -Fixed_Type_Checks_DT_Name_Prefix=Erwartet {0}, aber gefundene {1} prefix Elemente -Fixed_Type_Checks_DT_Name_Suffix=Erwartet {0}, aber gefundene {1} suffix Elemente -Internal_INT_Bad_Type=Unbehandelter fixed value type {0} -Language_XHTML_Lang_Different1=Die Ressource hat eine Sprache ({0}), und das XHTML hat eine Sprache ({1}), aber sie unterscheiden sich -Language_XHTML_Lang_Different2=Die Ressource hat language ({0}), und das XHTML hat xml:lang ({1}), aber sie unterscheiden sich -Language_XHTML_Lang_Missing1=Die Ressource hat eine language, aber das XHTML hat kein lang oder ein xml:lang Tag (ben\u00f6tigt beides - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing2=Die Ressource hat eine language, aber das XHTML hat kein lang-Tag (ben\u00f6tigt sowohl lang als auch xml:lang - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing3=Die Ressource hat eine language, aber das XHTML hat kein xml:lang-Tag (ben\u00f6tigt sowohl lang als auch xml:lang - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Meta_RES_Security_Duplicate=Dupliziertes Security Label {0} -MustSupport_VAL_MustSupport=Das Element {0} ist im Profil {1} nicht als ''mustSupport'' gekennzeichnet. Erw\u00e4gen Sie, das Element nicht zu verwenden oder das Element als ''must-Support'' im Profil zu markieren. -Profile_EXT_Not_Here=Die Extension {0} darf an dieser Stelle nicht verwendet werden (basierend auf der Kontextinvariante ''{1}'') -Profile_VAL_MissingElement=Fehlendes Element ''{0}'' - erforderlich durch den im Profil zugewiesenen festen Wert {1} -Profile_VAL_NotAllowed=Das Element {0} ist in der Instanz vorhanden, aber im zutreffenden {1}, das im Profil angegeben ist, nicht erlaubt. -Questionnaire_QR_Item_BadOption=Der angegebene Wert ({0}::{1}) ist nicht in den im Fragebogen gesetzten options value set enthalten. -Questionnaire_QR_Item_Coding=Fehler {0} bei der Validierung des Coding gegen Questionnaire Options -Questionnaire_QR_Item_CodingNoOptions=Coding option kann nicht validiert werden, da keine option list bereitgestellt wird -Questionnaire_QR_Item_DateNoOptions=Date answer option kann nicht validiert werden, weil keine option list zur Verf\u00fcgung steht -Questionnaire_QR_Item_Display=Elemente, die nicht vom Typ DISPLAY sind, sollten keine Elemente enhtalten - linkId {0} -Questionnaire_QR_Item_Group=Elemente der Typgruppe sollten keine Antworten beinhalten -Questionnaire_QR_Item_IntNoOptions=Kann die ganzzahlige Antwortoption nicht validieren, da keine option list bereitgestellt wird -Questionnaire_QR_Item_Missing=Keine Antwort f\u00fcr das erforderliche Element gefunden {0} -Questionnaire_QR_Item_NoCoding=Der Code {0}::{1} ist keine g\u00fcltige Option. -Questionnaire_QR_Item_NoDate=Das Datum {0} ist keine g\u00fcltige Option. -Questionnaire_QR_Item_NoInteger=Integer {0} ist keine g\u00fcltige Option -Questionnaire_QR_Item_NoLinkId=Keine LinkId, kann also nicht validiert werden -Questionnaire_QR_Item_NoOptions=Optionen k\u00f6nnen nicht validiert werden, weil keine Option oder Optionen angeboten werden -Questionnaire_QR_Item_NoOptionsCoding=Optionsliste hat keine Optionswerte vom Typ Coding -Questionnaire_QR_Item_NoOptionsDate=Optionsliste hat keine Optionswerte vom Typ date -Questionnaire_QR_Item_NoOptionsInteger=Optionsliste hat keine Optionswerte vom Typ Integer -Questionnaire_QR_Item_NoOptionsString=Optionsliste hat keine Optionswerte vom Typ String -Questionnaire_QR_Item_NoOptionsTime=Optionsliste hat keine Optionswerte vom Typ time -Questionnaire_QR_Item_NoString=Der String {0} ist keine g\u00fcltige Option -Questionnaire_QR_Item_NoTime=time {0} ist keine g\u00fcltige Option -Questionnaire_QR_Item_NoType=Definition f\u00fcr Element {0} enth\u00e4lt keinen Typ -Questionnaire_QR_Item_NotEnabled=Item hat Antwort (2), auch wenn es nicht aktiviert ist {0} -Questionnaire_QR_Item_NotEnabled2=Item besitzt eine answer, auch wenn es nicht aktiviert ist (Element-ID = ''{0}'') -Questionnaire_QR_Item_NotFound=LinkId ''{0}'' im questionnaire nicht gefunden -Questionnaire_QR_Item_OnlyOneA=Nur ein Antwortelement mit dieser LinkId zul\u00e4ssig -#The following error cannot occur for a single item. _one case left intentionally blank. -Questionnaire_QR_Item_OnlyOneI_other=Nur ein Antwortelement mit dieser LinkId erlaubt - {1} -Questionnaire_QR_Item_Order=Struktureller Fehler: Elemente in falscher Reihenfolge -Questionnaire_QR_Item_StringNoOptions=String answer option kann nicht validiert werden, da keine Optionsliste bereitgestellt wird -Questionnaire_QR_Item_Text=Wenn Text vorhanden ist, muss er mit der Fragebogen-Definition f\u00fcr linkId {0} \u00fcbereinstimmen. -Questionnaire_QR_Item_TimeNoOptions=Kann die time answer option nicht validieren, weil keine Optionsliste zur Verf\u00fcgung steht -Questionnaire_QR_Item_WrongType_one=Answer value muss vom Typ {0} sein. -Questionnaire_QR_Item_WrongType_other=Answer value muss einer der Typen {1} sein -Questionnaire_QR_Q_None=Es konnte kein passendes questionnaire identifiziert werden, so dass keine Validierung gegen den Basisfragebogen durchgef\u00fchrt werden kann. -Questionnaire_QR_Q_NotFound=Der Fragebogen ''{0}'' konnte nicht gefunden werden, so dass keine Validierung gegen den Basisfragebogen durchgef\u00fchrt werden kann. -Questionnaire_Q_EnableWhen_After=Das Ziel dieser enableWhen-Regel ({0}) kommt nach der Frage selbst -Questionnaire_Q_EnableWhen_IsInner=Fragen mit einem enableWhen k\u00f6nnen sich nicht auf eine innere Frage f\u00fcr ihren aktivierten enableWhen beziehen -Questionnaire_Q_EnableWhen_NoLink=Fragen mit einem enableWhen m\u00fcssen einen Wert f\u00fcr den question link enthalten -Questionnaire_Q_EnableWhen_NoTarget=Ziel ''{0}'' f\u00fcr das enableWhen diese Frage konnte nicht gefunden werden -Questionnaire_Q_EnableWhen_Self=Ziel des enableWhen dieser Frage kann sich nicht selbst referenzieren -Reference_REF_Aggregation=Die Reference ist {0}, welche von dem angegebenen Aggregationsmodus f\u00fcr die Referenz nicht unterst\u00fctzt wird. -Reference_REF_BadTargetType=Ung\u00fcltiger Ressourcen-Zieltyp. Gefunden {0}, aber einen von ({1}) erwartet -Reference_REF_BadTargetType2=Der Typ ''{0}'', der durch die Referenz-URL {1} impliziert wird, ist kein g\u00fcltiges Ziel f\u00fcr dieses Element (muss eines von {2} sein) -Reference_REF_CantMatchChoice=Es konnte kein passendes Profil f\u00fcr {0} unter den Auswahlm\u00f6glichkeiten [{1}] gefunden werden -Reference_REF_CantMatchType=Es konnte kein passendes Profil f\u00fcr {0} (nach Typ) unter den Auswahlm\u00f6glichkeiten [{1}] gefunden werden -Reference_REF_CantResolve=Ressource ''{0}'' nicht auffindbar -Reference_REF_CantResolveProfile=Der Profilbezug ''{0}'' konnte nicht aufgel\u00f6st werden. -Reference_REF_Format1=Relative URLs m\u00fcssen das Format [ResourceName]/[id] haben, oder eine Such-ULR ist erlaubt ([type]?parameters. Gefunden {0}) -Reference_REF_Format2=Relative URLs m\u00fcssen das Format [ResourceName]/[id] haben. Gefunden {0} -Reference_REF_MultipleMatches=Es wurden mehrere \u00fcbereinstimmende Profile f\u00fcr {0} unter den Auswahlm\u00f6glichkeiten gefunden: {1} -Reference_REF_NoDisplay=Eine Referenz ohne eine tats\u00e4chliche Referenz oder einen Identifikator sollte eine Displaywert haben -Reference_REF_NoType=Kann den Typ der Zielressource nicht bestimmen -Reference_REF_NotFound_Bundle=Bundled oder contained Referenz, welche nicht im Bundle/Ressource gefunden wurde {0} -Reference_REF_ResourceType=Passende Referenz f\u00fcr Referenz {0} hat resourceType {1} -Reference_REF_WrongTarget=Der Typ ''{0}'' ist kein g\u00fcltiges Ziel f\u00fcr dieses Element (muss einer von {1} sein) -Resource_RES_ID_Missing=Die Ressource erfordert eine ID, aber es ist keine vorhanden -Resource_RES_ID_Prohibited=Die Ressource hat eine ID, aber keine ist erlaubt -Terminology_PassThrough_TX_Message = {0} f\u00fcr ''{1}#{2}'' -Terminology_TX_Binding_CantCheck=Binding durch URI-Referenz kann nicht \u00fcberpr\u00fcft werden -Terminology_TX_Binding_Missing=Binding f\u00fcr {0} fehlt (cc) -Terminology_TX_Binding_Missing2=Binding f\u00fcr {0} fehlt -Terminology_TX_Binding_NoServer=Der angegebene Wert konnte in Ermangelung eines Terminologieservers nicht validiert werden -Terminology_TX_Binding_NoSource=Binding f\u00fcr Pfad {0} hat keine source, kann also nicht \u00fcberpr\u00fcft werden -Terminology_TX_Binding_NoSource2=Binding hat keine source, kann also nicht \u00fcberpr\u00fcft werden. -Terminology_TX_Code_NotValid=Code {0} ist kein g\u00fcltiger Code im Codesystem {1} -Terminology_TX_Code_Unknown=Unbekannter Code ({0}#{1}) -Terminology_TX_Code_ValueSet=Es wird kein Code gesetzt, und es ist ein Code aus ValueSet {0} ({1}) erforderlich -Terminology_TX_Code_ValueSetMax=Kein Code gesetzt, und es muss ein Code aus ValueSet {0} (max. Wertemenge {1}) gesetzt werden -Terminology_TX_Code_ValueSet_Ext=Kein Code gesetzt, und es sollte ein Code aus ValueSet{0} ({1}) gesetzt werden -Terminology_TX_Coding_Count=Erwartete {0}, aber gefundene {1} coding elements -Terminology_TX_Confirm_1_CC=Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind und ein Code aus diesem ValueSet ist erforderlich (class = {1}) -Terminology_TX_Confirm_2_CC=Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind und ein Code aus diesem ValueSet stammen sollte. Es sei denn, es enth\u00e4lt keinen geeigneten Code (class = {1}) -Terminology_TX_Confirm_3_CC=Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und es wird empfohlen einen Code aus diesem ValueSet zu verwenden (Klasse = {1}) -Terminology_TX_Confirm_5=Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und ein Code sollte aus diesem ValueSet stammen. Es sei denn, er hat enth\u00e4lt keinen geeigneten Code -Terminology_TX_Confirm_6=Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und es wird empfohlen, einen Code aus diesem ValueSet zu verwenden. -Terminology_TX_Display_Wrong=Display sollte ''{0}'' sein -Terminology_TX_Error_CodeableConcept=Fehler {0} bei der Validierung des CodeableConcepts -Terminology_TX_Error_CodeableConcept_Max=Fehler {0} bei der Validierung des CodeableConcepts mit maxValueSet -Terminology_TX_Error_Coding1=Fehler {0} bei der Validierung des Coding -Terminology_TX_Error_Coding2=Fehler {0} bei der Validierung des Coding: {1} -Terminology_TX_NoValid_1_CC=Keiner der bereitgestellten Codes ist im ValueSet {0}, und ein Code aus diesem ValueSet ist erforderlich) (Codes = {1}) -Terminology_TX_NoValid_10=Der bereitgestellte Code ist nicht im maximum ValueSet {0}, und ein Code aus diesem ValueSet ist erforderlich) (Code = {1}#{2}) -Terminology_TX_NoValid_11=Der bereitgestellte Code ist nicht im maximum value set {0}, und ein Code aus diesem ValueSet ist erforderlich) (Code = {1}#{2}, Fehler = {3})) -Terminology_TX_NoValid_12=Die angegebene Codierung ist nicht im ValueSet {0} enthalten, und es wird ein Code aus diesem ValueSet ben\u00f6tigt. {1} -Terminology_TX_NoValid_13=Die bereitgestellte Codierung ist nicht im ValueSet {0} enthalten, und ein Code sollte aus diesem ValueSet stammen, es sei denn, er hat enth\u00e4lt geeigneten Code. {1} -Terminology_TX_NoValid_14=Die angegebene Codierung ist nicht im ValueSet {0} enthalten, und es wird empfohlen, einen Code aus diesem ValueSet zu verwenden. {1} -Terminology_TX_NoValid_15=Der angegebene Wert (''{0}'') konnte in Ermangelung eines Terminologieservers nicht validiert werden. -Terminology_TX_NoValid_16=Der angegebene Wert (''{0}'') ist nicht im ValueSet {1}, und ein Code aus diesem Valueset ist erforderlich){2} -Terminology_TX_NoValid_17=Der angegebene Wert (''{0}'') ist nicht im Valueset {1}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er hat enth\u00e4lt geeigneten Code){2} -Terminology_TX_NoValid_18=Der angegebene Wert (''{0}'') ist nicht im Valueset {1}, und es wird empfohlen, einen Code aus diesem Valueset zu verwenden){2} -Terminology_TX_NoValid_2_CC=Keiner der angegebenen Codes ist im Valueset {0}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er enth\u00e4lt keinen geeigneten Code) (Codes = {1}) -Terminology_TX_NoValid_3_CC=Keiner der angegebenen Codes ist im Valueset {0}, und es wird empfohlen, einen Code aus dieserm Valueset zu verwenden) (Codes = {1}) -Terminology_TX_NoValid_4=Die bereitgestellte Codierung ist nicht im Valueset {0}, und es wird ein Code aus diesem Valueset ben\u00f6tigt{1} -Terminology_TX_NoValid_5=Die angegebene Codierung ist nicht im Valueset {0}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er enth\u00e4lt keinen geeigneten Code{1} -Terminology_TX_NoValid_6=Die bereitgestellte Codierung ist nicht im Valueset {0} enthalten, und es wird empfohlen, einen Code aus diesem Valueset zu verwenden{1} -Terminology_TX_NoValid_7=Keiner der bereitgestellten Codes konnte gegen das maximum value set {0} validiert werden, (Fehler = {1}) -Terminology_TX_NoValid_8=Keiner der bereitgestellten Codes befindet sich im maximum value sete {0}, und ein Code aus diesem Valueset ist erforderlich) (Codes = {1}) -Terminology_TX_NoValid_9=Der bereitgestellte Code konnte nicht gegen das the maximum value set {0} validiert werden, (Fehler = {1}) -Terminology_TX_System_Invalid=Ung\u00fcltige System URI: {0} -Terminology_TX_System_NotKnown=Code System URI ''{0}'' ist unbekannt, so dass der Code nicht validiert werden kann -Terminology_TX_System_Relative=Coding.system muss eine absolute Referenz sein, nicht eine lokale Referenz -Terminology_TX_System_Unknown=Unbekanntes Code System ''{0}'' -Terminology_TX_System_ValueSet=Ung\u00fcltige System-URI: {0} - kann kein ValueSet URI als System verwenden -Terminology_TX_System_ValueSet2=Die Codierung bezieht sich auf ein ValueSet, nicht auf ein Codesystem (''{0}''). -Terminology_TX_ValueSet_NotFound=ValueSet {0} vom Validator nicht gefunden -Type_Specific_Checks_DT_Base64_Valid=Der Wert ''{0}'' ist kein g\u00fcltiger Base64-Wert. -Type_Specific_Checks_DT_Boolean_Value=Boolesche Werte m\u00fcssen ''wahr'' oder ''falsch'' sein. +# InstanceValidator = one,other +ALL_OK = Alles OK +ARRAY_CANNOT_BE_EMPTY = Array kann nicht leer sein - Property sollte nicht vorhanden sein, falls es keine Werte hat +Adding_wrong_path = Falschen Pfad hinzuf\u00fcgen +Adding_wrong_path__outcomegetPath___resultPathBase__ = Falscher Pfad hinzugef\u00fcgt - outcome.getPath() = {0}, resultPathBase = {1} +Adding_wrong_path_in_profile___vs_ = Falscher Pfad im Profil hinzugef\u00fcgt {0}: {1} vs {2} +All_observations_should_have_a_performer = !!Alle Observations sollten einen Performer haben +All_observations_should_have_a_subject = !!Alle Observations sollten ein Subject haben +All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = !!Alle Observations sollten ein effectiveDateTime oder eine effectivePeriode haben +Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Versuch ein Element zu sclicen, das sich nicht wiederholt: {0}/{1} von {2} in {3} +Attempt_to_replace_element_name_for_a_nonchoice_type = Versuch, den Elementnamen f\u00fcr einen non-choice type zu ersetzen +Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Versuch den Terminologieserver zu verwenden, wenn kein Terminologieserver verf\u00fcgbar ist +Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Versuch einen Schnappschuss f\u00fcr das Profil ''{0}'' als {1} zu verwenden, bevor er generiert wird +BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Mit Ausnahme von Transaktionen und Batches muss jeder Eintrag in einem Bundle eine FullUrl haben, die die Identit\u00e4t der Ressource im Entry repr\u00e4sentiert +BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = Eintrag {0} ist nicht erreichbar, wenn man vom MessageHeader aus vorw\u00e4rts traversiert. Pr\u00fcfen Sie, ob dieser Eintrag enthalten sein soll (f\u00fcr die Verarbeitung der Nachricht erforderlich) +BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = Der Eintrag {0} ist nicht erreichbar, wenn man von der Komposition aus vorw\u00e4rts traversiert. Nur Provenance ist f\u00fcr diese Art der Verwendung zugelassen (R4 Abschnitt 3.3.1) +BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = Der Eintrag {0} ist nicht erreichbar, wenn man von der Komposition aus vorw\u00e4rts traversiert. Pr\u00fcfen Sie, ob dieser Eintrag direkt von der Komposition aus verlinkt werden sollte, wenn es sich um eine Quelle f\u00fcr narrative Inhalte handelt +BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = Eintrag {0} stimmt mit dem Verweis {1} nach Typ und ID \u00fcberein, aber er stimmt nicht mit der vollst\u00e4ndigen Ziel-URL {2} nach den Regeln der Bundle-Aufl\u00f6sung \u00fcberein +BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = Eintrag {0} stimmt mit dem Verweis {1} nach Typ und ID \u00fcberein, aber seine vollst\u00e4ndige URL {2} stimmt nicht mit der vollst\u00e4ndigen Ziel-URL {3} nach den Regeln der Bundle-Aufl\u00f6sung \u00fcberein +BUNDLE_LINK_SEARCH_NO_DUPLICATES = Der Verkn\u00fcpfungstyp ''{0}'' kann nur einmal vorkommen +BUNDLE_LINK_SEARCH_PROHIBITED = Der in SearchSets verwendete Verkn\u00fcpfungstyp ''{0}'' ist in diesem Zusammenhang verboten +BUNDLE_LINK_STYELSHEET_EXTERNAL = Andere externe Stylesheets als https://hl7.org/fhir/fhir.css SOLLTEN nicht verwendet werden. +BUNDLE_LINK_STYELSHEET_INSECURE = Der Stylesheet-Verweis ist nicht sicher +BUNDLE_LINK_STYELSHEET_LINKABLE = Der Stylesheet-Verweis ist kein aufl\u00f6sbarer Link +BUNDLE_LINK_STYELSHEET_NOT_FOUND = Der Stylesheet-Verweis konnte in diesem Bundle nicht aufgel\u00f6st werden +BUNDLE_LINK_UNKNOWN = Der Link-Beziehungstyp ''{0}'' ist unbekannt und in diesem Zusammenhang nicht zul\u00e4ssig +BUNDLE_POSSSIBLE_MATCHES = Das Bundle enth\u00e4lt keine \u00dcbereinstimmung f\u00fcr {1} nach den Regeln der Bundle-Referenzaufl\u00f6sung, aber es hat mehrere Ressourcen, die {0} nach Ressourcentyp und ID entsprechen +BUNDLE_RULE_INVALID_INDEX = Bundle Rules Index ist ung\u00fcltig ({0}) +BUNDLE_RULE_NONE = Keine Regel +BUNDLE_RULE_PROFILE_UNKNOWN = Bundle Rules Profil {1} ist unbekannt f\u00fcr {0} +BUNDLE_RULE_UNKNOWN = Bundle Rule verweist auf ung\u00fcltige Ressource {0} +BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle-Eintr\u00e4ge m\u00fcssen Ressourcen enthalten +BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Suchergebnisse m\u00fcssen IDs haben +BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Es konnte nicht festgestellt werden, ob diese Ressource ein g\u00fcltiger Ressourcentyp f\u00fcr diese Suche ist +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = Dies ist kein passender Ressourcentyp f\u00fcr die angegebene Suche ({0}, erwartet {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = Dies ist kein passender Ressourcentyp f\u00fcr die angegebene Suche (ist ein Suchmodus erforderlich?) ({0} erwartet {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = Dies ist kein OperationOutcome ({0}) +BUNDLE_SEARCH_NOSELF = SearchSet Bundles sollten einen Self-Link haben, der angibt, worum es bei der Suche ging +BUNDLE_SEARCH_NO_MODE = SearchSet-Bundles sollten Suchmodi f\u00fcr die Eintr\u00e4ge enthalten +BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = Es konnten keine Typen aus dem Suchstring ermittelt werden, so dass die Typen nicht \u00fcberpr\u00fcft werden k\u00f6nnen +Bad_file_path_error = !!\n********************\n* Der \u00fcbergebene Dateiname ''{0}'' existiert nicht im lokalen Dateisystem.\n* Bitte \u00fcberpr\u00fcfen Sie, ob dies ein g\u00fcltiger Pfad f\u00fcr die Datei ist.\n********************\n\n +Base__Derived_profiles_have_different_types____vs___ = Basis- und abgeleitete Profile haben unterschiedliche Typen ({0} = {1} vs. {2} = {3}) +Base_profile__has_no_type = Das Basisprofil {0} hat keinen Typ +Bundle_BUNDLE_Entry_Canonical = Die canonical URL ({0}) stimmt nicht mit der fullUrl Url ({1}) \u00fcberein sofern sie sich nicht auf dem canonical Server selbst befindet. +Bundle_BUNDLE_Entry_Document = Der erste Eintrag in einem document muss eine composition sein +Bundle_BUNDLE_Entry_IdUrlMismatch = Die Ressourcen-ID stimmt nicht mit der ID in der fullUrl \u00fcberein (''{0}'' vs. ''{1}'') +Bundle_BUNDLE_Entry_MismatchIdUrl = Die canonical URL ({0}) stimmt nicht mit der fullUrl ({1}) \u00fcberein solange die Ressourcen-ID ({2}) nicht auch \u00fcbereinstimmt +Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = Angegebenes logisches Modell {1} nicht gefunden f\u00fcr Ressource ''Binary/{0}'' +Bundle_BUNDLE_Entry_NoFirst = Documents oder Messages m\u00fcssen mindestens einen Eintrag enthalten +Bundle_BUNDLE_Entry_NoFirstResource = Keine Ressource im ersten entry +Bundle_BUNDLE_Entry_NoFullUrl = Bundle-entry fehlt die fullUrl +Bundle_BUNDLE_Entry_NoProfile_EXPL = Angegebenes Profil {2} nicht gefunden f\u00fcr {0} Ressource des Typs ''{0}'' +Bundle_BUNDLE_Entry_NoProfile_TYPE = Kein Profil f\u00fcr {0} Ressource des Typs ''{1}'' gefunden +Bundle_BUNDLE_Entry_Orphan_DOCUMENT = Der Eintrag {0} ist nicht erreichbar, wenn man von der Zusammensetzung aus Links (vorw\u00e4rts oder r\u00fcckw\u00e4rts) durchl\u00e4uft +Bundle_BUNDLE_Entry_Orphan_MESSAGE = Eintrag {0} ist nicht \u00fcber Links (vorw\u00e4rts oder r\u00fcckw\u00e4rts) vom MessageHeader aus erreichbar, daher sollte sein Vorhandensein \u00fcberpr\u00fcft werden (wird er zur Verarbeitung der Nachricht ben\u00f6tigt?) +Bundle_BUNDLE_Entry_Type = Der type ''{0}'' ist nicht g\u00fcltig - hier sind keine Ressourcen erlaubt +Bundle_BUNDLE_Entry_Type2 = Der type ''{0}'' ist nicht g\u00fcltig - muss {1} sein +Bundle_BUNDLE_Entry_Type3_one = Der type ''{1}'' ist nicht g\u00fcltig - muss einer von {2} sein +Bundle_BUNDLE_Entry_Type3_other = Der type ''{1}'' ist nicht g\u00fcltig - muss einer von {2} sein +Bundle_BUNDLE_FullUrl_Missing = Es besteht eine relative Reference innerhalb des Bundles, dessen Eintrag eine fullUrl fehlt +Bundle_BUNDLE_FullUrl_NeedVersion = Eintr\u00e4ge, die mit fullURL {0} \u00fcbereinstimmen, sollten meta/versionId deklarieren, da versionsspezifische Referenzen vorhanden sind. +Bundle_BUNDLE_MultipleMatches = Mehrere \u00dcbereinstimmungen im Bundle f\u00fcr reference {0} +Bundle_BUNDLE_Not_Local = URN reference ist nicht lokal innerhalb des Bundles contained {0} +Bundle_Document_Date_Missing = Ein Dokument muss ein Datum haben {0} +Bundle_Document_Date_Missing_html = [(type = 'document') impliziert (meta.lastUpdated.hasValue())] +Bundle_MSG_Event_Count = Erwartet {0}, aber gefundene {1} event Elemente +CDATA_is_not_allowed = CDATA ist nicht erlaubt +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7 Defined CodeSystems M\u00dcSSEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7 Defined CodeSysteme SOLLTEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSysteme SOLLTEN KEINEN angegebenen Wert f\u00fcr das Element {0} haben, wenn sie ein Supplement sind +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = !!CodeSystem-Erg\u00e4nzungen mit dem Content-Wert "supplement" M\u00dcSSEN ein supplements-Element haben, das angibt, welches Codesystem erg\u00e4nzt wird. +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = !!CodeSystem Supplements M\u00dcSSEN einen Content-Wert von "supplement" haben. +CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSysteme SOLLTEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen +CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} ist ein Supplement, kann also nicht als Wert in Coding.system verwendet werden +CODESYSTEM_CS_NO_VS_NOTCOMPLETE = \u00dcberpr\u00fcfen Sie das all-Codes-ValueSet - unvollst\u00e4ndige CodeSysteme sollten im Allgemeinen keinen all-codes ValueSet spezifizieren +CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} kann nicht gefunden werden, daher kann nicht gepr\u00fcft werden, ob die Konzepte g\u00fcltig sind +CODESYSTEM_CS_SUPP_INVALID_CODE = Der Code ''{1}'' ist nicht im Basis-CodeSystem {0} deklariert und daher im Supplement nicht g\u00fcltig +CODESYSTEM_CS_UNK_EXPANSION = !!Der angegebene Code ({2}) befindet sich nicht in der Expansion im ValueSet {0}, und es wird ein Code aus diesem ValueSet ben\u00f6tigt. Das System {1} ist unbekannt. +CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0} hat ein ''all system'' ValueSet von {1}, aber es ist eine Expansion mit der falschen Anzahl von Konzepten (gefunden {2}, erwartet {3}) +CODESYSTEM_SHAREABLE_EXTRA_MISSING = !!Das ShareableCodeSystem-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Codesysteme SOLLTEN mit dem ShareableCodeSystem-Profil \u00fcbereinstimmen +CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = !!!!Das ShareableCodeSystem-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Code-Systeme M\u00dcSSEN dem ShareableCodeSystem-Profil entsprechen +CODESYSTEM_SHAREABLE_MISSING = !!Das ShareableCodeSystem-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Codesysteme SOLLTEN mit dem ShareableCodeSystem-Profil \u00fcbereinstimmen +CODESYSTEM_SHAREABLE_MISSING_HL7 = !!!!Das ShareableCodeSystem-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Code-Systeme M\u00dcSSEN dem ShareableCodeSystem-Profil entsprechen +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = Der Quell-Code ''{0}'' ist im Codesystem {1} nicht g\u00fcltig +CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = !!Source display ''{0}'' ist nicht g\u00fcltig. M\u00f6gliche Codes {1} +CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Das Quellcode-System {0} hat nicht alle Inhalte (Inhalt = {1}), so dass die Codes nicht gepr\u00fcft werden k\u00f6nnen. +CONCEPTMAP_GROUP_SOURCE_MISSING = Kein Quell-Code-System, daher k\u00f6nnen die Quell-Codes nicht \u00fcberpr\u00fcft werden +CONCEPTMAP_GROUP_SOURCE_UNKNOWN = !!Unbekanntes Quellcode-System {0}, daher k\u00f6nnen die Quellcodes nicht \u00fcberpr\u00fcft werden +CONCEPTMAP_GROUP_TARGET_CODE_INVALID = Der Zielcode ''{0}'' ist im Codesystem {1} nicht g\u00fcltig +CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = !!Target display ''{0}'' ist nicht g\u00fcltig. M\u00f6gliche Codes {1} +CONCEPTMAP_GROUP_TARGET_INCOMPLETE = Zielcodesystem {0} hat nicht alle Inhalte (Inhalt = {1}), daher k\u00f6nnen die Codes nicht gepr\u00fcft werden +CONCEPTMAP_GROUP_TARGET_MISSING = Kein Target Code System, daher k\u00f6nnen die Quellcodes nicht \u00fcberpr\u00fcft werden +CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = Der Code {0} ist im System {1} ung\u00fcltig +CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = Der Propertycode ''{0}'' ist nicht bekannt +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = Der Typ dieser Eigenschaft sollte {1} und nicht {0} sein. +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = Da kein System zur Verf\u00fcgung gestellt wurde, kann kein reiner Code verwendet werden. +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = !!Das System {0} ist unbekannt, daher k\u00f6nnen die Codes nicht \u00fcberpr\u00fcft werden. +CONCEPTMAP_GROUP_TARGET_UNKNOWN = !!Unbekanntes Zielcodesystem {0}, daher k\u00f6nnen die Zielcodes nicht \u00fcberpr\u00fcft werden +CONCEPTMAP_SHAREABLE_EXTRA_MISSING = !!Das ShareableConceptMap-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Concept Maps SOLLTEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen +CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = !!!!Das ShareableConceptMap-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Concept Maps M\u00dcSSEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen +CONCEPTMAP_SHAREABLE_MISSING = !!Das ShareableConceptMap-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Concept Maps SOLLTEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen +CONCEPTMAP_SHAREABLE_MISSING_HL7 = !!!!Das ShareableConceptMap-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Concept Maps M\u00dcSSEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen +Can_only_specify_profile_in_the_context = Kann Profil nur im Kontext angeben +Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Kinder auf einem Element mit einem polymorphen Typ sind nicht erlaubt - Sie m\u00fcssen die Typen zuerst slicen und constrainen (sortElemente: {0}:{1}) +CapabalityStatement_CS_SP_WrongType = Typabweichung - SearchParameter ''{0}'' sollte type {1} sein, ist aber {2} +Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Zirkul\u00e4re Snapshot-Referenzen erkannt; kann keinen Snapshot erzeugen (Stapel = {0}) +CodeSystem_CS_VS_IncludeDetails = CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber das Include beeinhaltet zus\u00e4tzliche Details +CodeSystem_CS_VS_Invalid = CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber keinen einzigen include +CodeSystem_CS_VS_WrongSystem = CodeSystem {0} hat einen ''all system'' ValueSet von {1}, aber besitzt kein passendes system ({2}) +Code_found_in_expansion_however_ = Code in der Erweiterung gefunden, jedoch: {0} +Coding_has_no_system__cannot_validate = !!Kodierung hat kein System - kann nicht validiert werden +Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Enthaltene Ressource scheint keine FHIR-Ressource zu sein (unbekannter Name ''{0}'') +Could_not_match_discriminator_for_slice_in_profile_one = Konnte nicht mit dem Diskriminator ({0}) f\u00fcr Slice {1} in Profil {2} \u00fcbereinstimmen - der Diskriminator {3} hat keinen fixed Value, kein Binding oder existence assertions +Could_not_match_discriminator_for_slice_in_profile_other = Konnte keinen Diskriminator ({1}) f\u00fcr Slice {2} im Profil {3} zuordnen - Keiner der Diskriminatoren {4} hat einen fixed value, eine Binding oder existence assertions +DISCRIMINATOR_BAD_PATH = Fehler bei der Verarbeitung des Pfadausdrucks f\u00fcr den Diskriminator: {0} (src = ''{1}'') +DUPLICATE_ID = Doppelter id-Wert ''{0}'' +DUPLICATE_JSON_PROPERTY_KEY = Die JSON-Eigenschaft ''{0}'' ist ein Duplikat und wird ignoriert +Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited Versionen haben eine genaue \u00dcbereinstimmung f\u00fcr das Trennzeichen ''{0}'' : {1} vs {2} +Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Das abgeleitete Profil {0} besitzt keinen derivation value und kann daher nicht verarbeitet werden. +Derived_profile__has_no_type = Abgeleitetes Profil {0} hat keinen Typ +Details_for__matching_against_Profile_ = Details f\u00fcr {0} Abgleich gegen Profil{1} +Did_not_find_single_slice_ = Keine Slice gefunden: {0} +Did_not_find_type_root_ = \ type root: {0} konnte nicht gefunden werden +Differential_does_not_have_a_slice__b_of_____in_profile_ = Das Differential hat kein Slice: {0}/ (b:{1} von {2} / {3}/ {4}) im Profil {5} +Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential beinhaltet ''{0} (@ {1})'', aber die Base nicht, und ist fixed type gesetzt. Der Typ ist {2}. Dies wird noch nicht unterst\u00fctzt. +Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = Der Diskriminator ({0}) basiert auf der Existenz von Elementen, aber Slice {1} setzt weder min>=1 noch max=0 +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = Der Diskriminator ({1}) basiert auf dem Typ, aber das Slice {2} in {3} hat mehrere Typen: {4} +Discriminator__is_based_on_type_but_slice__in__has_no_types = Der Diskriminator ({0}) basiert auf dem Typ, aber das Slice {1} in {2} hat keine Typen +Display_Name_for__should_be_one_of__instead_of_one = Der Displayname f\u00fcr {1}#{2} sollte einer von ''{3}'' anstelle von ''{4}'' sein. +Display_Name_for__should_be_one_of__instead_of_other = Der Displayname f\u00fcr {1}#{2} sollte einer von ''{3}'' anstelle von ''{4}'' sein. +Does_not_match_slice_ = Stimmt nicht mit Slice ''{0}'' \u00fcberein +Duplicate_Resource_ = Ressource duplizieren {0} +ELEMENT_CANNOT_BE_NULL = Das Element darf nicht ''null'' sein +ERROR_GENERATING_SNAPSHOT = Fehler bei der Erstellung des Snapshot: {0} (dies l\u00e4sst sich in der Regel auf ein Problem im Differenzial zur\u00fcckf\u00fchren) +EXTENSION_EXTM_CONTEXT_WRONG_XVER = Die Modifier-Erweiterung {0} aus FHIR Version {3} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist [{2}; dies ist eine Warnung, da Kontexte zwischen FHIR Versionen umbenannt werden k\u00f6nnen) +EXTENSION_EXTP_CONTEXT_WRONG_XVER = Die Erweiterung {0} aus FHIR Version {3} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist [{2}; dies ist eine Warnung, da Kontexte zwischen FHIR Versionen umbenannt werden k\u00f6nnen) +EXT_VER_URL_IGNORE = Extension-URLs kennen keine Versionen. Der Validator hat die Version ignoriert und die Erweiterung trotzdem verarbeitet +EXT_VER_URL_MISLEADING = Die Extension-URL enth\u00e4lt ein ''|'', das sie wie eine versionierte URL aussehen l\u00e4sst, aber das ist sie nicht, und das ist verwirrend f\u00fcr Implementierer +EXT_VER_URL_NOT_ALLOWED = Die URL der Extension darf keine Version enthalten +EXT_VER_URL_NO_MATCH = Extension-URLs kennen keine Versionen. Der Validator war nicht in der Lage, diese URL mit oder ohne versionsbasierte Aufl\u00f6sung aufzul\u00f6sen +EXT_VER_URL_REVERSION = Die URL der Erweiterung darf keine Version enthalten. Die Erweiterung wurde gegen Version {0} der Erweiterung validiert +Element_must_have_some_content = Element muss einen Inhalt haben +Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Fehler bei {0}#{1}: Das Zielprofil {2} ist keine g\u00fcltiges constrain auf die Basis ({3}) +Error_at_path__Slice_for_type__has_more_than_one_type_ = Fehler bei Pfad {0}: Slice f\u00fcr Typ '{1}' hat mehr als einen Typ '{2}'. +Error_at_path__Slice_for_type__has_wrong_type_ = Fehler bei Pfad {0}: Slice f\u00fcr Typ ''{1}'' hat falschen Typ ''{2}'' +Error_at_path__Slice_name_must_be__but_is_ = Fehler bei Pfad {0}: Slice-Name muss ''{1}'' sein, ist aber ''{2}'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.count() > 1 +Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.path != ''$this'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.type != ''typ'' +Error_at_path__in__Type_slicing_with_slicingordered__true = Fehler bei Pfad {0} in {1}: Typ Slicing mit slicing.ordered = true +Error_expanding_ValueSet_running_without_terminology_services = Fehler bei der Erweiterung von ValueSet: Betrieb ohne Terminologiedienste +Error_generating_table_for_profile__ = Fehler bei der Erstelleung der Tabelle f\u00fcr das Profil {0}: {1} +Error_in_profile__at__Base_isSummary___derived_isSummary__ = Fehler im Profil {0} bei {1}: Basis isSummary = {2}, derived isSummary = {3} +Error_parsing_ = Fehler beim Parsen {0}:{1} +Error_parsing_JSON_ = Fehler beim Parsen von JSON: {0} +Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Fehler beim Parsen von JSON: Der primitive Wert muss ein Boolean sein. +Error_parsing_JSON_the_primitive_value_must_be_a_number = Fehler beim Parsen von JSON: Der primitive Wert muss eine Zahl sein. +Error_parsing_JSON_the_primitive_value_must_be_a_string = Fehler beim Parsen von JSON: Der primitive Wert muss ein String sein. +Error_parsing_Turtle_ = Fehler beim Parsen von Turtle: {0} +Error_parsing_XHTML_ = Fehler beim Parsen von XHTML: {0} +Error_reading__from_package__ = Fehler beim Lesen {0} aus dem Paket {1}#{2}: {3} +Error_validating_code_running_without_terminology_services = !!Fehler beim Validieren des Codes: Ausf\u00fchrung ohne Terminologiedienste +Extension_EXTM_Context_Wrong = Die Modifier Extension {0} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist {2}) +Extension_EXTP_Context_Wrong = Die Extension {0} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist {2}) +Extension_EXT_Count_Mismatch = Abweichungen bei Anzahl der Extensions: erwartet {0}, aber gefunden {1} +Extension_EXT_Count_NotFound = Ungleiche Anzahl von Extensions: Extensions {0} kann nicht gefunden werden +Extension_EXT_Fixed_Banned = Keine Extensions erlaubt, da der angegebene fixed value keine Extension enth\u00e4lt +Extension_EXT_Modifier_MismatchN = Abweichung des Extension modifiers: Die Extension ist nicht als modifier gekennzeichnet, im Gegensatz zur zugrunde liegenden Extension +Extension_EXT_Modifier_MismatchY = Abweichung des Extension modifiers: Die Extension ist als modifier gekennzeichnet, im Gegensatz zur zugrunde liegenden Extension +Extension_EXT_Modifier_N = Die Extension ''{0}'' darf nicht als Extension verwendet werden (es handelt sich um eine ModifierExtension) +Extension_EXT_Modifier_Y = Die Extension ''{0}'' muss als modifierExtension verwendet werden +Extension_EXT_Simple_ABSENT = Die Definition der Extension ''{0}'' entspricht einer einfachen Extension und muss daher einen Wert enthalten +Extension_EXT_Simple_WRONG = Die Definition der Extension ''{0}'' entspricht einer einfachen Extension, sie muss also einen Wert enthalten, keine Extension +Extension_EXT_SubExtension_Invalid = Die Unter-Extension url ''{0}'' ist nicht durch die Extension {1} definiert +Extension_EXT_Type = Die Definition der Extension ''{0}'' erlaubt die Typen {1}, Typ {2} wurde gefunden +Extension_EXT_URL_Absolute = Extension.url muss eine absolute URL sein. +Extension_EXT_Unknown = Unbekannte extension {0} +Extension_EXT_Unknown_NotHere = !!Die extension {0} ist nicht bekannt, and hier nicht erlaubt +Extension_EXT_Url_NotFound = !!Extension.url ist erforderlich +Extension_EXT_Version_Internal = Extension url ''{0}'' Pr\u00fcfung fehlgeschlagen +Extension_EXT_Version_Invalid = Extension url ''{0}'' ist nicht g\u00fcltig (ung\u00fcltige Version ''{1}'') +Extension_EXT_Version_InvalidId = Extension url ''{0}'' ist nicht g\u00fcltig (ung\u00fcltige Element id ''{1}'') +Extension_EXT_Version_NoChange = Die Extension url ''{0}'' ist nicht g\u00fcltig (Element id ''{1}'' ist g\u00fcltig, kann aber nicht in einem versionen\u00fcbergreifenden Paradigma verwendet werden, da es keine \u00c4nderungen in den relevanten Versionen gegeben hat) +Extension_PROF_Type = Die Definition des Profils ''{0}'' l\u00e4sst den Typ {1} zu, aber Typ {2} wurde gefunden +FHIRPATH_CANNOT_USE = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Kann {0} in diesem Kontext nicht verwenden, da {1} +FHIRPATH_CANT_COMPARE = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Werte vom Typ {0} und {1} k\u00f6nnen nicht verglichen werden +FHIRPATH_CHECK_FAILED = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Pr\u00fcfung {0} ist fehlgeschlagen +FHIRPATH_CODED_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf geordneten String, Code, uri, Coding, CodeableConcept angewendet werden, aber gefunden {1} +FHIRPATH_CONTINUOUS_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen Dezimal- oder Datumstyp angewendet werden, gefunden wurde aber {1} +FHIRPATH_DECIMAL_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf eine Dezimalzahl angewandt werden, fand aber {1} +FHIRPATH_DISCRIMINATOR_BAD_NAME = Ung\u00fcltiger Funktionsname {0}() im Diskriminator +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = Ung\u00fcltige Ausdruckssyntax in discriminator (const) +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = Ung\u00fcltige Ausdruckssyntax im Diskriminator (Gruppe ''{0}'') +FHIRPATH_DISCRIMINATOR_CANT_FIND = Diskriminator in Definitionen kann nicht aufgel\u00f6st werden: {0} in Profil {1} auf Element {2}, sucht in Profil {3} +FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Der in den Definitionen gefundene Diskriminator {0} auf {2} kann nicht aufgel\u00f6st werden, da die Erweiterung {1} nicht im Profil {3} gefunden wurde. +FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Fehler im Diskriminator bei {0}: beim Aufl\u00f6sen des festen Werts f\u00fcr eine der Slices wurde ein geslictes Element gefunden +FHIRPATH_DISCRIMINATOR_NOTYPE = Fehler im Diskriminator bei {0}: keine Kinder, kein Typ +FHIRPATH_DISCRIMINATOR_NO_CODE = Ung\u00fcltige Verwendung von ofType() in Diskriminator - Typ verf\u00fcgt \u00fcber keinen Code auf {0} +FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Ung\u00fcltige Verwendung von resolve() in discriminator - Typ auf {0} ist keine Referenz {1} +FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = Ung\u00fcltige Verwendung von resolve() in discriminator - kein Typ f\u00fcr Element {0} +FHIRPATH_DISCRIMINATOR_TYPE_NONE = Unzul\u00e4ssige Verwendung von ofType() im Diskriminator - kein Typ in Element {0} definiert +FHIRPATH_HO_HOST_SERVICES = Interner Fehler beim Auswerten des FHIRPath-Ausdrucks: Es werden keine Host-Services bereitgestellt ({0}) +FHIRPATH_LEFT_VALUE_WRONG_TYPE = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Der linke Operand zu {0} hat den falschen Typ {1} +FHIRPATH_LOCATION = (bei {0}) +FHIRPATH_NOT_IMPLEMENTED = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} ist nicht implementiert +FHIRPATH_NO_COLLECTION = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen Singleton-Wert angewendet werden, fand aber {1} +FHIRPATH_NO_TYPE = !!Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Typ ''{0}'' ist unbekannt oder wird nicht unterst\u00fctzt bei {1} +FHIRPATH_NUMERICAL_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf Integer, Decimal oder Quantity angewendet werden, aber gefunden wurde {1} +FHIRPATH_OP_INCOMPATIBLE = Fehler bei der Auswertung des FHIRPath-Ausdrucks {0}: linker und rechter Operand haben inkompatible oder ung\u00fcltige Typen ({1}, {2}) +FHIRPATH_ORDERED_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf geordnete Sammlungen angewendet werden +FHIRPATH_PARAM_WRONG = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Ausdruckstyp {0} wird f\u00fcr den Parameter {1} der Funktion {2} nicht unterst\u00fctzt +FHIRPATH_REFERENCE_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen geordneten String, uri, canonical oder Reference angewendet werden, wurde aber gefunden {1} +FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Problem bei der Verwendung von resolve() - Profil {0} auf {1} konnte nicht aufgel\u00f6st werden +FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: der rechte Operand zu {0} hat den falschen Typ {1} +FHIRPATH_STRING_ORD_ONLY = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf eine geordnete Sammlung von string, uri, code, id angewendet werden, wurde aber {1} gefunden +FHIRPATH_STRING_SING_ONLY = !!Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf string, uri, code, id angewendet werden, aber gefunden {1} +FHIRPATH_UNABLE_BOOLEAN = Kann nicht als Boolescher Wert ausgewertet werden: {0} +FHIRPATH_UNKNOWN_CONSTANT = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Ung\u00fcltige FHIR-Konstante {0} +FHIRPATH_UNKNOWN_CONTEXT = Unbekannter Kontext beim Auswerten des FHIRPath-Ausdrucks: {0} +FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Unbekanntes Kontextelement bei der Auswertung des FHIRPath-Ausdrucks: {0} +FHIRPATH_UNKNOWN_NAME = Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Der Name ''{0}'' ist f\u00fcr keinen der m\u00f6glichen Typen g\u00fcltig: {1} +FHIRPATH_WRONG_PARAM_TYPE = Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Parametertyp {2} ist nicht zul\u00e4ssig f\u00fcr {0} Parameter {1}. erwartet {3} +Fixed_Type_Checks_DT_Address_Line = Erwartet {0}, aber gefundene {1} line Elemente +Fixed_Type_Checks_DT_Name_Family = Erwartet {0}, aber gefundene {1} family Elemente +Fixed_Type_Checks_DT_Name_Given = Erwartet {0}, aber gefundene {1} given Elemente +Fixed_Type_Checks_DT_Name_Prefix = Erwartet {0}, aber gefundene {1} prefix Elemente +Fixed_Type_Checks_DT_Name_Suffix = Erwartet {0}, aber gefundene {1} suffix Elemente +Found__items_for__resolving_discriminator__from_ = {0} Elemente f\u00fcr {1} gefunden welche mit Diskriminators {2} von {3} \u00fcbereinstimmen +ILLEGAL_COMMENT_TYPE = Die Eigenschaft fhir_comments muss ein Array von Strings sein +INV_FAILED = !!Regel {0} fehlgeschlagen +Illegal_path__in_differential_in__illegal_character_ = Illegaler Pfad ''{0}'' in Differential in {1}: illegales Zeichen ''{2}'' +Illegal_path__in_differential_in__illegal_characters_ = Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: unzul\u00e4ssige Zeichen [] +Illegal_path__in_differential_in__must_start_with_ = !!Illegaler Pfad ''{0}'' in Differential in {1}: muss mit {2}.{3} beginnen +Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: Namensteil \u00fcberschreitet 64 Zeichen L\u00e4nge +Illegal_path__in_differential_in__name_portion_mising_ = Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: Namensteil fehlt (''...'') +Illegal_path__in_differential_in__no_unicode_whitespace = Illegaler Pfad ''{0}'' in Differential in {1}: kein Unicode-Whitespace erlaubt +Internal_INT_Bad_Type = Unbehandelter fixed value type {0} +Internal_error___type_not_known_ = Interner Fehler - Typ nicht bekannt {0} +Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist = Ung\u00fcltiges Slicing: Es gibt mehr als einen Typ Slice bei {0}, aber einer von ihnen ({1}) hat min = 1, so dass die anderen Slices nicht existieren k\u00f6nnen. +JSON_COMMA_EXTRA = Es gibt ein zus\u00e4tzliches Komma am Ende der {0} im JSON +JSON_COMMA_MISSING = Ein Komma fehlt in der JSON-Datei +JSON_COMMENTS_NOT_ALLOWED = Kommentare sind in JSON nicht erlaubt +JSON_PROPERTY_NO_QUOTES = Die JSON-Eigenschaft ''{0}'' hat keine Anf\u00fchrungszeichen um den Namen der Eigenschaft +JSON_PROPERTY_VALUE_NO_QUOTES = Die JSON-Eigenschaft ''{0}'' hat keine Anf\u00fchrungszeichen um den Wert der Eigenschaft ''{1}'' +Language_XHTML_Lang_Different1 = Die Ressource hat eine Sprache ({0}), und das XHTML hat eine Sprache ({1}), aber sie unterscheiden sich +Language_XHTML_Lang_Different2 = Die Ressource hat language ({0}), und das XHTML hat xml:lang ({1}), aber sie unterscheiden sich +Language_XHTML_Lang_Missing1 = Die Ressource hat eine language, aber das XHTML hat kein lang oder ein xml:lang Tag (ben\u00f6tigt beides - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing2 = Die Ressource hat eine language, aber das XHTML hat kein lang-Tag (ben\u00f6tigt sowohl lang als auch xml:lang - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing3 = Die Ressource hat eine language, aber das XHTML hat kein xml:lang-Tag (ben\u00f6tigt sowohl lang als auch xml:lang - siehe https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +MEASURE_MR_GRP_DUPL_CODE = Der Code f\u00fcr diese Gruppe wird in einer anderen Gruppe dupliziert +MEASURE_MR_GRP_MISSING_BY_CODE = Der MeasureReport enth\u00e4lt keine Gruppe f\u00fcr die Gruppe ''{0}'' +MEASURE_MR_GRP_NO_CODE = Die Gruppe sollte einen Code haben, der mit der Gruppendefinition der Measure \u00fcbereinstimmt. +MEASURE_MR_GRP_NO_USABLE_CODE = Keiner der bereitgestellten Codes kann zum Vergleich herangezogen werden - bei mindestens einem Code werden sowohl System als auch Code ben\u00f6tigt +MEASURE_MR_GRP_NO_WRONG_CODE = Der angegebene Code ({0}) stimmt nicht mit dem im Measure-Report angegebenen Code \u00fcberein ({1}) +MEASURE_MR_GRP_POP_COUNT_MISMATCH = Nicht\u00fcbereinstimmung zwischen Z\u00e4hlung {0} und Anzahl der Subjekte {1} +MEASURE_MR_GRP_POP_DUPL_CODE = Der Code f\u00fcr diese Populationsgruppe wird in einer anderen Gruppe dupliziert +MEASURE_MR_GRP_POP_NO_CODE = Die Gruppe sollte einen Code haben, der mit der Definition der Gruppenpopulation der Measure \u00fcbereinstimmt. +MEASURE_MR_GRP_POP_NO_COUNT = Die Anzahl sollte in Reports vorhanden sein, deren Typ nicht ''subject-list'' ist. +MEASURE_MR_GRP_POP_NO_SUBJECTS = Berichte, deren Typ nicht ''subject-list'' ist, sollten keine Subjekte enthalten +MEASURE_MR_GRP_POP_UNK_CODE = Der Code f\u00fcr diese Populationsgruppe hat keine Entsprechung in der Measuredefinition +MEASURE_MR_GRP_UNK_CODE = Der Code f\u00fcr diese Gruppe hat keine Entsprechung in der Measure- Definition +MEASURE_MR_M_SCORING_UNK = Das Scoring-System in dieser Measure ist unbekannt, daher k\u00f6nnen die measureScore-Werte nicht \u00fcberpr\u00fcft werden +MEASURE_MR_SCORE_FIXED = Dieser Wert wird von der Measure auf ''{0}'' festgelegt. +MEASURE_MR_SCORE_PROHIBITED_MS = Kein measureScore, falls die Bewertung der Nachricht ''Kohorte'' lautet +MEASURE_MR_SCORE_PROHIBITED_RT = Kein measureScore, falls der Typ des Berichts ''data-collection'' ist +MEASURE_MR_SCORE_REQUIRED = Ein measureScore ist erforderlich, falls das Measure.scoring={0} +MEASURE_MR_SCORE_UNIT_PROHIBITED = Ein measureScore f\u00fcr dieses Measure Scoring ({0}) sollte keine Einheiten enthalten +MEASURE_MR_SCORE_UNIT_REQUIRED = Eine Einheit sollte vorhanden sein, sofern der Typ der Wertung {0} ist. +MEASURE_MR_SCORE_VALUE_INVALID_01 = Der Wert ist ung\u00fcltig - er muss zwischen 0 und 1 liegen. +MEASURE_MR_SCORE_VALUE_REQUIRED = Ein Wert ist erforderlich, da das Measure.scoring = {0} +MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Fehler in {0}: Kompilierte Version von CQL ist nicht g\u00fcltig +MEASURE_M_CRITERIA_CQL_ERROR = Fehler in {0}: ''{1}'' +MEASURE_M_CRITERIA_CQL_LIB_DUPL = Mehrere passende Bibliotheken f\u00fcr den Namespace {0} gefunden +MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = Keine passende Bibliothek f\u00fcr den Namespace {0} gefunden +MEASURE_M_CRITERIA_CQL_NOT_FOUND = Die Funktion {1} existiert nicht in der Bibliothek {0} +MEASURE_M_CRITERIA_CQL_NO_ELM = Fehler in {0}: Keine kompilierte Version von CQL gefunden +MEASURE_M_CRITERIA_CQL_NO_LIB = Keine CQL-Bibliotheken f\u00fcr diese Measure gefunden +MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = Falls der CQL-Ausdruck keinen Namespace enth\u00e4lt, darf es nur eine Library f\u00fcr die Measure geben +MEASURE_M_CRITERIA_UNKNOWN = Die Ausdruckssprache {0} wird nicht unterst\u00fctzt und kann daher nicht validiert werden. +MEASURE_M_GROUP_CODE = Gruppen sollten Codes aufweisen, sofern es mehr als eine Gruppe gibt +MEASURE_M_GROUP_POP = Measure-Gruppen sollten mindestens eine Population enthalten +MEASURE_M_GROUP_POP_NO_CODE = Eine Measure-Gruppen Population sollte einen Code haben, wenn es mehr als eine Population gibt +MEASURE_M_GROUP_STRATA_COMP_NO_CODE = Eine Measure-Group-Komponente sollte einen Code haben, sofern es mehr als eine Population gibt +MEASURE_M_GROUP_STRATA_NO_CODE = Ein Measure-Group-Stratifier sollte einen Code haben, falls es mehr als eine Population gibt +MEASURE_M_LIB_UNKNOWN = Die Library {0} konnte nicht aufgel\u00f6st werden, so dass die Expression-Validierung m\u00f6glicherweise nicht korrekt ist +MEASURE_M_NO_GROUPS = Eine Measure sollte mindestens eine Gruppe enthalten +MEASURE_SHAREABLE_EXTRA_MISSING = !!Das ShareableMeasure-Profil empfiehlt, dass das Element {0} ausgef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Ma\u00dfnahmen SOLLTEN mit dem ShareableMeasure-Profil \u00fcbereinstimmen +MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = !!!!Das ShareableMeasure-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Measures M\u00dcSSEN dem ShareableMeasure-Profil entsprechen +MEASURE_SHAREABLE_MISSING = !!Das ShareableMeasure-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Ma\u00dfnahmen SOLLTEN mit dem ShareableMeasure-Profil \u00fcbereinstimmen +MEASURE_SHAREABLE_MISSING_HL7 = !!!!Das ShareableMeasure-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Measures M\u00dcSSEN dem ShareableMeasure-Profil entsprechen +Measure_MR_M_None = Es wird keine ''Measure'' identifiziert, daher kann keine Validierung anhand der ''Measure'' durchgef\u00fchrt werden. +Measure_MR_M_NotFound = Die Measure ''{0}'' konnte nicht aufgel\u00f6st werden, daher kann keine Validierung anhand der Measure durchgef\u00fchrt werden +Meta_RES_Security_Duplicate = Dupliziertes Security Label {0} +MustSupport_VAL_MustSupport = Das Element {0} ist im Profil {1} nicht als ''mustSupport'' gekennzeichnet. Erw\u00e4gen Sie, das Element nicht zu verwenden oder das Element als ''must-Support'' im Profil zu markieren. +NO_VALID_DISPLAY_FOUND_one = Keine g\u00fcltigen Display Names f\u00fcr {1}#{2} in der Sprache {3} gefunden +NO_VALID_DISPLAY_FOUND_other = Keine g\u00fcltigen Display Names f\u00fcr {1}#{2} in den Sprachen {3} gefunden +Named_items_are_out_of_order_in_the_slice = Named items sind in der Slice im falscher Reihenfolge +No_ExpansionProfile_provided = Kein Expansionsprofil verf\u00fcgbar +No_Expansion_Parameters_provided = Keine Expansion-Parameter angegeben +No_Parameters_provided_to_expandVS = Keine Parameter f\u00fcr expandVS angegeben +No_path_on_element_Definition__in_ = Kein Pfad auf Element Definition {0} in {1} +No_path_on_element_in_differential_in_ = Kein Pfad auf Element in Differential in {0} +No_path_value_on_element_in_differential_in_ = Kein Pfadwert auf Element in Differential in {0} +No_processing_instructions_allowed_in_resources = Keine Verarbeitungsanweisungen in Ressourcen erlaubt +No_reference_resolving_discriminator__from_ = Kein Aufl\u00f6sen der Referenz m\u00f6glich, Diskriminator {0} von {1} +No_type_found_on_ = Kein Typ gefunden bei ''{0}'' +No_validator_configured = Kein Validator konfiguriert +Node_type__is_not_allowed = Nodetyp {0} ist nicht erlaubt +None_of_the_provided_codes_are_in_the_value_set_one = Der angegebene Code {2} befindet sich nicht im ValueSet ''{1}'' +None_of_the_provided_codes_are_in_the_value_set_other = Keiner der angegebenen Codes [{2}] befindet sich im ValueSet ''{1}'' +Not_done_yet = Noch nicht unterst\u00fctzt +Not_done_yet_ValidatorHostServicescheckFunction = Noch nicht unterst\u00fctzt (ValidatorHostServices.checkFunction) +Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = Not done yet (ValidatorHostServices.conformsToProfile), wenn das Element kein Element ist +Not_done_yet_ValidatorHostServicesexecuteFunction = Noch nicht unterst\u00fctzt (ValidatorHostServices.executeFunction) +Not_done_yet__resolve__locally_2 = Noch nicht unterst\u00fctzt - find {0} lokal (2) +Not_handled_yet_sortElements_ = Noch nicht unterst\u00fctzt (sortElemente: {0}:{1}) +OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = Dieses Objekt kann in Json kein Array mit Schl\u00fcssel sein, da es in den Definitionen keine zwei Kinder hat (Kinder = {0}). +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = Dieses Objekt ist als Array mit Schl\u00fcssel in Json definiert, aber die in den Definitionen genannte Werteigenschaft ist eine Auswahl - dies wird nicht unterst\u00fctzt (value property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = Dieses Objekt ist in Json als Array mit Schl\u00fcssel definiert, aber die in den Definitionen genannte Werteigenschaft ist eine Liste - dies wird nicht unterst\u00fctzt (value property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = Dieses Objekt ist als Array mit Schl\u00fcssel in Json definiert, aber die Definition nennt nicht das erste Kindelement als Schl\u00fcssel (children = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = Dieses Objekt ist in Json als Array mit Schl\u00fcssel definiert, aber die in den Definitionen genannte Schl\u00fcsseleigenschaft entspricht nicht einem primitiven Typ (children = {0}, type = {1}) +Object_must_have_some_content = Objekt muss einen Inhalt haben +PACKAGE_VERSION_MISMATCH = FHIR Version mismatch in Paket {0}: Version ist {2}, muss aber {1} sein (Pfad: {3}) +PATTERN_CHECK_STRING = Das im Profil {1} definierte Pattern [{0}] wurde nicht gefunden. Probleme: {2} +Parser_Type__not_supported = Parser-Typ {0} nicht unterst\u00fctzt +Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Problem bei der Auswertung des Slicing-Ausdrucks f\u00fcr Element im Profil {0} Pfad {1} (fhirPfad = {2}): {3} +Problem_processing_expression__in_profile__path__ = Problem bei der Verarbeitung der Expression {0} im Profil {1} Pfad {2}: {3} +Profile_EXT_Not_Here = Die Extension {0} darf an dieser Stelle nicht verwendet werden (basierend auf der Kontextinvariante ''{1}'') +Profile_VAL_MissingElement = Fehlendes Element ''{0}'' - erforderlich durch den im Profil zugewiesenen festen Wert {1} +Profile_VAL_NotAllowed = Das Element {0} ist in der Instanz vorhanden, aber im zutreffenden {1}, das im Profil angegeben ist, nicht erlaubt. +Profile___Error_generating_snapshot = Profil {0} ({1}). Fehler bei der Erstellung des Snapshots +Profile___base__could_not_be_resolved = Profil {0} ({1}) base {2} konnte nicht aufgel\u00f6st werden +Profile___element__Error_generating_snapshot_ = Profil {0} ({1}). Fehler bei der Erstellung des Snapshots +Profile___has_no_base_and_no_snapshot = Profil {0} ({1}) hat keine base und keinen SnapShot +Profile__does_not_match_for__because_of_the_following_profile_issues__ = Das Profil {0} passt nicht zu {1} wegen der folgenden Profilprobleme: {2} +Profile_based_discriminators_must_have_a_type__in_profile_ = Profilbasierte Diskriminatoren m\u00fcssen einen Typ ({0} im Profil {1}) haben. +Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Profilbasierte Diskriminatoren m\u00fcssen einen Typ mit einem Profil ({0} im Profil {1}) haben. +Profile_based_discriminators_must_have_only_one_type__in_profile_other = Profilbasierte Diskriminatoren d\u00fcrfen nur einen Typ ({1} im Profil {2}) haben. +QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = !!Der angegebene Code {1} kann im ValueSet der Optionen ({2}) im Fragebogen nicht validiert werden, da das System {0} unbekannt ist +Questionnaire_QR_Item_BadOption = !!Der angegebene Wert ({0}::{1}) ist nicht in den im Fragebogen gesetzten options value set enthalten. +Questionnaire_QR_Item_Coding = Fehler {0} bei der Validierung des Coding gegen Questionnaire Options +Questionnaire_QR_Item_CodingNoOptions = Coding option kann nicht validiert werden, da keine option list bereitgestellt wird +Questionnaire_QR_Item_DateNoOptions = Date answer option kann nicht validiert werden, weil keine option list zur Verf\u00fcgung steht +Questionnaire_QR_Item_Display = Elemente, die nicht vom Typ DISPLAY sind, sollten keine Elemente enhtalten - linkId {0} +Questionnaire_QR_Item_Group = Elemente der Typgruppe sollten keine Antworten beinhalten +Questionnaire_QR_Item_GroupAnswer = Items, die nicht vom Typ Gruppe sind, sollten keine Items au\u00dferhalb der Antworten haben (verwenden Sie answer.item nicht .item) +Questionnaire_QR_Item_IntNoOptions = Kann die ganzzahlige Antwortoption nicht validieren, da keine option list bereitgestellt wird +Questionnaire_QR_Item_Missing = Keine Antwort f\u00fcr das erforderliche Element gefunden {0} +Questionnaire_QR_Item_NoCoding = Der Code {0}::{1} ist keine g\u00fcltige Option. +Questionnaire_QR_Item_NoDate = Das Datum {0} ist keine g\u00fcltige Option. +Questionnaire_QR_Item_NoInteger = Integer {0} ist keine g\u00fcltige Option +Questionnaire_QR_Item_NoLinkId = Keine LinkId, kann also nicht validiert werden +Questionnaire_QR_Item_NoOptions = Optionen k\u00f6nnen nicht validiert werden, weil keine Option oder Optionen angeboten werden +Questionnaire_QR_Item_NoOptionsCoding = Optionsliste hat keine Optionswerte vom Typ Coding +Questionnaire_QR_Item_NoOptionsDate = Optionsliste hat keine Optionswerte vom Typ date +Questionnaire_QR_Item_NoOptionsInteger = Optionsliste hat keine Optionswerte vom Typ Integer +Questionnaire_QR_Item_NoOptionsString = Optionsliste hat keine Optionswerte vom Typ String +Questionnaire_QR_Item_NoOptionsTime = Optionsliste hat keine Optionswerte vom Typ time +Questionnaire_QR_Item_NoString = Der String {0} ist keine g\u00fcltige Option +Questionnaire_QR_Item_NoTime = time {0} ist keine g\u00fcltige Option +Questionnaire_QR_Item_NoType = Definition f\u00fcr Element {0} enth\u00e4lt keinen Typ +Questionnaire_QR_Item_NotEnabled = Item hat Antwort (2), auch wenn es nicht aktiviert ist {0} +Questionnaire_QR_Item_NotEnabled2 = Item besitzt eine answer, auch wenn es nicht aktiviert ist (Element-ID = ''{0}'') +Questionnaire_QR_Item_NotFound = LinkId ''{0}'' im questionnaire nicht gefunden +Questionnaire_QR_Item_OnlyOneA = Nur ein Antwortelement mit dieser LinkId zul\u00e4ssig +Questionnaire_QR_Item_OnlyOneI_other = Nur ein Antwortelement mit dieser LinkId erlaubt - {1} +Questionnaire_QR_Item_Order = Struktureller Fehler: Elemente in falscher Reihenfolge +Questionnaire_QR_Item_StringNoOptions = String answer option kann nicht validiert werden, da keine Optionsliste bereitgestellt wird +Questionnaire_QR_Item_Text = Wenn Text vorhanden ist, muss er mit der Fragebogen-Definition f\u00fcr linkId {0} \u00fcbereinstimmen. +Questionnaire_QR_Item_TimeNoOptions = Kann die time answer option nicht validieren, weil keine Optionsliste zur Verf\u00fcgung steht +Questionnaire_QR_Item_WrongType_one = Answer value muss vom Typ {0} sein. +Questionnaire_QR_Item_WrongType_other = Answer value muss einer der Typen {1} sein +Questionnaire_QR_Q_None = Es konnte kein passendes questionnaire identifiziert werden, so dass keine Validierung gegen den Basisfragebogen durchgef\u00fchrt werden kann. +Questionnaire_QR_Q_NotFound = Der Fragebogen ''{0}'' konnte nicht gefunden werden, so dass keine Validierung gegen den Basisfragebogen durchgef\u00fchrt werden kann. +Questionnaire_Q_EnableWhen_After = Das Ziel dieser enableWhen-Regel ({0}) kommt nach der Frage selbst +Questionnaire_Q_EnableWhen_IsInner = Fragen mit einem enableWhen k\u00f6nnen sich nicht auf eine innere Frage f\u00fcr ihren aktivierten enableWhen beziehen +Questionnaire_Q_EnableWhen_NoLink = Fragen mit einem enableWhen m\u00fcssen einen Wert f\u00fcr den question link enthalten +Questionnaire_Q_EnableWhen_NoTarget = Ziel ''{0}'' f\u00fcr das enableWhen diese Frage konnte nicht gefunden werden +Questionnaire_Q_EnableWhen_Self = Ziel des enableWhen dieser Frage kann sich nicht selbst referenzieren +REFERENCE_REF_QUERY_INVALID = Der Abfrageteil der bedingten Referenz ist kein g\u00fcltiger Abfrage-String ({0}) +REFERENCE_REF_SUSPICIOUS = Die Syntax der Reference ''{0}'' sieht falsch aus und sollte \u00fcberpr\u00fcft werden +REFERENCE_REF_WRONGTARGET_LOAD = Der Typ ''{2}'' ist kein g\u00fcltiges Ziel f\u00fcr das Element {0} (muss {1} sein) +RESOURCETYPE_PROPERTY_WRONG_TYPE = Das JSON-Element ''resourceType'' hat den falschen JSON-Typ: {0} +Reference_REF_Aggregation = Die Reference ist {0}, welche von dem angegebenen Aggregationsmodus f\u00fcr die Referenz nicht unterst\u00fctzt wird. +Reference_REF_BadTargetType = Ung\u00fcltiger Ressourcen-Zieltyp. Gefunden {0}, aber einen von ({1}) erwartet +Reference_REF_BadTargetType2 = Der Typ ''{0}'', der durch die Referenz-URL {1} impliziert wird, ist kein g\u00fcltiges Ziel f\u00fcr dieses Element (muss eines von {2} sein) +Reference_REF_CantMatchChoice = Es konnte kein passendes Profil f\u00fcr {0} unter den Auswahlm\u00f6glichkeiten [{1}] gefunden werden +Reference_REF_CantMatchType = Es konnte kein passendes Profil f\u00fcr {0} (nach Typ) unter den Auswahlm\u00f6glichkeiten [{1}] gefunden werden +Reference_REF_CantResolve = Ressource ''{0}'' nicht auffindbar +Reference_REF_CantResolveProfile = Der Profilbezug ''{0}'' konnte nicht aufgel\u00f6st werden. +Reference_REF_Format1 = Relative URLs m\u00fcssen das Format [ResourceName]/[id] haben, oder eine Such-ULR ist erlaubt ([type]?parameters. Gefunden {0}) +Reference_REF_Format2 = Relative URLs m\u00fcssen das Format [ResourceName]/[id] haben. Gefunden {0} +Reference_REF_MultipleMatches = Es wurden mehrere \u00fcbereinstimmende Profile f\u00fcr {0} unter den Auswahlm\u00f6glichkeiten gefunden: {1} +Reference_REF_NoDisplay = Eine Referenz ohne eine tats\u00e4chliche Referenz oder einen Identifikator sollte eine Displaywert haben +Reference_REF_NoType = Kann den Typ der Zielressource nicht bestimmen +Reference_REF_NotFound_Bundle = Bundled oder contained Referenz, welche nicht im Bundle/Ressource gefunden wurde {0} +Reference_REF_ResourceType = Passende Referenz f\u00fcr Referenz {0} hat resourceType {1} +Reference_REF_WrongTarget = Der Typ ''{0}'' ist kein g\u00fcltiges Ziel f\u00fcr dieses Element (muss einer von {1} sein) +Reference__refers_to_a__not_a_ValueSet = Die Referenz {0} referenziert auf {1}, nicht auf ein ValueSet +Resource_RES_ID_Malformed_Chars = Ung\u00fcltige Ressourcen-ID: Ung\u00fcltige Zeichen (''{0}'') +Resource_RES_ID_Malformed_Length = Ung\u00fcltige Ressourcen-ID: Zu lang ({0} Zeichen) +Resource_RES_ID_Missing = Die Ressource erfordert eine ID, aber es ist keine vorhanden +Resource_RES_ID_Prohibited = Die Ressource hat eine ID, aber keine ist erlaubt +Resource_resolution_services_not_provided = Dienste zur Ressourcenaufl\u00f6sung werden nicht verf\u00fcgbar +Resource_type_mismatch_for___ = Ressourcentyp-Abweichung f\u00fcr {0} / {1} +SD_CONSTRAINED_KIND_NO_MATCH = Die Art {0} muss dieselbe sein wie die Art {1} in der Basisstruktur {3} (Basistyp = {2}) +SD_CONSTRAINED_TYPE_NO_MATCH = Der Typ {0} muss derselbe sein wie der Typ in der Basisstruktur {1}, die eingeschr\u00e4nkt wird +SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = !!\u00dcberpr\u00fcfen Sie den Erweiterungstyp: Extensions sollten nicht den Kontext {0} haben, es sei denn, es ist wirklich beabsichtigt, dass sie \u00fcberall verwendet werden k\u00f6nnen. +SD_DERIVATION_KIND_MISMATCH = Die StructureDefinition schr\u00e4nkt eine Art von {0} ein, hat aber eine andere Art ({1}) +SD_ED_BIND_MULTIPLE_TYPES = Das Element {0} hat eine Bindung und hat mehrere Typen, die Bindungen unterliegen ({1}). Die Bindung gilt f\u00fcr alle Typen +SD_ED_BIND_NOT_VS = Die ValueSet-Referenz {1} auf Element {0} zeigt auf etwas, das kein ValueSet ist ({2}) +SD_ED_BIND_NO_BINDABLE = Das Element {0} hat eine Bindung, aber es sind keine bindungsf\u00e4higen Typen vorhanden {1} +SD_ED_BIND_UNKNOWN_VS = Die valueSet-Referenz {1} auf Element {0} konnte nicht aufgel\u00f6st werden +SD_ED_SHOULD_BIND = Das Element {0} hat einen Typ, der eine Bindung haben sollte ({1}), aber es ist keine Bindung vorhanden +SD_ED_SHOULD_BIND_WITH_VS = Das Element {0} hat einen Typ, der eine Bindung haben sollte ({1}), aber die Bindung hat keinen Wert gesetzt +SD_ED_TYPE_NO_TARGET_PROFILE = Typ {0} erlaubt keine Zielprofile +SD_ED_TYPE_PROFILE_IS_MODIFIER = Profil {0} ist nicht f\u00fcr eine Modifier-Extension gedacht, aber das Element {3} ist ein Modifier +SD_ED_TYPE_PROFILE_NOTYPE = Profil {0} gefunden, aber nicht in der Lage, den Typ zu bestimmen, f\u00fcr den es gilt +SD_ED_TYPE_PROFILE_NOT_MODIFIER = Profil {0} ist f\u00fcr eine Modifier-Extension, aber das Element {3} ist kein Modifier +SD_ED_TYPE_PROFILE_UNKNOWN = !!!!!!!!!!!!!!!!Profil {0} kann nicht aufgel\u00f6st werden +SD_ED_TYPE_PROFILE_WRONG = Profil {0} ist f\u00fcr Typ {1}, aber das Element {3} hat Typ {2} +SD_ED_TYPE_PROFILE_WRONG_TARGET = Profil {0} ist f\u00fcr den Typ {1}, der kein {4} ist (was erforderlich ist, weil das Element {3} den Typ {2} hat) +SD_ILLEGAL_CHARACTERISTICS = Dieses Element hat ein {0}, aber die Typen {1} machen diese Art von Einschr\u00e4nkung nicht relevant +SD_MUST_HAVE_DERIVATION = StructureDefinition {0} muss eine Ableitung haben, da sie eine baseDefinition hat +SD_NESTED_MUST_SUPPORT_DIFF = Das Element {0} hat Typen/Profile/Ziele, die als must-support markiert sind, aber das Element selbst ist nicht als must-support markiert. Die inneren must-supports werden ignoriert, es sei denn, das Element erbt must-support = true +SD_NESTED_MUST_SUPPORT_SNAPSHOT = Das Element {0} hat Typen/Profile/Ziele, die als "must support" gekennzeichnet sind, aber das Element selbst ist nicht als "must support" gekennzeichnet +SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = Der Typ ist {0}, so dass keine Erweiterungskontextinvarianten angegeben werden sollten. +SD_NO_CONTEXT_WHEN_NOT_EXTENSION = Der Typ ist {0}, so dass ein Erweiterungskontext nicht angegeben werden sollte +SD_NO_SLICING_ON_ROOT = Slicing ist an der Wurzel eines Profils nicht erlaubt +SD_NO_TYPES_OR_CONTENTREF = Das Element {0} hat keine zugewiesenen Typen und keine Inhaltsreferenz +SD_NO_TYPE_CODE_ON_CODE = Snapshot f\u00fcr {1} Element {0} enth\u00e4lt type.code ohne Wert +SD_PATH_TYPE_MISMATCH = Der Pfad {1} muss mit dem Typ der Struktur {0} beginnen +SD_SPECIALIZED_TYPE_MATCHES = Der Typ {0} darf nicht derselbe sein wie der Typ in der Basisstruktur {1}, die spezialisiert wird +SD_TYPE_MISSING = Kein Typ gefunden +SD_TYPE_NOT_DERIVED = Der Typ {0} kann nur als Typ verwendet werden, falls die Basisdefinition des Typs eingeschr\u00e4nkt wird +SD_TYPE_NOT_LOCAL = Der Typ {0} ist nicht zul\u00e4ssig, da er nicht in der FHIR-Spezifikation definiert ist. Andere Typen m\u00fcssen mit einem Namespace versehen sein +SD_TYPE_NOT_LOGICAL = !!Der Typ {0} kann nur definiert werden, wenn die Art 'logisch' ist, nicht {1} +SD_TYPE_NOT_MATCH_NS = Der Typ-Namensraum {0} SOLLTE mit dem Url-Namensraum {1} f\u00fcr die Definition des Typs \u00fcbereinstimmen +SD_VALUE_COMPLEX_FIXED = F\u00fcr den komplexen Typ {0} sollte eher ein Pattern als ein fester Wert verwendet werden, um die Instanz nicht zu sehr einzuschr\u00e4nken +SD_VALUE_TYPE_IILEGAL = Das Element {0} hat ein {1} vom Typ {2}, das nicht in der Liste der erlaubten Typen ({3}) enthalten ist +SD_VALUE_TYPE_REPEAT_HINT = Das sich wiederholende Element hat ein {1}. Die {1} gilt f\u00fcr alle Wiederholungen (dies war nicht allen Benutzern klar) +SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = Das sich wiederholende Element hat einen {1} Wert f\u00fcr einen primitiven Typ. Der DotNet Validator wird dies nicht auf alle Wiederholungen anwenden - dies ist ein Fehler +SEARCHPARAMETER_BASE_WRONG = Der Ressourcentyp {1} ist im SearchParameter, von dem er abgeleitet ist, nicht als Basis aufgef\u00fchrt ({0}) +SEARCHPARAMETER_EXP_WRONG = Der Ausdruck ''{2}'' ist nicht kompatibel mit dem Ausdruck ''{1}'' im derivedFrom SearchParameter {0}, was wahrscheinlich bedeutet, dass die Ableitungsbeziehung nicht g\u00fcltig ist +SEARCHPARAMETER_NOTFOUND = Der Basis-Suchparameter {0} kann nicht gefunden werden, so dass nicht \u00fcberpr\u00fcft werden kann, ob dieser Suchparameter eine korrekte Ableitung davon ist. +SEARCHPARAMETER_TYPE_WRONG = Der Typ {1} unterscheidet sich vom Typ {0} des abgeleiteten Parameters SearchParameter +SECURITY_STRING_CONTENT_ERROR = Der String-Wert enth\u00e4lt Text, der wie eingebettete HTML-Tags aussieht, die in diesem Zusammenhang aus Sicherheitsgr\u00fcnden nicht zul\u00e4ssig sind +SECURITY_STRING_CONTENT_WARNING = Der String-Wert enth\u00e4lt Text, der wie eingebettete HTML-Tags aussieht. Wenn dieser Inhalt ohne entsprechende Nachbearbeitung in HTML gerendert wird, kann er ein Sicherheitsrisiko darstellen +SLICING_CANNOT_BE_EVALUATED = Slicing kann nicht ausgewertet werden: {0} +SM_DEPENDENT_PARAM_MODE_MISMATCH = Der Parameter {0} bezieht sich auf die Variable {1}, aber ihr Modus ist {2}, was nicht mit dem f\u00fcr die Gruppe {3} erforderlichen Modus \u00fcbereinstimmt. +SM_DEPENDENT_PARAM_TYPE_MISMATCH = Der Parameter ''{0}'' bezieht sich auf die Variable ''{1}'', aber ihr Typ ist ''{2}'', was nicht mit dem f\u00fcr die Gruppe ''{3}'' erforderlichen Typ ''{4}'' (aus Map ''{5}'') vereinbar ist +SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = Die Gruppe {0} wurde bereits mit anderen Parametern verwendet, so dass die Typpr\u00fcfung falsch sein kann (other = [{1}]; this = [{2}]) +SM_GROUP_INPUT_DUPLICATE = Der Name {0} wird bereits verwendet +SM_GROUP_INPUT_MODE_INVALID = Der Gruppenparameter {0} Modus {1} ist nicht g\u00fcltig +SM_GROUP_INPUT_MODE_MISMATCH = !!Der Typ {0} hat den Modus {1}, der nicht mit der Strukturdefinition {2} \u00fcbereinstimmt. +SM_GROUP_INPUT_NO_TYPE = !!Der Gruppenparameter {0} hat keinen Typ, daher k\u00f6nnen die Pfade nicht validiert werden +SM_GROUP_INPUT_TYPE_NOT_DECLARED = Der Typ {0} ist nicht deklariert und ist unbekannt +SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = Der Typ {0}, der der Canonical URL {1} entspricht, ist nicht bekannt, so dass die Pfade nicht validiert werden k\u00f6nnen +SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = Der Typ {0} ist nicht bekannt, daher k\u00f6nnen die Pfade nicht validiert werden +SM_GROUP_NAME_DUPLICATE = Der Gruppenname ''{0}'' wird bereits verwendet +SM_IMPORT_NOT_FOUND = Es wurden keine Maps gefunden, die mit {0} \u00fcbereinstimmen - die Validierung k\u00f6nnte falsch sein +SM_LIST_RULE_ID_ONLY_WHEN_SHARE = Eine ruleId sollte nur angegeben werden, wenn der Regel-Modus ''share'' ist. +SM_MATCHING_RULEGROUP_NOT_FOUND = Es konnte keine Standardregel f\u00fcr das Typenpaar source={0} und target={1} gefunden werden. +SM_NAME_INVALID = Der Name {0} ist ung\u00fcltig +SM_NO_LIST_MODE_NEEDED = Ein List-Modus sollte nicht angegeben werden, da es sich um eine Regel handelt, die nur einmal ausgef\u00fchrt werden kann +SM_NO_LIST_RULE_ID_NEEDED = Eine Liste ruleId sollte nicht angegeben werden, da es sich um eine Regel handelt, die nur einmal ausgef\u00fchrt werden kann +SM_ORPHAN_GROUP = !!Die Gruppe {0} wird nicht von diesem Mapping-Skript aus aufgerufen und hat keine Typen f\u00fcr ihre Inputs definiert, so dass eine Typenpr\u00fcfung nicht m\u00f6glich ist +SM_RULEGROUP_NOT_FOUND = Die Gruppe {0} konnte nicht aufgel\u00f6st werden +SM_RULEGROUP_PARAM_COUNT_MISMATCH = Die Gruppe {0} wird mit {1} Parametern aufgerufen, ben\u00f6tigt aber stattdessen {2} +SM_RULE_SOURCE_MAX_REDUNDANT = Der Maximalwert von {0} ist \u00fcberfl\u00fcssig, da der g\u00fcltige Maximalwert {0} ist. +SM_RULE_SOURCE_MIN_REDUNDANT = Der Mindestwert von {0} ist \u00fcberfl\u00fcssig, da der g\u00fcltige Mindestwert {0} ist. +SM_RULE_SOURCE_UNASSIGNED = Die Source-Anweisung weist der Source keine Variable zu - \u00fcberpr\u00fcfen Sie, ob dies beabsichtigt ist +SM_SOURCE_CONTEXT_UNKNOWN = Der Quellkontext {0} ist zu diesem Zeitpunkt nicht bekannt +SM_SOURCE_PATH_INVALID = Der Quellpfad {0}.{1} bezieht sich auf den Pfad {2}, der unbekannt ist +SM_SOURCE_TYPE_INVALID = Der Typ {0} ist im Quellkontext {1} nicht g\u00fcltig. Die m\u00f6glichen Typen sind [{2}] +SM_SOURCE_TYPE_NOT_FOUND = Es wurde kein Quelltyp gefunden, so dass die Standardgruppe f\u00fcr diese implizit abh\u00e4ngige Regel nicht ermittelt werden konnte. +SM_TARGET_CONTEXT_UNKNOWN = Der Zielkontext ''{0}'' ist zu diesem Zeitpunkt nicht bekannt +SM_TARGET_NO_TRANSFORM_NO_CHECKED = Wenn es keine Transformation gibt, k\u00f6nnen keine Parameter angegeben werden. +SM_TARGET_PATH_INVALID = Der Zielpfad {0}.{1} bezieht sich auf den Pfad {2}, der unbekannt ist +SM_TARGET_PATH_MULTIPLE_MATCHES = Der Zielpfad {0}.{1} verweist auf den Pfad {2}, der ein Verweis auf mehrere Elemente ({3}) sein k\u00f6nnte. Es kann keine weitere Pr\u00fcfung durchgef\u00fchrt werden +SM_TARGET_TRANSFORM_EXPRESSION_ERROR = Der als Evaluierungsparameter \u00fcbergebene FHIRPath-Ausdruck ist ung\u00fcltig: {0} +SM_TARGET_TRANSFORM_MISSING_PARAMS = Ein oder mehrere Parameter f\u00fcr den \u00dcbersetzungsvorgang fehlen (sollte 3 sein, war {0}) +SM_TARGET_TRANSFORM_NOT_CHECKED = Transformation {0} noch nicht \u00fcberpr\u00fcft +SM_TARGET_TRANSFORM_OP_INVALID_TYPE = Die Variable {1} {0} vom Typ {2} ist ung\u00fcltig - muss ein Primitive sein +SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = Die {1} Variable {2} ist f\u00fcr die Transformation {0} unbekannt +SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = Transformation {0} ben\u00f6tigt {1}-{2} Parameter, aber {3} wurden gefunden +SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = Transformation {0} ben\u00f6tigt {1} Parameter, aber {2} wurden gefunden +SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = Der Parameter bei Index {0} konnte nicht verarbeitet werden (Typ = {1}) +SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = Der Wert ''{0}'' des Ausgabeparameters ist falsch +SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = Die map_uri ''{0}'' konnte nicht aufgel\u00f6st werden, daher kann die Map nicht gepr\u00fcft werden +SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = Kein Wert f\u00fcr den Parameter {0} gefunden +SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = Die Quellvariable {0} ist unbekannt +SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = Der Wert des Typparameters f\u00fcr {0} konnte nicht verarbeitet werden +SM_TARGET_TRANSLATE_BINDING_SOURCE = Die Quellvariable hat kein required binding, daher kann diese Concept Map nicht \u00fcberpr\u00fcft werden +SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = Der Quell-ValueSet enth\u00e4lt einen oder mehrere Codes, die von der Map nicht \u00fcbersetzt werden: {0} +SM_TARGET_TRANSLATE_BINDING_TARGET = Die Zielvariable hat kein required binding, daher kann diese Concept Map nicht gepr\u00fcft werden +SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = Die Map erzeugt einen oder mehrere Codes, die in der Ziel-Wertemenge nicht enthalten sind: {0} +SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = Es gab einen Fehler beim Erweitern des ValueSets der Quelle, so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann: ''{0}'' +SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = Es gab einen Fehler bei der Expansion des ValueSets, so dass diese Concept Map nicht gepr\u00fcft werden kann: ''{0}'' +SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = Die Quellvariable verweist auf ein unbekanntes ValueSet ''{0}'', so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann +SM_TARGET_TRANSLATE_BINDING_VS_TARGET = Die Zielvariable verweist auf ein unbekanntes ValueSet ''{0}'', so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann +SM_TARGET_TYPE_MULTIPLE_POSSIBLE = Hier sind mehrere Typen m\u00f6glich ({0}), so dass eine weitere Typenpr\u00fcfung nicht m\u00f6glich ist +SM_TARGET_TYPE_NOT_FOUND = Es wurde kein Zieltyp gefunden, so dass die Standardgruppe f\u00fcr diese implizit abh\u00e4ngige Regel nicht bestimmt werden konnte +SNAPSHOT_EXISTING_PROBLEM = Der erzeugte Snapshot hat eine andere Anzahl von Elementen {1} als der urspr\u00fcnglich bereitgestellte Snapshot {0} +Same_id_on_multiple_elements__in_ = Gleiche Id ''{0}'' bei mehreren Elementen {1}/{2} in {3} +Slice_encountered_midway_through_set_path___id___ = Slice, der in der Mitte des Set gefunden wurde (Pfad = {0}, id = {1}); {2} +Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicing-Regeln auf Differential ({0}) stimmen nicht mit denen auf Basis ({1}) \u00fcberein - Diskriminator @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicing-Regeln f\u00fcr Differential ({0}) stimmen nicht mit denen der Basis ({1}) \u00fcberein - Reihenfolge @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicing-Regeln auf Differential ({0}) stimmen nicht mit denen auf Basis ({1}) \u00fcberein - Regel @ {2} ({3}) +StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} bei {1}: unzul\u00e4ssiger eingeschr\u00e4nkter Typ {2} von {3} bis {4} +TERMINOLOGY_TX_NOSVC_BOUND_EXT = Es konnte nicht best\u00e4tigt werden, dass die angegebenen Codes aus dem extensible ValueSet {0} stammen, da es keinen Terminologiedienst gibt +TERMINOLOGY_TX_NOSVC_BOUND_REQ = Es konnte nicht best\u00e4tigt werden, dass die angegebenen Codes aus dem required ValueSet {0} stammen, da es keinen Terminologiedienst gibt +TERMINOLOGY_TX_SYSTEM_HTTPS = Die System-URL ''{0}'' beginnt f\u00e4lschlicherweise mit https: und nicht mit http: +TERMINOLOGY_TX_SYSTEM_NO_CODE = !!Ein Code ohne System hat keine definierte Bedeutung. Es sollte ein System angegeben werden +TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = Die Code-System-Referenz {0} ist falsch - die Code-System-Referenz kann keine Referenz auf build.fhir.org sein. Dies k\u00f6nnte die richtige Referenz sein: {1} +TERMINOLOGY_TX_SYSTEM_WRONG_HTML = Die Code-System-Referenz {0} ist falsch - die Code-System-Referenz kann nicht auf eine HTML-Seite verweisen. Dies k\u00f6nnte die richtige Referenz sein: {1} +TX_SERVER_NO_BATCH_RESPONSE = Der Server gibt bei einer Batch-Validierungsanfrage null zur\u00fcck +TYPE_CHECKS_FIXED_CC = !!!!!!!!!!!!!!!!!!Das im Profil {3} definierte Muster [System {0}, Code {1}, und Anzeige ''{2}''] wurde nicht gefunden. Probleme: {4} +TYPE_CHECKS_FIXED_CC_US = !!!!!!!!!!!!!!!!!!Das im Profil {3} definierte Pattern [System {0}, Code {1}, Anzeige ''{2}'' und userSelected {5}] wurde nicht gefunden. Probleme: {4} +TYPE_CHECKS_PATTERN_CC = !!!!!!!!!!!!!!!!!!Das im Profil {3} definierte Pattern [System {0}, Code {1}, und Anzeige ''{2}''] wurde nicht gefunden. Probleme: {4} +TYPE_CHECKS_PATTERN_CC_US = !!!!!!!!!!!!!!!!!!Das im Profil {3} definierte Pattern [System {0}, Code {1}, Anzeige ''{2}'' und userSelected {5}] wurde nicht gefunden. Probleme: {4} +TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Canonical URLs m\u00fcssen absolute URLs sein, wenn es sich nicht um Fragment-Referenzen handelt ({0}) +TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Canonical URLs in contained Ressourcen m\u00fcssen absolute URLs sein ({0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Anh\u00e4nge enthalten entweder Daten und/oder eine URL, oder SOLLTEN entweder contentType und/oder Sprache aufweisen +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = Die Gr\u00f6\u00dfe des Anhangs kann nicht \u00fcberpr\u00fcft werden, da der Validator nicht f\u00fcr den Zugriff auf das Netz eingerichtet wurde (url = {0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = Angegebene Gr\u00f6\u00dfe des Anhangs {0} stimmt nicht mit der tats\u00e4chlichen Gr\u00f6\u00dfe des Anhangs {1} \u00fcberein +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = Angegebene Attachmentgr\u00f6\u00dfe {0} ist nicht g\u00fcltig +TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = Die Gr\u00f6\u00dfe des Anhangs betr\u00e4gt {0} Bytes und \u00fcberschreitet damit die angegebene Grenze von {1} Bytes +TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = Die Gr\u00f6\u00dfe des Anhangs kann nicht gepr\u00fcft werden, weil der Validator nicht wei\u00df, wie er auf {0} zugreifen soll. +TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = Die Gr\u00f6\u00dfe des Anhangs kann nicht \u00fcberpr\u00fcft werden, da ein Fehler beim Zugriff auf {0} aufgetreten ist: {1} +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64-kodierte Werte d\u00fcrfen keine Leerzeichen enthalten (gem\u00e4\u00df RFC 4648). Beachten Sie, dass nicht-validierende Leser aufgefordert werden, Leerzeichen trotzdem zu akzeptieren +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64-kodierte Werte SOLLTEN keine Leerzeichen enthalten (gem\u00e4\u00df RFC 4648). Beachten Sie, dass nicht-validierende Leser aufgefordert werden, Leerzeichen trotzdem zu akzeptieren +TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Die Base64-Gr\u00f6\u00dfe betr\u00e4gt {0} Bytes, was die angegebene Grenze von {1} Bytes \u00fcberschreitet +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' kann nicht aufgel\u00f6st werden +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' existiert, kann aber nicht geladen werden, daher kann sie nicht auf G\u00fcltigkeit gepr\u00fcft werden +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' verweist auf eine Ressource, die den falschen Typ hat. Gefunden {1}, erwartet eines von {2} +TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = Es wurden {0} Dezimalstellen gefunden, was die angegebene Grenze von {1} Stellen \u00fcberschreitet +TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = Lautet identifier.system ''urn:ietf:rfc:3986'', dann muss identifier.value ein vollst\u00e4ndiger URI sein (z. B. mit einem Schema beginnen), nicht ''{0}'' +TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = Der Markdown enth\u00e4lt einen Inhalt, der wie ein eingebetteter HTML-Tag aussieht und mit ''{0}'' beginnt. Dies wird (oder SOLLTE) von der Pr\u00e4sentationsschicht escaped werden. Der Inhalt sollte \u00fcberpr\u00fcft werden, um zu best\u00e4tigen, dass dies das gew\u00fcnschte Verhalten ist +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = Exception evaluating regex ''{0}'' on type {1}: {2} +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = Der maxValue im Profil hat den Systemcode {0}, der sich von dem Systemcode im Wert {1} unterscheidet, so dass der H\u00f6chstwert nicht gepr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = Der maxValue im Profil hat keinen Code, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Wert {0} kann nicht von Einheit {1} in maxWert-Einheit {2} umgewandelt werden, basierend auf UCUM-Definitionen; Maximalwert ist nicht g\u00fcltig +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = Der maxValue im Profil hat kein System, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = Der maxValue im Profil enth\u00e4lt keinen Wert, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = Es gibt keinen UCUM-Dienst, und die UCUM-Codes sind nicht identisch, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = Der maxValue im Profil hat ein System von {0}, das sich vom System des Wertes {1} unterscheidet, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = Der Wert enth\u00e4lt keinen Code, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = Der Wert hat kein System, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = Die Quantity enth\u00e4lt keinen Wert, so dass der Maximalwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = Der Wert in der Instanz ({2}) ist gr\u00f6\u00dfer als der angegebene H\u00f6chstwert ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = Der Wert in der Instanz ({0} {1}) ist nach der UCUM-Konvertierung gr\u00f6\u00dfer als der angegebene maxValue ({2} {3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = Der minValue im Profil hat einen Systemcode von {0}, der sich von dem Systemcode des Wertes {1} unterscheidet, so dass der Mindestwert nicht gepr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = Der minValue im Profil enth\u00e4lt keinen Code, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Konvertierung von Wert {0} aus Einheit {1} in minValue-Einheit {2} basierend auf UCUM-Definitionen nicht m\u00f6glich; Mindestwert ist nicht g\u00fcltig +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = Der minValue im Profil enth\u00e4lt kein System, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = Der minValue im Profil enth\u00e4lt keinen aktuellen Wert, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = Es gibt keinen UCUM-Dienst, und die UCUM-Codes sind nicht identisch, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = Der minValue im Profil hat ein System von {0}, das sich von dem System des Wertes {1} unterscheidet, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = Der Wert enth\u00e4lt keinen Code, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = Der Wert enth\u00e4lt kein System, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = Die Menge enth\u00e4lt keinen Wert, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = Der Wert in der Instanz ({2}) ist kleiner als der angegebene Mindestwert ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = Der Wert in der Instanz ({0} {1}) ist nach der UCUM-Konvertierung kleiner als der angegebene minValue ({2} {3}) +TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = Beispiel-URLs sind in diesem Zusammenhang nicht zul\u00e4ssig ({0}) +TYPE_SPECIFIER_ABSTRACT_TYPE = Der Type specifier {1} spezifiziert einen abstrakten Typ {0} +TYPE_SPECIFIER_ILLEGAL_TYPE = Der Type specifier {1} spezifizierte einen ung\u00fcltigen Typ {0} +TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Kein Typ-Spezifikator matcht, und der zugrunde liegende Typ {0} ist nicht abstrakt +TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Kein Typ-Spezifikator matcht, und der zugrunde liegende Typ {0} ist nicht g\u00fcltig +Terminology_PassThrough_TX_Message = !!{0} f\u00fcr ''{1}#{2}'' +Terminology_TX_Binding_CantCheck = Binding durch URI-Referenz kann nicht \u00fcberpr\u00fcft werden +Terminology_TX_Binding_Missing = Binding f\u00fcr {0} fehlt (cc) +Terminology_TX_Binding_Missing2 = Binding f\u00fcr {0} fehlt +Terminology_TX_Binding_NoServer = !!Der angegebene Wert konnte in Ermangelung eines Terminologieservers nicht validiert werden +Terminology_TX_Binding_NoSource = Binding f\u00fcr Pfad {0} hat keine source, kann also nicht \u00fcberpr\u00fcft werden +Terminology_TX_Binding_NoSource2 = Binding hat keine source, kann also nicht \u00fcberpr\u00fcft werden. +Terminology_TX_Code_ValueSet = Es wird kein Code gesetzt, und es ist ein Code aus ValueSet {0} ({1}) erforderlich +Terminology_TX_Code_ValueSetMax = Kein Code gesetzt, und es muss ein Code aus ValueSet {0} (max. Wertemenge {1}) gesetzt werden +Terminology_TX_Code_ValueSet_Ext = Kein Code gesetzt, und es sollte ein Code aus ValueSet{0} ({1}) gesetzt werden +Terminology_TX_Code_ValueSet_MISSING = Es wurde kein Code gesetzt, und ein Code aus dem ValueSet ist erforderlich +Terminology_TX_Coding_Count = Erwartete {0}, aber gefundene {1} coding elements +Terminology_TX_Confirm_1_CC = Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind und ein Code aus diesem ValueSet ist erforderlich (class = {1}) +Terminology_TX_Confirm_2_CC = Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind und ein Code aus diesem ValueSet stammen sollte. Es sei denn, es enth\u00e4lt keinen geeigneten Code (class = {1}) +Terminology_TX_Confirm_3_CC = Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und es wird empfohlen einen Code aus diesem ValueSet zu verwenden (Klasse = {1}) +Terminology_TX_Confirm_4a = !!Der angegebene Code ({2}) befindet sich nicht im ValueSet {0}, und es wird ein Code aus diesem ValueSet ben\u00f6tigt: {1} +Terminology_TX_Confirm_5 = !!!!Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und ein Code sollte aus diesem ValueSet stammen. Es sei denn, er hat enth\u00e4lt keinen geeigneten Code +Terminology_TX_Confirm_6 = !!!!Konnte nicht best\u00e4tigen, dass die angegebenen Codes im ValueSet {0} enthalten sind, und es wird empfohlen, einen Code aus diesem ValueSet zu verwenden. +Terminology_TX_Display_Wrong = Display sollte ''{0}'' sein +Terminology_TX_Error_CodeableConcept = Fehler {0} bei der Validierung des CodeableConcepts +Terminology_TX_Error_CodeableConcept_Max = Fehler {0} bei der Validierung des CodeableConcepts mit maxValueSet +Terminology_TX_Error_Coding1 = Fehler {0} bei der Validierung des Coding +Terminology_TX_Error_Coding2 = Fehler {0} bei der Validierung des Coding: {1} +Terminology_TX_NoValid_10 = Der bereitgestellte Code ist nicht im maximum ValueSet {0}, und ein Code aus diesem ValueSet ist erforderlich) (Code = {1}#{2}) +Terminology_TX_NoValid_11 = Der bereitgestellte Code ist nicht im maximum value set {0}, und ein Code aus diesem ValueSet ist erforderlich) (Code = {1}#{2}, Fehler = {3})) +Terminology_TX_NoValid_12 = !!Die angegebene Codierung ist nicht im ValueSet {0} enthalten, und es wird ein Code aus diesem ValueSet ben\u00f6tigt. {1} +Terminology_TX_NoValid_13 = !!Die bereitgestellte Codierung ist nicht im ValueSet {0} enthalten, und ein Code sollte aus diesem ValueSet stammen, es sei denn, er hat enth\u00e4lt geeigneten Code. {1} +Terminology_TX_NoValid_14 = !!Die angegebene Codierung ist nicht im ValueSet {0} enthalten, und es wird empfohlen, einen Code aus diesem ValueSet zu verwenden. {1} +Terminology_TX_NoValid_15 = Der angegebene Wert (''{0}'') konnte in Ermangelung eines Terminologieservers nicht validiert werden. +Terminology_TX_NoValid_16 = !!Der angegebene Wert (''{0}'') ist nicht im ValueSet {1}, und ein Code aus diesem Valueset ist erforderlich){2} +Terminology_TX_NoValid_17 = !!Der angegebene Wert (''{0}'') ist nicht im Valueset {1}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er hat enth\u00e4lt geeigneten Code){2} +Terminology_TX_NoValid_18 = !!!!Der angegebene Wert (''{0}'') ist nicht im Valueset {1}, und es wird empfohlen, einen Code aus diesem Valueset zu verwenden){2} +Terminology_TX_NoValid_1_CC = Keiner der bereitgestellten Codes ist im ValueSet {0}, und ein Code aus diesem ValueSet ist erforderlich) (Codes = {1}) +Terminology_TX_NoValid_2_CC = Keiner der angegebenen Codes ist im Valueset {0}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er enth\u00e4lt keinen geeigneten Code) (Codes = {1}) +Terminology_TX_NoValid_3_CC = !!Keiner der angegebenen Codes ist im Valueset {0}, und es wird empfohlen, einen Code aus dieserm Valueset zu verwenden) (Codes = {1}) +Terminology_TX_NoValid_4 = !!Die bereitgestellte Codierung ist nicht im Valueset {0}, und es wird ein Code aus diesem Valueset ben\u00f6tigt{1} +Terminology_TX_NoValid_5 = !!Die angegebene Codierung ist nicht im Valueset {0}, und ein Code sollte aus diesem Valueset stammen, es sei denn, er enth\u00e4lt keinen geeigneten Code{1} +Terminology_TX_NoValid_6 = !!Die bereitgestellte Codierung ist nicht im Valueset {0} enthalten, und es wird empfohlen, einen Code aus diesem Valueset zu verwenden{1} +Terminology_TX_NoValid_7 = Keiner der bereitgestellten Codes konnte gegen das maximum value set {0} validiert werden, (Fehler = {1}) +Terminology_TX_NoValid_8 = Keiner der bereitgestellten Codes befindet sich im maximum value sete {0}, und ein Code aus diesem Valueset ist erforderlich) (Codes = {1}) +Terminology_TX_NoValid_9 = !!Der bereitgestellte Code konnte nicht gegen das the maximum value set {0} validiert werden, (Fehler = {1}) +Terminology_TX_System_Invalid = Ung\u00fcltige System URI: {0} +Terminology_TX_System_Relative = Coding.system muss eine absolute Referenz sein, nicht eine lokale Referenz +Terminology_TX_System_Unknown = Unbekanntes Code System ''{0}'' +Terminology_TX_System_ValueSet = Ung\u00fcltige System-URI: {0} - kann kein ValueSet URI als System verwenden +Terminology_TX_System_ValueSet2 = Die Codierung bezieht sich auf ein ValueSet, nicht auf ein Codesystem (''{0}''). +Terminology_TX_ValueSet_NotFound = !!ValueSet {0} vom Validator nicht gefunden +Terminology_TX_ValueSet_NotFound_CS = !!Ein Verweis auf ein CodeSystem ({0}) gefunden wo ein ValueSet vorgeschrieben ist +Text_should_not_be_present = Text sollte nicht vorhanden sein +The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = Der base snapshot markiert ein Slicing als closed, aber das Differential versucht, es in {0} bei {1} ({2}) zu erweitern. +This__cannot_be_parsed_as_a_FHIR_object_no_namespace = !!Dieses ''{0}2 kann nicht als FHIR-Objekt geparst werden (kein Namensraum). +This_base_property_must_be_an_Array_not_ = Diese Basiseigenschaft muss ein Array sein, nicht {0} +This_cannot_be_parsed_as_a_FHIR_object_no_name = !!Dies kann nicht als FHIR-Objekt geparst werden (kein Name) +This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = !!Dies scheint keine FHIR-Ressource zu sein (unbekannter Name ''{0}'') +This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = !!Dies scheint keine FHIR-Ressource zu sein (unbekannter Namensraum/Name ''{0}::{1}'') +This_element_does_not_match_any_known_slice_ = !!Dieses Element stimmt mit keinem bekannten Slice{0} \u00fcberein. +This_property_must_be__not_ = Diese Property muss {0}, nicht {1} sein +This_property_must_be_a_Literal_not_ = Diese Eigenschaft muss ein Literal sein, nicht {0} +This_property_must_be_a_URI_or_bnode_not_ = Diese Eigenschaft muss ein URI oder bnode sein, nicht {0} +This_property_must_be_an_Array_not_ = Diese Eigenschaft muss ein Array sein, nicht {0} +This_property_must_be_an_object_not_ = Dieses Property muss ein Objekt sein, nicht {0} +This_property_must_be_an_simple_value_not_ = Diese Property muss ein einfacher Wert sein, nicht {0} +Type_Specific_Checks_DT_Base64_Valid = Der Wert ''{0}'' ist kein g\u00fcltiger Base64-Wert. +Type_Specific_Checks_DT_Boolean_Value = Boolesche Werte m\u00fcssen ''wahr'' oder ''falsch'' sein. Type_Specific_Checks_DT_Code_WS = The code ''{0}'' is not valid (whitespace rules) -Type_Specific_Checks_DT_DateTime_Reasonable=Der Wert ''{0}'' liegt au\u00dferhalb des Bereichs vern\u00fcnftiger Jahre - Pr\u00fcfung auf Dateneingabefehler -Type_Specific_Checks_DT_DateTime_Regex=Instant ''{0}'' ist nicht g\u00fcltig (per Regex) -Type_Specific_Checks_DT_DateTime_TZ=Wenn ein Datum eine Uhrzeit hat, muss es eine Zeitzone haben. -Type_Specific_Checks_DT_DateTime_Valid=Kein g\u00fcltiges Datum/Uhrzeit ({0}) -Type_Specific_Checks_DT_Date_Valid=Kein g\u00fcltiges Datum ({0}) -Type_Specific_Checks_DT_Decimal_Range=Der Wert ''{0}'' liegt au\u00dferhalb des Bereichs der \u00fcblicherweise/vern\u00fcnftig unterst\u00fctzten Dezimalzahlen. -Type_Specific_Checks_DT_Decimal_Valid=Der Wert ''{0}'' ist kein g\u00fcltiger Dezimalwert. -Type_Specific_Checks_DT_ID_Valid=id-Wert ''{0}'' ist nicht g\u00fcltig -Type_Specific_Checks_DT_Identifier_System=Identifier.system muss eine absolute Referenz sein, nicht eine lokale Referenz -Type_Specific_Checks_DT_Instant_Valid=Ung\u00fcltige Instant ({0}) -Type_Specific_Checks_DT_Integer64_Valid=Der Wert ''{0}'' ist keine g\u00fcltige integer64 -Type_Specific_Checks_DT_Integer_GT=Wert gr\u00f6\u00dfer als der zul\u00e4ssige Maximalwert von {0} -Type_Specific_Checks_DT_Integer_LT=Wert ist kleiner als der zul\u00e4ssige Mindestwert von {0} -Type_Specific_Checks_DT_Integer_LT0=Wert ist kleiner als der zul\u00e4ssige Mindestwert von 0 -Type_Specific_Checks_DT_Integer_LT1=Wert kleiner ist als der zul\u00e4ssige Mindestwert von 1 -Type_Specific_Checks_DT_Integer_Valid=Der Wert ''{0}'' ist keine g\u00fcltige ganze Zahl. -Type_Specific_Checks_DT_OID_Start=OIDs m\u00fcssen mit urn:oid: beginnen -Type_Specific_Checks_DT_OID_Valid=OIDs m\u00fcssen g\u00fcltig sein -Type_Specific_Checks_DT_Primitive_Length=Wert l\u00e4nger als die zul\u00e4ssige Maximall\u00e4nge von {0} -Type_Specific_Checks_DT_Primitive_NotEmpty=@value kann nicht leer sein -Type_Specific_Checks_DT_Primitive_Regex=Elementwert ''{0}'' entspricht nicht der Regex ''{1}''. -Type_Specific_Checks_DT_Primitive_ValueExt=Primitive Typen m\u00fcssen einen Wert, oder child Extensions haben -Type_Specific_Checks_DT_Primitive_WS=Primitive Typen sollten nicht nur aus Leerzeichen bestehen -Type_Specific_Checks_DT_String_Length=Wert ist l\u00e4nger als die zul\u00e4ssige Maximall\u00e4nge von 1 MB (1048576 Bytes) -Type_Specific_Checks_DT_String_WS=Wert sollte nicht mit Leerzeichen beginnen oder enden -Type_Specific_Checks_DT_Time_Valid=Keine g\u00fcltige Zeit ({0}) -Type_Specific_Checks_DT_URI_OID=URI-Werte k\u00f6nnen nicht mit oid: beginnen -Type_Specific_Checks_DT_URI_UUID=URI-Werte k\u00f6nnen nicht mit uuid: beginnen -Type_Specific_Checks_DT_URI_WS=URI-Werte k\u00f6nnen keine Leerzeichen enthalten (''{0}'') -Type_Specific_Checks_DT_URL_Resolve=URL-Wert ''{0}'' l\u00f6st nicht auf -Type_Specific_Checks_DT_UUID_Strat=UUIDs m\u00fcssen mit urn:uuid: beginnen -Validation_BUNDLE_Message=Der erste Eintrag in einer Nachricht muss ein MessageHeader sein -Validation_VAL_Content_Unknown=Unerkannter Inhalt {0} -Validation_VAL_NoType=Unbekannter Typ {0} -Validation_VAL_Profile_MatchMultiple=Profil {0}, Element stimmt mit mehr als einem Slice \u00fcberein - {1}, {2} -Validation_VAL_Profile_Maximum_one={3}: maximal erlaubt = {7}, aber gefunden {0} -Validation_VAL_Profile_Maximum_other={3}: maximal erlaubt = {7}, aber gefunden {0} -Validation_VAL_Profile_Minimum_one={3}: mindestens erforderlich = {7}, aber nur gefunden {0} -Validation_VAL_Profile_Minimum_other={3}: mindestens erforderlich = {7}, aber nur gefunden {0} -Validation_VAL_Profile_MultipleMatches_one=Es wurden mehrere passende Profile unter den Auswahlm\u00f6glichkeiten gefunden: {1} -Validation_VAL_Profile_MultipleMatches_other=Es wurden mehrere passende Profile unter den Auswahlm\u00f6glichkeiten gefunden: {1} -Validation_VAL_Profile_NoCheckMax_one={1}: Kann die maximal zul\u00e4ssige Anzahl ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen. -Validation_VAL_Profile_NoCheckMax_other={1}: Kann die maximal zul\u00e4ssige Anzahl ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen. -Validation_VAL_Profile_NoCheckMin_one={1}: Kann das erforderliche Minimum ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen -Validation_VAL_Profile_NoCheckMin_other={1}: Kann das erforderliche Minimum ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen -Validation_VAL_Profile_NoDefinition=Keine Definition f\u00fcr Ressourcentyp ''{0}'' gefunden -Validation_VAL_Profile_NoMatch=Es ist nicht m\u00f6glich, ein passendes Profil unter den Kandidaten zu finden: {0} -Validation_VAL_Profile_NoSnapshot=StructureDefinition hat keinen Snapshot - die Validierung erfolgt gegen den Snapshot, daher muss dieser bereitgestellt werden -Validation_VAL_Profile_NoType=Der Typ des Elements {0} ist nicht bekannt, was illegal ist. G\u00fcltige Typen an dieser Stelle sind {1} -Validation_VAL_Profile_NotAllowed=Dieses Element wird durch das Profil {0} nicht erlaubt. -Validation_VAL_Profile_NotSlice=Dieses Element stimmt mit keinem bekannten Slice {0} \u00fcberein, und das Slicing ist CLOSED: {1} -Validation_VAL_Profile_OutOfOrder=Durch das Profil {0} angegeben, ist das Element ''{1}'' au\u00dferhalb der definierten Reihenfolge. -Validation_VAL_Profile_SliceOrder=Durch das Profil {0} spezifiziert, ist das Element ''{1}'' an der falschen Stelle im ordered slicee enthalten -Validation_VAL_Profile_Unknown=Profil Reference ''{0}'' konnte nicht aufgel\u00f6st werden, wurde also nicht \u00fcberpr\u00fcft -Validation_VAL_Profile_WrongType=Angegebener Profiltyp war ''{0}'', aber gefundener Typ ''{1}''. -Validation_VAL_Unknown_Profile=Unbekanntes Profil {0} -XHTML_XHTML_Attribute_Illegal=Unzul\u00e4ssiger Attributname in XHTML (''{0}'' auf ''{1}'') -XHTML_XHTML_Element_Illegal=Unzul\u00e4ssiger Elementname im XHTML (''{0}'') -XHTML_XHTML_NS_InValid=Falscher Namensraum im XHTML (''{0}'', sollte ''{1}'' sein) -XHTML_XHTML_Name_Invalid=Falscher Name im XHTML (''{0}'') - muss mit div beginnen -_DT_Fixed_Wrong=Der Wert ist ''{0}'', muss aber ''{1}'' sein. -All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod=Alle Observations sollten ein effectiveDateTime oder eine effectivePeriode haben -All_observations_should_have_a_performer=Alle Observations sollten einen Performer haben -All_observations_should_have_a_subject=Alle Observations sollten ein Subject haben -Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set=Slice-Matching kann nicht aufgel\u00f6st werden - kein fester Wert oder erforderliches ValueSet -Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done=Slice-Matching kann nicht aufgel\u00f6st werden - Slice-Matching nach ValueSet nicht implementiert -Problem_processing_expression__in_profile__path__=Problem bei der Verarbeitung der Expression {0} im Profil {1} Pfad {2}: {3} -Unable_to_find_element_with_id_=Element mit der Id ''{0}'' konnte nicht gefunden werden -Slice_encountered_midway_through_set_path___id___=Slice, der in der Mitte des Set gefunden wurde (Pfad = {0}, id = {1}); {2} -Unable_to_resolve_actual_type_=Kann den tats\u00e4chlichen Typ nicht aufl\u00f6sen {0} -Unsupported_version_R1=Nicht unterst\u00fctzte Version R1 -Unsupported_fixed_value_type_for_discriminator_for_slice__=Nicht unterst\u00fctzter fixed value type f\u00fcr Diskriminator({0}) f\u00fcr Slice {1}: {2} -Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_=Nicht unterst\u00fctztes CodeableConcept Pattern - Extensions sind nicht zul\u00e4ssig - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} -Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_=Nicht unterst\u00fctztes CodeableConcept Pattern - muss mindestens eine Coding haben - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} -Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_=Nicht unterst\u00fctztes CodeableConcept Pattern - unter Verwendung von Text - f\u00fcr Diskriminator({0}) f\u00fcr Scheibe {1} -Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_=Nicht unterst\u00fctztes Identifier Pattern - Extensions sind nicht erlaubt - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} -Unsupported_fixed_pattern_type_for_discriminator_for_slice__=Nicht unterst\u00fctzter fixed Pattern Type f\u00fcr Diskriminator({0}) f\u00fcr Slice {1}: {2} -Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___=Problem bei der Auswertung des Slicing-Ausdrucks f\u00fcr Element im Profil {0} Pfad {1} (fhirPfad = {2}): {3} -Could_not_match_discriminator_for_slice_in_profile_one=Konnte nicht mit dem Diskriminator ({0}) f\u00fcr Slice {1} in Profil {2} \u00fcbereinstimmen - der Diskriminator {3} hat keinen fixed Value, kein Binding oder existence assertions -Could_not_match_discriminator_for_slice_in_profile_other=Konnte keinen Diskriminator ({1}) f\u00fcr Slice {2} im Profil {3} zuordnen - Keiner der Diskriminatoren {4} hat einen fixed value, eine Binding oder existence assertions -Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0=Der Diskriminator ({0}) basiert auf der Existenz von Elementen, aber Slice {1} setzt weder min>=1 noch max=0 -Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_=Profilbasierte Diskriminatoren m\u00fcssen einen Typ mit einem Profil ({0} im Profil {1}) haben. -#The following error cannot occur for a single item. _one case left intentionally blank. -#Profile_based_discriminators_must_have_only_one_type__in_profile_one= -Profile_based_discriminators_must_have_only_one_type__in_profile_other=Profilbasierte Diskriminatoren d\u00fcrfen nur einen Typ ({1} im Profil {2}) haben. -Profile_based_discriminators_must_have_a_type__in_profile_=Profilbasierte Diskriminatoren m\u00fcssen einen Typ ({0} im Profil {1}) haben. -Discriminator__is_based_on_type_but_slice__in__has_no_types=Der Diskriminator ({0}) basiert auf dem Typ, aber das Slice {1} in {2} hat keine Typen -#The following error cannot occur for a single item. _one case left intentionally blank. -#Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one= -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other=Der Diskriminator ({1}) basiert auf dem Typ, aber das Slice {2} in {3} hat mehrere Typen: {4} -Found__items_for__resolving_discriminator__from_={0} Elemente f\u00fcr {1} gefunden welche mit Diskriminators {2} von {3} \u00fcbereinstimmen -Unable_to_find__resolving_discriminator__from_=Kann keinen {0} aufl\u00f6senden Diskriminator {1} von {2} finden -Unable_to_find_resource__at__resolving_discriminator__from_=Ressource {0} bei {1} nicht auffindbar, Diskriminator {2} von {3} -No_reference_resolving_discriminator__from_=Kein Aufl\u00f6sen der Referenz m\u00f6glich, Diskriminator {0} von {1} -Unable_to_resolve_element__in_profile_=Element {0} im Profil {1} kann nicht aufgel\u00f6st werden -Unable_to_resolve_profile_=Profil {0} kann nicht gefunden werden -Resource_resolution_services_not_provided=Dienste zur Ressourcenaufl\u00f6sung werden nicht verf\u00fcgbar -Unrecognised_extension_context_=Unerkannter Erweiterungskontext {0} -Unable_to_locate_the_profile__in_order_to_validate_against_it=Das Profil ''{0}'' konnte nicht gefunden werden um gegen dieses validieren zu k\u00f6nnen -Reference__refers_to_a__not_a_ValueSet=Die Referenz {0} referenziert auf {1}, nicht auf ein ValueSet -Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element=Not done yet (ValidatorHostServices.conformsToProfile), wenn das Element kein Element ist -Not_supported_yet=Noch nicht unterst\u00fctzt -Unable_to_resolve_=Nicht aufl\u00f6sbar {0} -Not_done_yet__resolve__locally_2=Noch nicht unterst\u00fctzt - find {0} lokal (2) -Not_done_yet_ValidatorHostServicesexecuteFunction=Noch nicht unterst\u00fctzt (ValidatorHostServices.executeFunction) -Not_done_yet_ValidatorHostServicescheckFunction=Noch nicht unterst\u00fctzt (ValidatorHostServices.checkFunction) -Not_done_yet_ValidatorHostServicesresolveFunction_=Noch nicht unterst\u00fctzt (ValidatorHostServices.resolveFunction): {0} -Unable_to_find_base_definition_for_logical_model__from_=Es konnte keine base definition f\u00fcr das logical model gefunden werden: {0} von {1} -Same_id_on_multiple_elements__in_=Gleiche Id ''{0}'' bei mehreren Elementen {1}/{2} in {3} -No_path_on_element_Definition__in_=Kein Pfad auf Element Definition {0} in {1} -needs_a_snapshot=ben\u00f6tigt einen Snapshot -not_the_right_kind_of_structure_to_generate_schematrons_for=nicht die richtige Art von Struktur zur Erzeugung von Schematrons -Not_handled_yet_sortElements_=Noch nicht unterst\u00fctzt (sortElemente: {0}:{1}) -Unable_to_resolve_profile__in_element_=Profil {0} im Element {1} kann nicht aufgel\u00f6st werden -Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_=Kinder auf einem Element mit einem polymorphen Typ sind nicht erlaubt - Sie m\u00fcssen die Typen zuerst slicen und constrainen (sortElemente: {0}:{1}) -Unable_to_find_profile__at_=Das Profil ''{0}'' konnte bei {1} nicht gefunden werden. -Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile=Ungekl\u00e4rte Situation: Ressource ist f\u00fcr mehr als eine Option profiliert - kann das passende Profil nicht bestimmen -Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_=Interne Rekursionserkennung: find()-Schleifenpfadrekursion > {0} - Pr\u00fcfpfade sind g\u00fcltig (f\u00fcr Pfad {1}/{2}) -Internal_error___type_not_known_=Interner Fehler - Typ nicht bekannt {0} -Unable_to_find_element_=Element {0} kann nicht gefunden werden -Error_generating_table_for_profile__=Fehler bei der Erstelleung der Tabelle f\u00fcr das Profil {0}: {1} -StructureDefinition__at__illegal_constrained_type__from__in_=StructureDefinition {0} bei {1}: unzul\u00e4ssiger eingeschr\u00e4nkter Typ {2} von {3} bis {4} -Error_at__The_target_profile__is_not__valid_constraint_on_the_base_=Fehler bei {0}#{1}: Das Zielprofil {2} ist keine g\u00fcltiges constrain auf die Basis ({3}) -Error_in_profile__at__Base_isSummary___derived_isSummary__=Fehler im Profil {0} bei {1}: Basis isSummary = {2}, derived isSummary = {3} -StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_=StructureDefinition {0} bei {1}: illegaler Versuch ein Binding von {2} auf {3} zu \u00e4ndern -Unexpected_condition_in_differential_typeslicetypelistsize__1_at_=Unerwartete condition im Differential: typ-slice.typ-list.size() != 1 bei {0}/{1} -Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_=Unerwartete condition in Differential: type-slice.type-list.size() == 10 und impliziter Slice-Name enth\u00e4lt keinen g\u00fcltigen Typ (''{0}''?) bei {1}/{2} -Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated=Versuch einen Schnappschuss f\u00fcr das Profil ''{0}'' als {1} zu verwenden, bevor er generiert wird -null_min = null min -_has_children__for_type__in_profile__but_cant_find_type={0} hat children ({1}) f\u00fcr den Typ {2} im Profil {3}, kann aber den Typ nicht finden -_has_children__and_multiple_types__in_profile_={0} hat children ({1}) und mehrere Typen ({2}) im Profil {3} -Adding_wrong_path=Falschen Pfad hinzuf\u00fcgen -Named_items_are_out_of_order_in_the_slice=Named items sind in der Slice im falscher Reihenfolge -The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__=Der base snapshot markiert ein Slicing als closed, aber das Differential versucht, es in {0} bei {1} ({2}) zu erweitern. -Not_done_yet=Noch nicht unterst\u00fctzt -Unknown_type__at_=Unbekannter Typ {0} bei {1} -Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet=Differential beinhaltet ''{0} (@ {1})'', aber die Base nicht, und ist fixed type gesetzt. Der Typ ist {2}. Dies wird noch nicht unterst\u00fctzt. -Slicing_rules_on_differential__do_not_match_those_on_base___rule___=Slicing-Regeln auf Differential ({0}) stimmen nicht mit denen auf Basis ({1}) \u00fcberein - Regel @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___=Slicing-Regeln auf Differential ({0}) stimmen nicht mit denen auf Basis ({1}) \u00fcberein - Diskriminator @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___order___=Slicing-Regeln f\u00fcr Differential ({0}) stimmen nicht mit denen der Basis ({1}) \u00fcberein - Reihenfolge @ {2} ({3}) -not_done_yet__slicing__types__=noch nicht unterst\u00fctzt - slicing / typen @ {0} -Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Ung\u00fcltiges Slicing: Es gibt mehr als einen Typ Slice bei {0}, aber einer von ihnen ({1}) hat min = 1, so dass die anderen Slices nicht existieren k\u00f6nnen. -Did_not_find_type_root_=\ type root: {0} konnte nicht gefunden werden -Error_at_path__Slice_for_type__has_wrong_type_=Fehler bei Pfad {0}: Slice f\u00fcr Typ ''{1}'' hat falschen Typ ''{2}'' -Error_at_path__Slice_for_type__has_more_than_one_type_=Fehler bei Pfad {0}: Slice f\u00fcr Typ '{1}' hat mehr als einen Typ '{2}'. -Error_at_path__Slice_name_must_be__but_is_=Fehler bei Pfad {0}: Slice-Name muss ''{1}'' sein, ist aber ''{2}'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this=Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.path != ''$this'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type=Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.type != ''typ'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1=Fehler bei Pfad {0} in {1}: Typ-Slicing mit slicing.discriminator.count() > 1 -Error_at_path__in__Type_slicing_with_slicingordered__true=Fehler bei Pfad {0} in {1}: Typ Slicing mit slicing.ordered = true -Adding_wrong_path_in_profile___vs_=Falscher Pfad im Profil hinzugef\u00fcgt {0}: {1} vs {2} -_has_no_children__and_no_types_in_profile_={0} hat keine Kinder ({1}) und keine Typen im Profil {2} -not_done_yet=noch nicht unterst\u00fctzt -Did_not_find_single_slice_=Keine Slice gefunden: {0} -Differential_does_not_have_a_slice__b_of_____in_profile_=Das Differential hat kein Slice: {0}/ (b:{1} von {2} / {3}/ {4}) im Profil {5} -Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_=Versuch ein Element zu sclicen, das sich nicht wiederholt: {0}/{1} von {2} in {3} -Unable_to_resolve_reference_to_=Kann den Verweis auf {0} nicht aufl\u00f6sen -Unable_to_find_element__in_=Element {0} in {1} konnte nicht gefunden werden -Unable_to_find_base__for_=Basis {0} f\u00fcr {1} konnte nicht gefunden werden -Adding_wrong_path__outcomegetPath___resultPathBase__=Falscher Pfad hinzugef\u00fcgt - outcome.getPath() = {0}, resultPathBase = {1} -Illegal_path__in_differential_in__illegal_characters_=Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: unzul\u00e4ssige Zeichen [] -Illegal_path__in_differential_in__illegal_character_=Illegaler Pfad ''{0}'' in Differential in {1}: illegales Zeichen ''{2}'' -Illegal_path__in_differential_in__no_unicode_whitespace=Illegaler Pfad ''{0}'' in Differential in {1}: kein Unicode-Whitespace erlaubt -Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length=Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: Namensteil \u00fcberschreitet 64 Zeichen L\u00e4nge -Illegal_path__in_differential_in__name_portion_mising_=Unzul\u00e4ssiger Pfad ''{0}'' in Differential in {1}: Namensteil fehlt (''...'') -Illegal_path__in_differential_in__must_start_with_=Illegaler Pfad ''{0}'' in Differential in {1}: muss mit {2}.{3} beginnen -No_path_value_on_element_in_differential_in_=Kein Pfadwert auf Element in Differential in {0} -No_path_on_element_in_differential_in_=Kein Pfad auf Element in Differential in {0} -Unxpected_internal_condition__no_source_on_diff_element=Unerwarteter interner Zustand - keine Source auf dem diff-Element definiert -type_on_first_snapshot_element_for__in__from_=type des ersten snapshot elements definiert f\u00fcr {0} in {1} von {2} -type_on_first_differential_element=type des ersten differential elements definiert! -Circular_snapshot_references_detected_cannot_generate_snapshot_stack__=Zirkul\u00e4re Snapshot-Referenzen erkannt; kann keinen Snapshot erzeugen (Stapel = {0}) -Base__Derived_profiles_have_different_types____vs___=Basis- und abgeleitete Profile haben unterschiedliche Typen ({0} = {1} vs. {2} = {3}) -Derived_profile__has_no_derivation_value_and_so_cant_be_processed=Das abgeleitete Profil {0} besitzt keinen derivation value und kann daher nicht verarbeitet werden. -Derived_profile__has_no_type=Abgeleitetes Profil {0} hat keinen Typ -Base_profile__has_no_type=Das Basisprofil {0} hat keinen Typ -no_derived_structure_provided=keine abgeleitete Struktur vorhanden. -no_base_profile_provided=kein Basisprofil vorhanden -element_id__null__on_ = element id = null: {0} on {1} -element__null_ = element = null: {0} -getSliceList_should_only_be_called_when_the_element_has_slicing=getSliceList sollte nur aufgerufen werden, wenn das Element Slicing hat -Unable_to_resolve_name_reference__at_path_=Name reference {0} am Pfad {1} kann nicht aufgel\u00f6st werden -Details_for__matching_against_Profile_=Details f\u00fcr {0} Abgleich gegen Profil{1} -Does_not_match_slice_=Stimmt nicht mit Slice ''{0}'' \u00fcberein -Profile__does_not_match_for__because_of_the_following_profile_issues__=Das Profil {0} passt nicht zu {1} wegen der folgenden Profilprobleme: {2} -This_element_does_not_match_any_known_slice_=Dieses Element stimmt mit keinem bekannten Slice{0} \u00fcberein. -defined_in_the_profile=im Profil definiert -This_does_not_appear_to_be_a_FHIR_resource_unknown_name_=Dies scheint keine FHIR-Ressource zu sein (unbekannter Name ''{0}'') -This_cannot_be_parsed_as_a_FHIR_object_no_name=Dies kann nicht als FHIR-Objekt geparst werden (kein Name) -This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_=Dies scheint keine FHIR-Ressource zu sein (unbekannter Namensraum/Name ''{0}::{1}'') -This__cannot_be_parsed_as_a_FHIR_object_no_namespace=Dieses ''{0}2 kann nicht als FHIR-Objekt geparst werden (kein Namensraum). -Unable_to_find_resourceType_property=ResourceType-Property kann nicht gefunden werden -Error_parsing_JSON_the_primitive_value_must_be_a_string=Fehler beim Parsen von JSON: Der primitive Wert muss ein String sein. -Error_parsing_JSON_the_primitive_value_must_be_a_number=Fehler beim Parsen von JSON: Der primitive Wert muss eine Zahl sein. -Error_parsing_JSON_the_primitive_value_must_be_a_boolean=Fehler beim Parsen von JSON: Der primitive Wert muss ein Boolean sein. -Error_parsing_XHTML_=Fehler beim Parsen von XHTML: {0} -This_property_must_be_an_object_not_=Dieses Property muss ein Objekt sein, nicht {0} -This_property_must_be_an_simple_value_not_=Diese Property muss ein einfacher Wert sein, nicht {0} -This_property_must_be__not_=Diese Property muss {0}, nicht {1} sein -This_property_must_be_an_Array_not_=Diese Eigenschaft muss ein Array sein, nicht {0} -Unrecognised_property_=Nicht erkannte Property ''@{0}'' -Object_must_have_some_content=Objekt muss einen Inhalt haben -Error_parsing_JSON_=Fehler beim Parsen von JSON: {0} -Node_type__is_not_allowed=Nodetyp {0} ist nicht erlaubt -CDATA_is_not_allowed=CDATA ist nicht erlaubt -Undefined_element_=Undefiniertes Element ''{0}'' -Undefined_attribute__on__for_type__properties__=Undefiniertes Attribut ''@{0}'' auf {1} f\u00fcr Typ {2} (properties = {3}) -Text_should_not_be_present=Text sollte nicht vorhanden sein -Wrong_namespace__expected_=Falscher Namensraum - erwartet ''{0}'' -Element_must_have_some_content=Element muss einen Inhalt haben -No_processing_instructions_allowed_in_resources=Keine Verarbeitungsanweisungen in Ressourcen erlaubt -Unknown_resource_type_missing_rdfstype=Unbekannter Ressourcentyp (fehlender rdfs:typ) -reference_to__cannot_be_resolved=Referenz auf {0} kann nicht aufgel\u00f6st werden -Unrecognised_predicate_=Nicht anerkanntes predicate ''{0}'' -Error_parsing_Turtle_=Fehler beim Parsen von Turtle: {0} -Unexpected_datatype_for_rdfstype=Unerwarteter Datentyp f\u00fcr rdfs:type -Attempt_to_replace_element_name_for_a_nonchoice_type=Versuch, den Elementnamen f\u00fcr einen non-choice type zu ersetzen -Wrong_type_for_resource=Falscher Typ f\u00fcr Ressource -Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_=Enthaltene Ressource scheint keine FHIR-Ressource zu sein (unbekannter Name ''{0}'') -Unknown_Date_format_=Unbekanntes Datumsformat ''{0}'' -Unknown_Data_format_=Unbekanntes Datenformat ''{0}'' -No_type_found_on_=Kein Typ gefunden bei ''{0}'' -error_writing_number__to_JSON=Fehler beim Schreiben der Nummer ''{0}'' in JSON -Unable_to_process_request_for_resource_for___=Anforderung einer Ressource f\u00fcr {0} / {1} kann nicht verarbeitet werden -Resource_type_mismatch_for___=Ressourcentyp-Abweichung f\u00fcr {0} / {1} -not_done_yet_cant_fetch_=noch nicht implementiert: kann {0} nicht aufl\u00f6sen -Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available=Versuch den Terminologieserver zu verwenden, wenn kein Terminologieserver verf\u00fcgbar ist -No_ExpansionProfile_provided=Kein Expansionsprofil verf\u00fcgbar -Can_only_specify_profile_in_the_context=Kann Profil nur im Kontext angeben -no_url_in_expand_value_set_2=keine Url im expand value set 2 -no_url_in_expand_value_set=keine Url im expand value set -no_value_set=kein value set -No_Parameters_provided_to_expandVS=Keine Parameter f\u00fcr expandVS angegeben -No_Expansion_Parameters_provided=Keine Expansion-Parameter angegeben -Unable_to_resolve_value_Set_=ValueSet {0} kann nicht gefunden werden -Delimited_versions_have_exact_match_for_delimiter____vs_=Delimited Versionen haben eine genaue \u00dcbereinstimmung f\u00fcr das Trennzeichen ''{0}'' : {1} vs {2} -Duplicate_Resource_=Ressource duplizieren {0} -Error_expanding_ValueSet_running_without_terminology_services=Fehler bei der Erweiterung von ValueSet: Betrieb ohne Terminologiedienste -Error_validating_code_running_without_terminology_services=Fehler beim Validieren des Codes: Ausf\u00fchrung ohne Terminologiedienste -Unable_to_validate_code_without_using_server=Code kann ohne Verwendung des Servers nicht validiert werden -Profile___Error_generating_snapshot=Profil {0} ({1}). Fehler bei der Erstellung des Snapshots -Profile___element__Error_generating_snapshot_=Profil {0} ({1}). Fehler bei der Erstellung des Snapshots -Profile___base__could_not_be_resolved=Profil {0} ({1}) base {2} konnte nicht aufgel\u00f6st werden -Profile___has_no_base_and_no_snapshot=Profil {0} ({1}) hat keine base und keinen SnapShot -No_validator_configured=Kein Validator konfiguriert -Parser_Type__not_supported=Parser-Typ {0} nicht unterst\u00fctzt -Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_=Versionsabweichung. Der Kontext hat die Version {0} geladen, und der neu geladene Inhalt ist die Version {1}. -Error_reading__from_package__=Fehler beim Lesen {0} aus dem Paket {1}#{2}: {3} -Error_parsing_=Fehler beim Parsen {0}:{1} -Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__=Keine Verbindung zum Terminologieserver m\u00f6glich. Verwenden Sie den Parameter ''-tx n/a'' um ohne Verwendung von Terminologiediensten zu laufen welche LOINC, SNOMED, ICD-X usw. zu validieren. Fehler = {0} -Display_Name_for__should_be_one_of__instead_of_one=Der Displayname f\u00fcr {1}#{2} sollte einer von ''{3}'' anstelle von ''{4}'' sein. -Display_Name_for__should_be_one_of__instead_of_other=Der Displayname f\u00fcr {1}#{2} sollte einer von ''{3}'' anstelle von ''{4}'' sein. -Unknown_Code_in=Unbekannter Code {0} in {1} -Unknown_Code_in_Version=Unbekannter Code {0} in {1} Version {2} -Code_found_in_expansion_however_=Code in der Erweiterung gefunden, jedoch: {0} -None_of_the_provided_codes_are_in_the_value_set_=Keiner der bereitgestellten Codes ist im ValueSet {0} -Coding_has_no_system__cannot_validate=Kodierung hat kein System - kann nicht validiert werden -Unable_to_handle_system__concept_filter_with_op__=System {0} concept filter mit op = {1} nicht verarbeitbar -Unable_to_handle_system__filter_with_property__=System {0} Filter mit der Eigenschaft = {1} kann nicht verarbeitet werden. -Unable_to_resolve_system__value_set_has_include_with_no_system=System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt Include ohne System -Unable_to_resolve_system__value_set_has_imports=System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt Importe -Unable_to_resolve_system__value_set_expansion_has_multiple_systems=System nicht aufl\u00f6sbar - Extension des ValueSets enth\u00e4lt mehrere Systeme -Unable_to_resolve_system__value_set_has_no_includes_or_expansion=System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt keine Includes oder Extensions -Unable_to_resolve_system__no_value_set=System nicht aufl\u00f6sbar - kein ValueSet +Type_Specific_Checks_DT_DateTime_Reasonable = Der Wert ''{0}'' liegt au\u00dferhalb des Bereichs vern\u00fcnftiger Jahre - Pr\u00fcfung auf Dateneingabefehler +Type_Specific_Checks_DT_DateTime_Regex = Instant ''{0}'' ist nicht g\u00fcltig (per Regex) +Type_Specific_Checks_DT_DateTime_TZ = Wenn ein Datum eine Uhrzeit hat, muss es eine Zeitzone haben. +Type_Specific_Checks_DT_DateTime_Valid = Kein g\u00fcltiges Datum/Uhrzeit ({0}) +Type_Specific_Checks_DT_Date_Valid = Kein g\u00fcltiges Datum ({0}) +Type_Specific_Checks_DT_Decimal_GT = !!!!!!Wert ist gr\u00f6\u00dfer als der zul\u00e4ssige H\u00f6chstwert von {0} +Type_Specific_Checks_DT_Decimal_LT = !!!!!!Wert ist kleiner als der zul\u00e4ssige Mindestwert von {0} +Type_Specific_Checks_DT_Decimal_Range = Der Wert ''{0}'' liegt au\u00dferhalb des Bereichs der \u00fcblicherweise/vern\u00fcnftig unterst\u00fctzten Dezimalzahlen. +Type_Specific_Checks_DT_Decimal_Valid = Der Wert ''{0}'' ist kein g\u00fcltiger Dezimalwert. +Type_Specific_Checks_DT_ID_Valid = id-Wert ''{0}'' ist nicht g\u00fcltig +Type_Specific_Checks_DT_Identifier_System = Identifier.system muss eine absolute Referenz sein, nicht eine lokale Referenz +Type_Specific_Checks_DT_Instant_Valid = Ung\u00fcltige Instant ({0}) +Type_Specific_Checks_DT_Integer64_Valid = Der Wert ''{0}'' ist keine g\u00fcltige integer64 +Type_Specific_Checks_DT_Integer_GT = !!!!!!Wert gr\u00f6\u00dfer als der zul\u00e4ssige Maximalwert von {0} +Type_Specific_Checks_DT_Integer_LT = !!!!!!Wert ist kleiner als der zul\u00e4ssige Mindestwert von {0} +Type_Specific_Checks_DT_Integer_LT0 = Wert ist kleiner als der zul\u00e4ssige Mindestwert von 0 +Type_Specific_Checks_DT_Integer_LT1 = Wert kleiner ist als der zul\u00e4ssige Mindestwert von 1 +Type_Specific_Checks_DT_Integer_Valid = Der Wert ''{0}'' ist keine g\u00fcltige ganze Zahl. +Type_Specific_Checks_DT_OID_Start = OIDs m\u00fcssen mit urn:oid: beginnen +Type_Specific_Checks_DT_OID_Valid = OIDs m\u00fcssen g\u00fcltig sein +Type_Specific_Checks_DT_Primitive_Length = Wert l\u00e4nger als die zul\u00e4ssige Maximall\u00e4nge von {0} +Type_Specific_Checks_DT_Primitive_NotEmpty = @value kann nicht leer sein +Type_Specific_Checks_DT_Primitive_Regex = Elementwert ''{0}'' entspricht nicht der Regex ''{1}''. +Type_Specific_Checks_DT_Primitive_Regex_Type = Elementwert ''{0}'' entspricht nicht der Regex {1} ''{2}'' +Type_Specific_Checks_DT_Primitive_ValueExt = Primitive Typen m\u00fcssen einen Wert, oder child Extensions haben +Type_Specific_Checks_DT_Primitive_WS = Primitive Typen sollten nicht nur aus Leerzeichen bestehen +Type_Specific_Checks_DT_String_Length = Wert ist l\u00e4nger als die zul\u00e4ssige Maximall\u00e4nge von 1 MB (1048576 Bytes) +Type_Specific_Checks_DT_String_WS = Wert sollte nicht mit Leerzeichen beginnen oder enden +Type_Specific_Checks_DT_String_WS_ALL = Wert sollte nicht nur aus Leerzeichen bestehen ''{0}'' +Type_Specific_Checks_DT_Time_Valid = Keine g\u00fcltige Zeit ({0}) +Type_Specific_Checks_DT_URI_OID = URI-Werte k\u00f6nnen nicht mit oid: beginnen +Type_Specific_Checks_DT_URI_UUID = URI-Werte k\u00f6nnen nicht mit uuid: beginnen +Type_Specific_Checks_DT_URI_WS = URI-Werte k\u00f6nnen keine Leerzeichen enthalten (''{0}'') +Type_Specific_Checks_DT_URL_Resolve = URL-Wert ''{0}'' l\u00f6st nicht auf +Type_Specific_Checks_DT_UUID_Strat = UUIDs m\u00fcssen mit urn:uuid: beginnen +Type_Specific_Checks_DT_UUID_Valid = UUIDs m\u00fcssen g\u00fcltig und klein geschrieben sein ({0}) +UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = System {0} Property Filter mit op = {1} kann nicht verarbeitet werden +UNABLE_TO_INFER_CODESYSTEM = !!!!!!!!!!!!!!!!Die System-URI konnte f\u00fcr den Code {0} im ValueSet {1} nicht ermittelt werden +UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = Die Inhaltsreferenz {0} auf Element {1} (Pfad = {2}) kann in diesem Kontext nicht aufgel\u00f6st werden +UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = Das Codesystem {1}, auf das sich das ValueSet {0} bezieht, verf\u00fcgt \u00fcber eine Grammatik, und der Code k\u00f6nnte darin g\u00fcltig sein +UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = !!Die Unicode-Sequenz enth\u00e4lt bidirektionale Steuerzeichen, die in diesem Zusammenhang nicht zul\u00e4ssig sind: {1} +UNICODE_BIDI_CONTROLS_CHARS_MATCH = !!Die Unicode-Sequenz hat unterminierte bi-di Steuerzeichen (siehe CVE-2021-42574): {1} +UNKNOWN_CODESYSTEM = !!!!!!!!Das CodeSystem {0} ist unbekannt +UNKNOWN_CODESYSTEM_VERSION = !!Das CodeSystem {0} Version {1} ist unbekannt. G\u00fcltige Versionen: {2} +UNRECOGNISED_PROPERTY_TYPE = Ung\u00fcltiger JSON-Typ {0} f\u00fcr das Element {1}; g\u00fcltige Typen = {2} +UNRECOGNISED_PROPERTY_TYPE_WRONG = Ung\u00fcltiger Typ {2} f\u00fcr das Element {1}; g\u00fcltige Typen = {3}, JSON-Typ = {0} +UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Nicht unterst\u00fctzt: keine Properties mit Werten gefunden auf Typ {2} f\u00fcr Pattern des Diskriminators ({0}) f\u00fcr Slice {1} +UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Nicht unterst\u00fctzte Eigenschaft {3} auf Typ {2} f\u00fcr Pattern des Diskriminators ({0}) f\u00fcr Slice {1} +Unable_to_connect_to_terminology_server = !!Verbindung zum Terminologieserver kann nicht hergestellt werden. Fehler = {0} +Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = !!Keine Verbindung zum Terminologieserver m\u00f6glich. Verwenden Sie den Parameter ''-tx n/a'' um ohne Verwendung von Terminologiediensten zu laufen welche LOINC, SNOMED, ICD-X usw. zu validieren. Fehler = {0} +Unable_to_find__resolving_discriminator__from_ = Kann keinen {0} aufl\u00f6senden Diskriminator {1} von {2} finden +Unable_to_find_base__for_ = Basis {0} f\u00fcr {1} konnte nicht gefunden werden +Unable_to_find_base_definition_for_logical_model__from_ = Es konnte keine base definition f\u00fcr das logical model gefunden werden: {0} von {1} +Unable_to_find_element_ = Element {0} kann nicht gefunden werden +Unable_to_find_element__in_ = Element {0} in {1} konnte nicht gefunden werden +Unable_to_find_element_with_id_ = Element mit der Id ''{0}'' konnte nicht gefunden werden +Unable_to_find_profile__at_ = Das Profil ''{0}'' konnte bei {1} nicht gefunden werden. +Unable_to_find_resourceType_property = ResourceType-Property kann nicht gefunden werden +Unable_to_find_resource__at__resolving_discriminator__from_ = Ressource {0} bei {1} nicht auffindbar, Diskriminator {2} von {3} +Unable_to_handle_system__concept_filter_with_op__ = System {0} concept filter mit op = {1} nicht verarbeitbar +Unable_to_handle_system__filter_with_property__ = System {0} Filter mit der Eigenschaft = {1} kann nicht verarbeitet werden. +Unable_to_locate_the_profile__in_order_to_validate_against_it = Das Profil ''{0}'' konnte nicht gefunden werden um gegen dieses validieren zu k\u00f6nnen +Unable_to_process_request_for_resource_for___ = Anforderung einer Ressource f\u00fcr {0} / {1} kann nicht verarbeitet werden +Unable_to_resolve_ = Nicht aufl\u00f6sbar {0} +Unable_to_resolve_actual_type_ = Kann den tats\u00e4chlichen Typ nicht aufl\u00f6sen {0} +Unable_to_resolve_element__in_profile_ = Element {0} im Profil {1} kann nicht aufgel\u00f6st werden +Unable_to_resolve_name_reference__at_path_ = Name reference {0} am Pfad {1} kann nicht aufgel\u00f6st werden +Unable_to_resolve_profile__in_element_ = Profil {0} im Element {1} kann nicht aufgel\u00f6st werden +Unable_to_resolve_reference_to_ = Kann den Verweis auf {0} nicht aufl\u00f6sen +Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Slice-Matching kann nicht aufgel\u00f6st werden - kein fester Wert oder erforderliches ValueSet +Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Slice-Matching kann nicht aufgel\u00f6st werden - Slice-Matching nach ValueSet nicht implementiert +Unable_to_resolve_system__no_value_set = System nicht aufl\u00f6sbar - kein ValueSet +Unable_to_resolve_system__value_set_expansion_has_multiple_systems = !!System nicht aufl\u00f6sbar - Extension des ValueSets enth\u00e4lt mehrere Systeme +Unable_to_resolve_system__value_set_has_imports = !!System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt Importe +Unable_to_resolve_system__value_set_has_include_with_filter = !!!!System kann nicht aufgel\u00f6st werden - ValueSet {0} include #{1} hat einen Filter auf System {2} +Unable_to_resolve_system__value_set_has_include_with_no_system = System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt Include ohne System +Unable_to_resolve_system__value_set_has_include_with_unknown_system = !!System kann nicht aufgel\u00f6st werden - ValueSet {0} include #{1} hat System {2}, das unbekannt ist, und der Server liefert Fehler {3} +Unable_to_resolve_system__value_set_has_multiple_matches = !!System kann nicht aufgel\u00f6st werden - ValueSet-Expansion der Wertemenge hat mehrere \u00dcbereinstimmungen: {0} +Unable_to_resolve_system__value_set_has_no_includes_or_expansion = !!System nicht aufl\u00f6sbar - ValueSet enth\u00e4lt keine Includes oder Extensions +Unable_to_resolve_value_Set_ = !!ValueSet {0} kann nicht gefunden werden +Unable_to_validate_code_without_using_server = Code kann ohne Verwendung des Servers nicht validiert werden +Undefined_attribute__on__for_type__properties__ = Undefiniertes Attribut ''@{0}'' auf {1} f\u00fcr Typ {2} (properties = {3}) +Undefined_element_ = !!Undefiniertes Element ''{0}'' +Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Unerwartete condition in Differential: type-slice.type-list.size() == 10 und impliziter Slice-Name enth\u00e4lt keinen g\u00fcltigen Typ (''{0}''?) bei {1}/{2} +Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Unerwartete condition im Differential: typ-slice.typ-list.size() != 1 bei {0}/{1} +Unexpected_datatype_for_rdfstype = Unerwarteter Datentyp f\u00fcr rdfs:type +Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Ungekl\u00e4rte Situation: Ressource ist f\u00fcr mehr als eine Option profiliert - kann das passende Profil nicht bestimmen +Unknown_Code_in = Unbekannter Code {0} in {1} +Unknown_Code_in_Version = Unbekannter Code {0} in {1} Version {2} +Unknown_Data_format_ = Unbekanntes Datenformat ''{0}'' +Unknown_Date_format_ = Unbekanntes Datumsformat ''{0}'' +Unknown_resource_type_missing_rdfstype = Unbekannter Ressourcentyp (fehlender rdfs:typ) +Unknown_type__at_ = Unbekannter Typ {0} bei {1} +Unrecognised_extension_context_ = !!Unerkannter Erweiterungskontext {0} +Unrecognised_predicate_ = !!Nicht anerkanntes predicate ''{0}'' +Unrecognised_property_ = Nicht erkannte Property ''@{0}'' +Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Nicht unterst\u00fctztes CodeableConcept Pattern - Extensions sind nicht zul\u00e4ssig - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} +Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Nicht unterst\u00fctztes CodeableConcept Pattern - muss mindestens eine Coding haben - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} +Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Nicht unterst\u00fctztes CodeableConcept Pattern - unter Verwendung von Text - f\u00fcr Diskriminator({0}) f\u00fcr Scheibe {1} +Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Nicht unterst\u00fctztes Identifier Pattern - Extensions sind nicht erlaubt - f\u00fcr Diskriminator({0}) f\u00fcr Slice {1} +Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Nicht unterst\u00fctzter fixed Pattern Type f\u00fcr Diskriminator({0}) f\u00fcr Slice {1}: {2} +Unsupported_fixed_value_type_for_discriminator_for_slice__ = Nicht unterst\u00fctzter fixed value type f\u00fcr Diskriminator({0}) f\u00fcr Slice {1}: {2} +Unsupported_version_R1 = Nicht unterst\u00fctzte Version R1 +Unsupported_version_R2 = Nicht unterst\u00fctzte Version R2 +Unsupported_version_R2B = Nicht unterst\u00fctzte Version R2B +Unxpected_internal_condition__no_source_on_diff_element = Unerwarteter interner Zustand - keine Source auf dem diff-Element definiert +VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = Globale Profilreferenz ''{0}'' von IG {1} konnte nicht aufgel\u00f6st werden, wurde also nicht gepr\u00fcft +VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Ung\u00fcltige Einschr\u00e4nkung im Profil {0} am Pfad {1} - kann nicht auf Typ {2} von Basistypen {3} eingeschr\u00e4nkt werden +VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = Profil {1} identifiziert {2} als Abh\u00e4ngigkeit (mit der Erweiterung http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), aber dieses Profil konnte nicht gefunden werden +VALIDATION_VAL_PROFILE_OTHER_VERSION = Profil ist f\u00fcr eine andere Version von FHIR ({0}) und wurde daher ignoriert +VALIDATION_VAL_PROFILE_SIGNPOST = Ressource gegen Profil {0} validieren +VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Ressource gegen Profil validieren +VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Validierung der Ressource anhand des Profils {0}, das als Bundle-Parameter angegeben wird +VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Ressource gegen Profil {0} validieren (per http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) +VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Ressource gegen Profil {0} validieren - ein globales Profil in {1} +VALIDATION_VAL_PROFILE_SIGNPOST_META = Ressource gegen Profil {0} validieren (per Meta) +VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profil f\u00fcr diese Version von FHIR - alles OK +VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profil ist f\u00fcr diese Version von FHIR, aber ist ein ung\u00fcltiger Typ {0} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = !!Die Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, da sie unbekannt ist, und das Abrufen f\u00fchrte zu dem Fehler {1} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = !!Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, da sie unbekannt ist, und der Host {1} kann nicht gefunden werden +VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = !!Die Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, weil sie unbekannt ist und der Validator so eingestellt ist, dass er keine unbekannten Profile abruft. +VALUESET_EXAMPLE_SYSTEM_ERROR = Beispiel System ''{0}'' angegeben, was nicht zul\u00e4ssig ist. Konzepte und Filter k\u00f6nnen nicht gepr\u00fcft werden +VALUESET_EXAMPLE_SYSTEM_HINT = Beispiel System ''{0}'' angegeben, so dass Konzepte und Filter nicht \u00fcberpr\u00fcft werden k\u00f6nnen +VALUESET_IMPORT_UNION_INTERSECTION = Dieser Wertesatz hat ein einzelnes Include mit mehreren importierten Wertes\u00e4tzen. Unter https://jira.hl7.org/browse/FHIR-25179 gab es in der Vergangenheit Verwirrung dar\u00fcber, ob es sich bei diesen Wertes\u00e4tzen um einen Zusammenschluss oder eine \u00dcberschneidung handelt. Wenn dieser Wertesatz in einem Paket enthalten ist, das vor dem 31. M\u00e4rz 2022 ver\u00f6ffentlicht wurde, wird er als Vereinigung behandelt, andernfalls als Schnittmenge. Wenn Sie eine Vereinigung w\u00fcnschen, teilen Sie die Importe der Wertemenge auf mehrere Includes auf +VALUESET_INCLUDE_INVALID_CONCEPT_CODE = !!Der Code {1} ist im System {0} nicht g\u00fcltig +VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = !!Der Code {2} ist im System {0} Version {1} nicht g\u00fcltig +VALUESET_NO_SYSTEM_WARNING = !!Kein System angegeben, daher k\u00f6nnen Konzepte und Filter nicht \u00fcberpr\u00fcft werden +VALUESET_REFERENCE_INVALID_TYPE = Der ValueSet-Import {0} verweist auf eine Ressource des Typs {1}, die nicht g\u00fcltig ist +VALUESET_REFERENCE_UNKNOWN = Der ValueSet-Import {0} konnte nicht gefunden werden und kann daher nicht \u00fcberpr\u00fcft werden +VALUESET_SHAREABLE_EXTRA_MISSING = !!Das ShareableValueSet-Profil empfiehlt, dass das Element {0} gef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte ValueSets SOLLTEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen +VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = !!!!Das ShareableValueSet-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published ValueSets M\u00dcSSEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen +VALUESET_SHAREABLE_MISSING = !!Das ShareableValueSet-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte ValueSets SOLLTEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen +VALUESET_SHAREABLE_MISSING_HL7 = !!!!Das ShareableValueSet-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published ValueSets M\u00dcSSEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen +VALUESET_TOO_COSTLY = !!Das ValueSet {0} hat zu viele Codes f\u00fcr die Anzeige ({1}) +VALUESET_UNC_SYSTEM_WARNING = Unbekanntes System ''{0}'' angegeben, daher k\u00f6nnen Konzepte und Filter nicht gepr\u00fcft werden (Details: {1}) +VALUESET_UNC_SYSTEM_WARNING_VER = Unbekanntes System/Version ''{0}'' angegeben, daher k\u00f6nnen Konzepte und Filter nicht gepr\u00fcft werden (Details: {1}) +Validation_BUNDLE_Message = Der erste Eintrag in einer Nachricht muss ein MessageHeader sein +Validation_VAL_Content_Unknown = !!Unerkannter Inhalt {0} +Validation_VAL_NoType = Unbekannter Typ {0} +Validation_VAL_Profile_MatchMultiple = Profil {0}, Element stimmt mit mehr als einem Slice \u00fcberein - {1}, {2} +Validation_VAL_Profile_Maximum_one = {3}: maximal erlaubt = {7}, aber gefunden {0} +Validation_VAL_Profile_Maximum_other = {3}: maximal erlaubt = {7}, aber gefunden {0} +Validation_VAL_Profile_Minimum_one = {3}: mindestens erforderlich = {7}, aber nur gefunden {0} +Validation_VAL_Profile_Minimum_other = {3}: mindestens erforderlich = {7}, aber nur gefunden {0} +Validation_VAL_Profile_MultipleMatches_one = Es wurden mehrere passende Profile unter den Auswahlm\u00f6glichkeiten gefunden: {1} +Validation_VAL_Profile_MultipleMatches_other = Es wurden mehrere passende Profile unter den Auswahlm\u00f6glichkeiten gefunden: {1} +Validation_VAL_Profile_NoCheckMax_one = {1}: Kann die maximal zul\u00e4ssige Anzahl ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen. +Validation_VAL_Profile_NoCheckMax_other = {1}: Kann die maximal zul\u00e4ssige Anzahl ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen. +Validation_VAL_Profile_NoCheckMin_one = {1}: Kann das erforderliche Minimum ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen +Validation_VAL_Profile_NoCheckMin_other = {1}: Kann das erforderliche Minimum ({1}) aufgrund fehlender Slicing-Validierung nicht \u00fcberpr\u00fcfen +Validation_VAL_Profile_NoDefinition = Keine Definition f\u00fcr Ressourcentyp ''{0}'' gefunden +Validation_VAL_Profile_NoMatch = Es ist nicht m\u00f6glich, ein passendes Profil unter den Kandidaten zu finden: {0} +Validation_VAL_Profile_NoSnapshot = StructureDefinition hat keinen Snapshot - die Validierung erfolgt gegen den Snapshot, daher muss dieser bereitgestellt werden +Validation_VAL_Profile_NoType = !!Der Typ des Elements {0} ist nicht bekannt, was illegal ist. G\u00fcltige Typen an dieser Stelle sind {1} +Validation_VAL_Profile_NotAllowed = Dieses Element wird durch das Profil {0} nicht erlaubt. +Validation_VAL_Profile_NotSlice = Dieses Element stimmt mit keinem bekannten Slice {0} \u00fcberein, und das Slicing ist CLOSED: {1} +Validation_VAL_Profile_OutOfOrder = Durch das Profil {0} angegeben, ist das Element ''{1}'' au\u00dferhalb der definierten Reihenfolge. +Validation_VAL_Profile_SliceOrder = Durch das Profil {0} spezifiziert, ist das Element ''{1}'' an der falschen Stelle im ordered slicee enthalten +Validation_VAL_Profile_Unknown = !!Profil Reference ''{0}'' konnte nicht aufgel\u00f6st werden, wurde also nicht \u00fcberpr\u00fcft +Validation_VAL_Profile_WrongType = Angegebener Profiltyp war ''{0}'', aber gefundener Typ ''{1}''. +Validation_VAL_Profile_WrongType2 = Typ\u00fcbereinstimmungsfehler bei der Verarbeitung von Profil {0} an Pfad {1}: Der Elementtyp ist {4}, aber das Profil {3} ist f\u00fcr einen anderen Typ {2} +Validation_VAL_Unknown_Profile = Unbekanntes Profil {0} +Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Versionsabweichung. Der Kontext hat die Version {0} geladen, und der neu geladene Inhalt ist die Version {1}. +Wrong_namespace__expected_ = Falscher Namensraum - erwartet ''{0}'' +Wrong_type_for_resource = Falscher Typ f\u00fcr Ressource +XHTML_URL_DATA_DATA_INVALID = Die Daten sollten g\u00fcltige base64-Inhalte sein: URL: {0} +XHTML_URL_DATA_DATA_INVALID_COMMA = Komma im Datenteil der Daten-URL gefunden: {0} +XHTML_URL_DATA_MIMETYPE = Der Mimetyp-Teil der Daten: URL ist nicht g\u00fcltig ({1}) in URL: {0} +XHTML_URL_DATA_NO_DATA = Keine Daten in den Daten gefunden: URL +XHTML_URL_EMPTY = URL ist leer +XHTML_URL_INVALID = Die URL ist nicht g\u00fcltig, weil ''({1})'': {0} +XHTML_URL_INVALID_CHARS_one = URL enth\u00e4lt ung\u00fcltiges Zeichen ({1}) +XHTML_URL_INVALID_CHARS_other = URL enth\u00e4lt {0} ung\u00fcltige Zeichen ({1}) +XHTML_XHTML_Attribute_Illegal = Unzul\u00e4ssiger Attributname in XHTML (''{0}'' auf ''{1}'') +XHTML_XHTML_DOCTYPE_ILLEGAL = Fehlerhaftes XHTML: Es wurde eine DocType-Deklaration gefunden, die nicht zul\u00e4ssig ist (Schutz vor XXE-Sicherheitsl\u00fccken) +XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = !!Ung\u00fcltiger Elementname innerhalb eines Absatzes im XHTML (''{0}'') +XHTML_XHTML_Element_Illegal = Unzul\u00e4ssiger Elementname im XHTML (''{0}'') +XHTML_XHTML_Entity_Illegal = Ung\u00fcltige Entit\u00e4t in XHTML (''{0}'') +XHTML_XHTML_Image_Reference_Illegal = Ung\u00fcltiger Bildverweis in XHTML (''{0}'') +XHTML_XHTML_NS_InValid = Falscher Namensraum im XHTML (''{0}'', sollte ''{1}'' sein) +XHTML_XHTML_Name_Invalid = Falscher Name im XHTML (''{0}'') - muss mit div beginnen +_DT_Fixed_Wrong = !!Der Wert ist ''{0}'', muss aber ''{1}'' sein. +_has_children__and_multiple_types__in_profile_ = {0} hat children ({1}) und mehrere Typen ({2}) im Profil {3} +_has_children__for_type__in_profile__but_cant_find_type = {0} hat children ({1}) f\u00fcr den Typ {2} im Profil {3}, kann aber den Typ nicht finden +_has_no_children__and_no_types_in_profile_ = {0} hat keine Kinder ({1}) und keine Typen im Profil {2} +defined_in_the_profile = im Profil definiert documentmsg = (document) -Bad_file_path_error=\n********************\n* Der \u00fcbergebene Dateiname ''{0}'' existiert nicht im lokalen Dateisystem.\n* Bitte \u00fcberpr\u00fcfen Sie, ob dies ein g\u00fcltiger Pfad f\u00fcr die Datei ist.\n********************\n\n -SD_NO_TYPE_CODE_ON_CODE=Snapshot f\u00fcr {1} Element {0} enth\u00e4lt type.code ohne Wert -CONCEPTMAP_GROUP_TARGET_INCOMPLETE=Zielcodesystem {0} hat nicht alle Inhalte (Inhalt = {1}), daher k\u00f6nnen die Codes nicht gepr\u00fcft werden -CONCEPTMAP_GROUP_SOURCE_INCOMPLETE=Das Quellcode-System {0} hat nicht alle Inhalte (Inhalt = {1}), so dass die Codes nicht gepr\u00fcft werden k\u00f6nnen. -SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE=Die Gruppe {0} wurde bereits mit anderen Parametern verwendet, so dass die Typpr\u00fcfung falsch sein kann (other = [{1}]; this = [{2}]) -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM=Das System {0} ist unbekannt, daher k\u00f6nnen die Codes nicht \u00fcberpr\u00fcft werden. -CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID=Der Code {0} ist im System {1} ung\u00fcltig -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM=Da kein System zur Verf\u00fcgung gestellt wurde, kann kein reiner Code verwendet werden. -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH=Der Typ dieser Eigenschaft sollte {1} und nicht {0} sein. -CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID=Der Propertycode ''{0}'' ist nicht bekannt -CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID=Target display ''{0}'' ist nicht g\u00fcltig. M\u00f6gliche Codes {1} -CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID=Source display ''{0}'' ist nicht g\u00fcltig. M\u00f6gliche Codes {1} -CONCEPTMAP_GROUP_SOURCE_CODE_INVALID=Der Quell-Code ''{0}'' ist im Codesystem {1} nicht g\u00fcltig -CONCEPTMAP_GROUP_TARGET_UNKNOWN=Unbekanntes Zielcodesystem {0}, daher k\u00f6nnen die Zielcodes nicht \u00fcberpr\u00fcft werden -CONCEPTMAP_GROUP_TARGET_MISSING=Kein Target Code System, daher k\u00f6nnen die Quellcodes nicht \u00fcberpr\u00fcft werden -CONCEPTMAP_GROUP_SOURCE_UNKNOWN=Unbekanntes Quellcode-System {0}, daher k\u00f6nnen die Quellcodes nicht \u00fcberpr\u00fcft werden -CONCEPTMAP_GROUP_SOURCE_MISSING=Kein Quell-Code-System, daher k\u00f6nnen die Quell-Codes nicht \u00fcberpr\u00fcft werden -SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG=Die Map erzeugt einen oder mehrere Codes, die in der Ziel-Wertemenge nicht enthalten sind: {0} -SM_TARGET_TRANSLATE_BINDING_VSE_TARGET=Es gab einen Fehler bei der Expansion des ValueSets, so dass diese Concept Map nicht gepr\u00fcft werden kann: ''{0}'' -SM_TARGET_TRANSLATE_BINDING_VS_TARGET=Die Zielvariable verweist auf ein unbekanntes ValueSet ''{0}'', so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann -SM_TARGET_TRANSLATE_BINDING_TARGET=Die Zielvariable hat kein required binding, daher kann diese Concept Map nicht gepr\u00fcft werden -SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED=Der Quell-ValueSet enth\u00e4lt einen oder mehrere Codes, die von der Map nicht \u00fcbersetzt werden: {0} -CONCEPTMAP_GROUP_TARGET_CODE_INVALID=Der Zielcode ''{0}'' ist im Codesystem {1} nicht g\u00fcltig -SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE=Es gab einen Fehler beim Erweitern des ValueSets der Quelle, so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann: ''{0}'' -SM_TARGET_TRANSLATE_BINDING_VS_SOURCE=Die Quellvariable verweist auf ein unbekanntes ValueSet ''{0}'', so dass diese Concept Map nicht \u00fcberpr\u00fcft werden kann -SM_TARGET_TRANSLATE_BINDING_SOURCE=Die Quellvariable hat kein required binding, daher kann diese Concept Map nicht \u00fcberpr\u00fcft werden -SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE=Der Wert ''{0}'' des Ausgabeparameters ist falsch -SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND=Die map_uri ''{0}'' konnte nicht aufgel\u00f6st werden, daher kann die Map nicht gepr\u00fcft werden -SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE=Die Quellvariable {0} ist unbekannt -SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM=Kein Wert f\u00fcr den Parameter {0} gefunden -SM_TARGET_TRANSFORM_MISSING_PARAMS=Ein oder mehrere Parameter f\u00fcr den \u00dcbersetzungsvorgang fehlen (sollte 3 sein, war {0}) -SM_MATCHING_RULEGROUP_NOT_FOUND=Es konnte keine Standardregel f\u00fcr das Typenpaar source={0} und target={1} gefunden werden. -SM_TARGET_TYPE_NOT_FOUND=Es wurde kein Zieltyp gefunden, so dass die Standardgruppe f\u00fcr diese implizit abh\u00e4ngige Regel nicht bestimmt werden konnte -SM_SOURCE_TYPE_NOT_FOUND=Es wurde kein Quelltyp gefunden, so dass die Standardgruppe f\u00fcr diese implizit abh\u00e4ngige Regel nicht ermittelt werden konnte. -SM_ORPHAN_GROUP=Die Gruppe {0} wird nicht von diesem Mapping-Skript aus aufgerufen und hat keine Typen f\u00fcr ihre Inputs definiert, so dass eine Typenpr\u00fcfung nicht m\u00f6glich ist -SM_DEPENDENT_PARAM_TYPE_MISMATCH=Der Parameter ''{0}'' bezieht sich auf die Variable ''{1}'', aber ihr Typ ist ''{2}'', was nicht mit dem f\u00fcr die Gruppe ''{3}'' erforderlichen Typ ''{4}'' (aus Map ''{5}'') vereinbar ist -SM_DEPENDENT_PARAM_MODE_MISMATCH=Der Parameter {0} bezieht sich auf die Variable {1}, aber ihr Modus ist {2}, was nicht mit dem f\u00fcr die Gruppe {3} erforderlichen Modus \u00fcbereinstimmt. -SM_TARGET_TYPE_MULTIPLE_POSSIBLE=Hier sind mehrere Typen m\u00f6glich ({0}), so dass eine weitere Typenpr\u00fcfung nicht m\u00f6glich ist -SM_IMPORT_NOT_FOUND=Es wurden keine Maps gefunden, die mit {0} \u00fcbereinstimmen - die Validierung k\u00f6nnte falsch sein -SM_TARGET_TRANSFORM_EXPRESSION_ERROR=Der als Evaluierungsparameter \u00fcbergebene FHIRPath-Ausdruck ist ung\u00fcltig: {0} -SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE=Der Parameter bei Index {0} konnte nicht verarbeitet werden (Typ = {1}) -SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE=Der Wert des Typparameters f\u00fcr {0} konnte nicht verarbeitet werden -SM_TARGET_NO_TRANSFORM_NO_CHECKED=Wenn es keine Transformation gibt, k\u00f6nnen keine Parameter angegeben werden. -SM_TARGET_TRANSFORM_NOT_CHECKED=Transformation {0} noch nicht \u00fcberpr\u00fcft -SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE=Transformation {0} ben\u00f6tigt {1} Parameter, aber {2} wurden gefunden -SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE=Transformation {0} ben\u00f6tigt {1}-{2} Parameter, aber {3} wurden gefunden -SM_SOURCE_TYPE_INVALID=Der Typ {0} ist im Quellkontext {1} nicht g\u00fcltig. Die m\u00f6glichen Typen sind [{2}] -SM_TARGET_PATH_MULTIPLE_MATCHES=Der Zielpfad {0}.{1} verweist auf den Pfad {2}, der ein Verweis auf mehrere Elemente ({3}) sein k\u00f6nnte. Es kann keine weitere Pr\u00fcfung durchgef\u00fchrt werden -SM_RULE_SOURCE_UNASSIGNED=Die Source-Anweisung weist der Source keine Variable zu - \u00fcberpr\u00fcfen Sie, ob dies beabsichtigt ist -SM_LIST_RULE_ID_ONLY_WHEN_SHARE=Eine ruleId sollte nur angegeben werden, wenn der Regel-Modus ''share'' ist. -SM_NO_LIST_RULE_ID_NEEDED=Eine Liste ruleId sollte nicht angegeben werden, da es sich um eine Regel handelt, die nur einmal ausgef\u00fchrt werden kann -SM_NO_LIST_MODE_NEEDED=Ein List-Modus sollte nicht angegeben werden, da es sich um eine Regel handelt, die nur einmal ausgef\u00fchrt werden kann -SM_TARGET_PATH_INVALID=Der Zielpfad {0}.{1} bezieht sich auf den Pfad {2}, der unbekannt ist -SM_TARGET_CONTEXT_UNKNOWN=Der Zielkontext ''{0}'' ist zu diesem Zeitpunkt nicht bekannt -SM_RULE_SOURCE_LISTMODE_REDUNDANT=Der listMode-Wert von {0} ist \u00fcberfl\u00fcssig, da der g\u00fcltige Maximalwert {0} ist. -SM_RULE_SOURCE_MAX_REDUNDANT=Der Maximalwert von {0} ist \u00fcberfl\u00fcssig, da der g\u00fcltige Maximalwert {0} ist. -SM_RULE_SOURCE_MIN_REDUNDANT=Der Mindestwert von {0} ist \u00fcberfl\u00fcssig, da der g\u00fcltige Mindestwert {0} ist. -SM_SOURCE_PATH_INVALID=Der Quellpfad {0}.{1} bezieht sich auf den Pfad {2}, der unbekannt ist -SM_SOURCE_CONTEXT_UNKNOWN=Der Quellkontext {0} ist zu diesem Zeitpunkt nicht bekannt -SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE=Der Typ {0} ist nicht bekannt, daher k\u00f6nnen die Pfade nicht validiert werden -SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE=Der Typ {0}, der der Canonical URL {1} entspricht, ist nicht bekannt, so dass die Pfade nicht validiert werden k\u00f6nnen -SM_GROUP_INPUT_MODE_MISMATCH=Der Typ {0} hat den Modus {1}, der nicht mit der Strukturdefinition {2} \u00fcbereinstimmt. -SM_GROUP_INPUT_TYPE_NOT_DECLARED=Der Typ {0} ist nicht deklariert und ist unbekannt -SM_GROUP_INPUT_NO_TYPE=Der Gruppenparameter {0} hat keinen Typ, daher k\u00f6nnen die Pfade nicht validiert werden -SM_GROUP_INPUT_MODE_INVALID=Der Gruppenparameter {0} Modus {1} ist nicht g\u00fcltig -SM_GROUP_INPUT_DUPLICATE=Der Name {0} wird bereits verwendet -BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED=Mit Ausnahme von Transaktionen und Batches muss jeder Eintrag in einem Bundle eine FullUrl haben, die die Identit\u00e4t der Ressource im Entry repr\u00e4sentiert -Bundle_BUNDLE_Entry_NoProfile_TYPE=Kein Profil f\u00fcr {0} Ressource des Typs ''{1}'' gefunden -Bundle_BUNDLE_Entry_NoProfile_EXPL=Angegebenes Profil {2} nicht gefunden f\u00fcr {0} Ressource des Typs ''{0}'' -Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL=Angegebenes logisches Modell {1} nicht gefunden f\u00fcr Ressource ''Binary/{0}'' -Bundle_BUNDLE_Entry_Orphan_MESSAGE=Eintrag {0} ist nicht \u00fcber Links (vorw\u00e4rts oder r\u00fcckw\u00e4rts) vom MessageHeader aus erreichbar, daher sollte sein Vorhandensein \u00fcberpr\u00fcft werden (wird er zur Verarbeitung der Nachricht ben\u00f6tigt?) -Bundle_BUNDLE_Entry_Orphan_DOCUMENT=Der Eintrag {0} ist nicht erreichbar, wenn man von der Zusammensetzung aus Links (vorw\u00e4rts oder r\u00fcckw\u00e4rts) durchl\u00e4uft -BUNDLE_BUNDLE_ENTRY_REVERSE_R4=Der Eintrag {0} ist nicht erreichbar, wenn man von der Komposition aus vorw\u00e4rts traversiert. Nur Provenance ist f\u00fcr diese Art der Verwendung zugelassen (R4 Abschnitt 3.3.1) -BUNDLE_BUNDLE_ENTRY_REVERSE_R5=Der Eintrag {0} ist nicht erreichbar, wenn man von der Komposition aus vorw\u00e4rts traversiert. Pr\u00fcfen Sie, ob dieser Eintrag direkt von der Komposition aus verlinkt werden sollte, wenn es sich um eine Quelle f\u00fcr narrative Inhalte handelt -BUNDLE_BUNDLE_ENTRY_REVERSE_MSG=Eintrag {0} ist nicht erreichbar, wenn man vom MessageHeader aus vorw\u00e4rts traversiert. Pr\u00fcfen Sie, ob dieser Eintrag enthalten sein soll (f\u00fcr die Verarbeitung der Nachricht erforderlich) -CODESYSTEM_CS_VS_EXP_MISMATCH=CodeSystem {0} hat ein ''all system'' ValueSet von {1}, aber es ist eine Expansion mit der falschen Anzahl von Konzepten (gefunden {2}, erwartet {3}) -Extension_EXTP_Context_Wrong=Die Extension {0} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist {2}) -Extension_EXTM_Context_Wrong=Die Modifier Extension {0} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist {2}) -Extension_EXT_Simple_ABSENT=Die Definition der Extension ''{0}'' entspricht einer einfachen Extension und muss daher einen Wert enthalten -Extension_EXT_Simple_WRONG=Die Definition der Extension ''{0}'' entspricht einer einfachen Extension, sie muss also einen Wert enthalten, keine Extension -Measure_MR_M_None=Es wird keine ''Measure'' identifiziert, daher kann keine Validierung anhand der ''Measure'' durchgef\u00fchrt werden. -Measure_MR_M_NotFound=Die Measure ''{0}'' konnte nicht aufgel\u00f6st werden, daher kann keine Validierung anhand der Measure durchgef\u00fchrt werden -QUESTIONNAIRE_QR_ITEM_BADOPTION_CS=Der angegebene Code {1} kann im ValueSet der Optionen ({2}) im Fragebogen nicht validiert werden, da das System {0} unbekannt ist -Questionnaire_QR_Item_GroupAnswer=Items, die nicht vom Typ Gruppe sind, sollten keine Items au\u00dferhalb der Antworten haben (verwenden Sie answer.item nicht .item) -REFERENCE_REF_WRONGTARGET_LOAD=Der Typ ''{2}'' ist kein g\u00fcltiges Ziel f\u00fcr das Element {0} (muss {1} sein) -Resource_RES_ID_Malformed_Length=Ung\u00fcltige Ressourcen-ID: Zu lang ({0} Zeichen) -Resource_RES_ID_Malformed_Chars=Ung\u00fcltige Ressourcen-ID: Ung\u00fcltige Zeichen (''{0}'') -Terminology_TX_Code_ValueSet_MISSING=Es wurde kein Code gesetzt, und ein Code aus dem ValueSet ist erforderlich -Terminology_TX_Confirm_4a=Der angegebene Code ({2}) befindet sich nicht im ValueSet {0}, und es wird ein Code aus diesem ValueSet ben\u00f6tigt: {1} -Terminology_TX_Confirm_4b=Die angegebenen Codes ({2}) befinden sich nicht im ValueSet {0}, und es wird ein Code aus diesem ValueSet ben\u00f6tigt: {1} -Terminology_TX_ValueSet_NotFound_CS=Ein Verweis auf ein CodeSystem ({0}) gefunden wo ein ValueSet vorgeschrieben ist -Type_Specific_Checks_DT_Decimal_GT=Wert ist gr\u00f6\u00dfer als der zul\u00e4ssige H\u00f6chstwert von {0} -Type_Specific_Checks_DT_Decimal_LT=Wert ist kleiner als der zul\u00e4ssige Mindestwert von {0} -TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION=Exception evaluating regex ''{0}'' on type {1}: {2} -Type_Specific_Checks_DT_Primitive_Regex_Type=Elementwert ''{0}'' entspricht nicht der Regex {1} ''{2}'' -Type_Specific_Checks_DT_String_WS_ALL=Wert sollte nicht nur aus Leerzeichen bestehen ''{0}'' -Type_Specific_Checks_DT_UUID_Valid=UUIDs m\u00fcssen g\u00fcltig und klein geschrieben sein ({0}) -VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY=Die Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, weil sie unbekannt ist und der Validator so eingestellt ist, dass er keine unbekannten Profile abruft. -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR=Die Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, da sie unbekannt ist, und das Abrufen f\u00fchrte zu dem Fehler {1} -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK=Profilreferenz ''{0}'' wurde nicht gepr\u00fcft, da sie unbekannt ist, und der Host {1} kann nicht gefunden werden -VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED=Profil {1} identifiziert {2} als Abh\u00e4ngigkeit (mit der Erweiterung http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), aber dieses Profil konnte nicht gefunden werden -XHTML_XHTML_Entity_Illegal=Ung\u00fcltige Entit\u00e4t in XHTML (''{0}'') -XHTML_XHTML_Image_Reference_Illegal=Ung\u00fcltiger Bildverweis in XHTML (''{0}'') -Unsupported_version_R2=Nicht unterst\u00fctzte Version R2 -Unsupported_version_R2B=Nicht unterst\u00fctzte Version R2B -OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT=Dieses Objekt kann in Json kein Array mit Schl\u00fcssel sein, da es in den Definitionen keine zwei Kinder hat (Kinder = {0}). -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME=Dieses Objekt ist als Array mit Schl\u00fcssel in Json definiert, aber die Definition nennt nicht das erste Kindelement als Schl\u00fcssel (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE=Dieses Objekt ist in Json als Array mit Schl\u00fcssel definiert, aber die in den Definitionen genannte Schl\u00fcsseleigenschaft entspricht nicht einem primitiven Typ (children = {0}, type = {1}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE=Dieses Objekt ist als Array mit Schl\u00fcssel in Json definiert, aber die in den Definitionen genannte Werteigenschaft ist eine Auswahl - dies wird nicht unterst\u00fctzt (value property = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST=Dieses Objekt ist in Json als Array mit Schl\u00fcssel definiert, aber die in den Definitionen genannte Werteigenschaft ist eine Liste - dies wird nicht unterst\u00fctzt (value property = {0}) -This_property_must_be_a_URI_or_bnode_not_=Diese Eigenschaft muss ein URI oder bnode sein, nicht {0} -This_property_must_be_a_Literal_not_=Diese Eigenschaft muss ein Literal sein, nicht {0} -DUPLICATE_RESOURCE_VERSION=Duplizierte Ressource {0} Version {1} vom Typ {2} -UNABLE_TO_VALIDATE_LOCALLY=Code kann lokal nicht validiert werden: {0} -UNKNOWN_CODE__IN_FRAGMENT=Unbekannter Code ''{0}'' im System ''{1}'' - Beachten Sie, dass das Codesystem als Fragment gekennzeichnet ist, so dass der Code auch in einem anderen Fragment g\u00fcltig sein kann. -None_of_the_provided_codes_are_in_the_value_set_one=Der angegebene Code {2} befindet sich nicht im ValueSet ''{1}'' -None_of_the_provided_codes_are_in_the_value_set_other=Keiner der angegebenen Codes [{2}] befindet sich im ValueSet ''{1}'' -UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__=System {0} Property Filter mit op = {1} kann nicht verarbeitet werden -UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE=Das Codesystem {1}, auf das sich das ValueSet {0} bezieht, verf\u00fcgt \u00fcber eine Grammatik, und der Code k\u00f6nnte darin g\u00fcltig sein -Unable_to_resolve_system__value_set_has_include_with_unknown_system=System kann nicht aufgel\u00f6st werden - ValueSet {0} include #{1} hat System {2}, das unbekannt ist, und der Server liefert Fehler {3} -Unable_to_resolve_system__value_set_has_include_with_filter=System kann nicht aufgel\u00f6st werden - ValueSet {0} include #{1} hat einen Filter auf System {2} -Unable_to_resolve_system__value_set_has_multiple_matches=System kann nicht aufgel\u00f6st werden - ValueSet-Expansion der Wertemenge hat mehrere \u00dcbereinstimmungen: {0} -This_base_property_must_be_an_Array_not_=Diese Basiseigenschaft muss ein Array sein, nicht {0} -xml_attr_value_invalid=Das XML-Attribut {0} enth\u00e4lt ein ung\u00fcltiges Zeichen -xml_encoding_invalid=Die XML-Kodierung ist ung\u00fcltig (muss UTF-8 sein) -xml_stated_encoding_invalid=Die im Header angegebene XML-Kodierung ist ung\u00fcltig (muss ''UTF-8'' sein, wenn angegeben) -XHTML_URL_INVALID=Die URL ist nicht g\u00fcltig, weil ''({1})'': {0} -MEASURE_MR_GRP_NO_CODE=Die Gruppe sollte einen Code haben, der mit der Gruppendefinition der Measure \u00fcbereinstimmt. -MEASURE_MR_GRP_UNK_CODE=Der Code f\u00fcr diese Gruppe hat keine Entsprechung in der Measure- Definition -MEASURE_MR_GRP_DUPL_CODE=Der Code f\u00fcr diese Gruppe wird in einer anderen Gruppe dupliziert -MEASURE_MR_GRP_MISSING_BY_CODE=Der MeasureReport enth\u00e4lt keine Gruppe f\u00fcr die Gruppe ''{0}'' -MEASURE_MR_GRP_NO_USABLE_CODE=Keiner der bereitgestellten Codes kann zum Vergleich herangezogen werden - bei mindestens einem Code werden sowohl System als auch Code ben\u00f6tigt -MEASURE_MR_GRP_NO_WRONG_CODE=Der angegebene Code ({0}) stimmt nicht mit dem im Measure-Report angegebenen Code \u00fcberein ({1}) -DUPLICATE_ID=Doppelter id-Wert ''{0}'' -TERMINOLOGY_TX_SYSTEM_NO_CODE=Ein Code ohne System hat keine definierte Bedeutung. Es sollte ein System angegeben werden -MEASURE_MR_GRP_POP_NO_CODE=Die Gruppe sollte einen Code haben, der mit der Definition der Gruppenpopulation der Measure \u00fcbereinstimmt. -MEASURE_MR_GRP_POP_UNK_CODE=Der Code f\u00fcr diese Populationsgruppe hat keine Entsprechung in der Measuredefinition -MEASURE_MR_GRP_POP_DUPL_CODE=Der Code f\u00fcr diese Populationsgruppe wird in einer anderen Gruppe dupliziert -MEASURE_MR_GRP_POP_MISSING_BY_CODE=Der MeasureReport enth\u00e4lt keine Populationsgruppe f\u00fcr die Populationsgruppe {0} -MEASURE_MR_GRP_POP_COUNT_MISMATCH=Nicht\u00fcbereinstimmung zwischen Z\u00e4hlung {0} und Anzahl der Subjekte {1} -MEASURE_MR_GRP_POP_NO_SUBJECTS=Berichte, deren Typ nicht ''subject-list'' ist, sollten keine Subjekte enthalten -MEASURE_MR_GRP_POP_NO_COUNT=Die Anzahl sollte in Reports vorhanden sein, deren Typ nicht ''subject-list'' ist. -MEASURE_M_NO_GROUPS=Eine Measure sollte mindestens eine Gruppe enthalten -MEASURE_M_GROUP_CODE=Gruppen sollten Codes aufweisen, sofern es mehr als eine Gruppe gibt -MEASURE_M_GROUP_POP=Measure-Gruppen sollten mindestens eine Population enthalten -MEASURE_M_GROUP_STRATA=Measure-Gruppen sollten mindestens einen Stratifier enthalten -MEASURE_M_GROUP_POP_NO_CODE=Eine Measure-Gruppen Population sollte einen Code haben, wenn es mehr als eine Population gibt -MEASURE_M_GROUP_STRATA_NO_CODE=Ein Measure-Group-Stratifier sollte einen Code haben, falls es mehr als eine Population gibt -MEASURE_M_GROUP_STRATA_COMP_NO_CODE=Eine Measure-Group-Komponente sollte einen Code haben, sofern es mehr als eine Population gibt -MEASURE_M_LIB_UNKNOWN=Die Library {0} konnte nicht aufgel\u00f6st werden, so dass die Expression-Validierung m\u00f6glicherweise nicht korrekt ist -TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE=Canonical URLs m\u00fcssen absolute URLs sein, wenn es sich nicht um Fragment-Referenzen handelt ({0}) -TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED=Canonical URLs in contained Ressourcen m\u00fcssen absolute URLs sein ({0}) -MEASURE_MR_SCORE_PROHIBITED_RT=Kein measureScore, falls der Typ des Berichts ''data-collection'' ist -MEASURE_MR_SCORE_PROHIBITED_MS=Kein measureScore, falls die Bewertung der Nachricht ''Kohorte'' lautet -MEASURE_MR_SCORE_REQUIRED=Ein measureScore ist erforderlich, falls das Measure.scoring={0} -MEASURE_MR_M_SCORING_UNK=Das Scoring-System in dieser Measure ist unbekannt, daher k\u00f6nnen die measureScore-Werte nicht \u00fcberpr\u00fcft werden -MEASURE_MR_SCORE_UNIT_PROHIBITED=Ein measureScore f\u00fcr dieses Measure Scoring ({0}) sollte keine Einheiten enthalten -MEASURE_MR_SCORE_VALUE_REQUIRED=Ein Wert ist erforderlich, da das Measure.scoring = {0} -MEASURE_MR_SCORE_VALUE_INVALID_01=Der Wert ist ung\u00fcltig - er muss zwischen 0 und 1 liegen. -MEASURE_MR_SCORE_FIXED=Dieser Wert wird von der Measure auf ''{0}'' festgelegt. -MEASURE_MR_SCORE_UNIT_REQUIRED=Eine Einheit sollte vorhanden sein, sofern der Typ der Wertung {0} ist. -MEASURE_M_CRITERIA_UNKNOWN=Die Ausdruckssprache {0} wird nicht unterst\u00fctzt und kann daher nicht validiert werden. -MEASURE_M_CQL_NOT_FOUND=Keine der enthaltenen CQL-Bibliotheken definiert eine Funktion {0} -MEASURE_M_CRITERIA_CQL_NO_LIB=Keine CQL-Bibliotheken f\u00fcr diese Measure gefunden -MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB=Falls der CQL-Ausdruck keinen Namespace enth\u00e4lt, darf es nur eine Library f\u00fcr die Measure geben -MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND=Keine passende Bibliothek f\u00fcr den Namespace {0} gefunden -MEASURE_M_CRITERIA_CQL_LIB_DUPL=Mehrere passende Bibliotheken f\u00fcr den Namespace {0} gefunden -MEASURE_M_CRITERIA_CQL_ERROR=Fehler in {0}: ''{1}'' -MEASURE_M_CRITERIA_CQL_NO_ELM=Fehler in {0}: Keine kompilierte Version von CQL gefunden -MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID== Fehler in {0}: Kompilierte Version von CQL ist nicht g\u00fcltig -MEASURE_M_CRITERIA_CQL_NOT_FOUND=Die Funktion {1} existiert nicht in der Bibliothek {0} -XHTML_URL_EMPTY=URL ist leer -XHTML_URL_INVALID_CHARS_one=URL enth\u00e4lt ung\u00fcltiges Zeichen ({1}) -XHTML_URL_INVALID_CHARS_other=URL enth\u00e4lt {0} ung\u00fcltige Zeichen ({1}) -TERMINOLOGY_TX_SYSTEM_HTTPS=Die System-URL ''{0}'' beginnt f\u00e4lschlicherweise mit https: und nicht mit http: -CODESYSTEM_CS_NO_VS_NOTCOMPLETE=\u00dcberpr\u00fcfen Sie das all-Codes-ValueSet - unvollst\u00e4ndige CodeSysteme sollten im Allgemeinen keinen all-codes ValueSet spezifizieren -TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE=Lautet identifier.system ''urn:ietf:rfc:3986'', dann muss identifier.value ein vollst\u00e4ndiger URI sein (z. B. mit einem Schema beginnen), nicht ''{0}'' -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID=Angegebene Attachmentgr\u00f6\u00dfe {0} ist nicht g\u00fcltig -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT=Angegebene Gr\u00f6\u00dfe des Anhangs {0} stimmt nicht mit der tats\u00e4chlichen Gr\u00f6\u00dfe des Anhangs {1} \u00fcberein -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER=Die Gr\u00f6\u00dfe des Anhangs kann nicht \u00fcberpr\u00fcft werden, da der Validator nicht f\u00fcr den Zugriff auf das Netz eingerichtet wurde (url = {0}) -TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME=Die Gr\u00f6\u00dfe des Anhangs kann nicht gepr\u00fcft werden, weil der Validator nicht wei\u00df, wie er auf {0} zugreifen soll. -TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR=Die Gr\u00f6\u00dfe des Anhangs kann nicht \u00fcberpr\u00fcft werden, da ein Fehler beim Zugriff auf {0} aufgetreten ist: {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG=Die Gr\u00f6\u00dfe des Anhangs betr\u00e4gt {0} Bytes und \u00fcberschreitet damit die angegebene Grenze von {1} Bytes -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT=Anh\u00e4nge enthalten entweder Daten und/oder eine URL, oder SOLLTEN entweder contentType und/oder Sprache aufweisen -TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG=Die Base64-Gr\u00f6\u00dfe betr\u00e4gt {0} Bytes, was die angegebene Grenze von {1} Bytes \u00fcberschreitet -TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS=Es wurden {0} Dezimalstellen gefunden, was die angegebene Grenze von {1} Stellen \u00fcberschreitet -Validation_VAL_Profile_WrongType2=Typ\u00fcbereinstimmungsfehler bei der Verarbeitung von Profil {0} an Pfad {1}: Der Elementtyp ist {4}, aber das Profil {3} ist f\u00fcr einen anderen Typ {2} -VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT=Ung\u00fcltige Einschr\u00e4nkung im Profil {0} am Pfad {1} - kann nicht auf Typ {2} von Basistypen {3} eingeschr\u00e4nkt werden -EXTENSION_EXTP_CONTEXT_WRONG_XVER=Die Erweiterung {0} aus FHIR Version {3} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist [{2}; dies ist eine Warnung, da Kontexte zwischen FHIR Versionen umbenannt werden k\u00f6nnen) -EXTENSION_EXTM_CONTEXT_WRONG_XVER=Die Modifier-Erweiterung {0} aus FHIR Version {3} darf an dieser Stelle nicht verwendet werden (erlaubt = {1}; dieses Element ist [{2}; dies ist eine Warnung, da Kontexte zwischen FHIR Versionen umbenannt werden k\u00f6nnen) -SECURITY_STRING_CONTENT_ERROR=Der String-Wert enth\u00e4lt Text, der wie eingebettete HTML-Tags aussieht, die in diesem Zusammenhang aus Sicherheitsgr\u00fcnden nicht zul\u00e4ssig sind -SECURITY_STRING_CONTENT_WARNING=Der String-Wert enth\u00e4lt Text, der wie eingebettete HTML-Tags aussieht. Wenn dieser Inhalt ohne entsprechende Nachbearbeitung in HTML gerendert wird, kann er ein Sicherheitsrisiko darstellen -ALL_OK=Alles OK -SEARCHPARAMETER_NOTFOUND=Der Basis-Suchparameter {0} kann nicht gefunden werden, so dass nicht \u00fcberpr\u00fcft werden kann, ob dieser Suchparameter eine korrekte Ableitung davon ist. -SEARCHPARAMETER_BASE_WRONG=Der Ressourcentyp {1} ist im SearchParameter, von dem er abgeleitet ist, nicht als Basis aufgef\u00fchrt ({0}) -SEARCHPARAMETER_TYPE_WRONG=Der Typ {1} unterscheidet sich vom Typ {0} des abgeleiteten Parameters SearchParameter -SEARCHPARAMETER_EXP_WRONG=Der Ausdruck ''{2}'' ist nicht kompatibel mit dem Ausdruck ''{1}'' im derivedFrom SearchParameter {0}, was wahrscheinlich bedeutet, dass die Ableitungsbeziehung nicht g\u00fcltig ist -VALUESET_NO_SYSTEM_WARNING=Kein System angegeben, daher k\u00f6nnen Konzepte und Filter nicht \u00fcberpr\u00fcft werden -VALUESET_INCLUDE_INVALID_CONCEPT_CODE=Der Code {1} ist im System {0} nicht g\u00fcltig -VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER=Der Code {2} ist im System {0} Version {1} nicht g\u00fcltig -VALUESET_EXAMPLE_SYSTEM_HINT=Beispiel System ''{0}'' angegeben, so dass Konzepte und Filter nicht \u00fcberpr\u00fcft werden k\u00f6nnen -VALUESET_EXAMPLE_SYSTEM_ERROR=Beispiel System ''{0}'' angegeben, was nicht zul\u00e4ssig ist. Konzepte und Filter k\u00f6nnen nicht gepr\u00fcft werden -VALUESET_UNC_SYSTEM_WARNING=Unbekanntes System ''{0}'' angegeben, daher k\u00f6nnen Konzepte und Filter nicht gepr\u00fcft werden (Details: {1}) -VALUESET_UNC_SYSTEM_WARNING_VER=Unbekanntes System/Version ''{0}'' angegeben, daher k\u00f6nnen Konzepte und Filter nicht gepr\u00fcft werden (Details: {1}) -Extension_PROF_Type=Die Definition des Profils ''{0}'' l\u00e4sst den Typ {1} zu, aber Typ {2} wurde gefunden -TYPE_CHECKS_PATTERN_CC=Das im Profil {3} definierte Pattern [System {0}, Code {1}, und Anzeige ''{2}''] wurde nicht gefunden. Probleme: {4} -TYPE_CHECKS_PATTERN_CC_US=Das im Profil {3} definierte Pattern [System {0}, Code {1}, Anzeige ''{2}'' und userSelected {5}] wurde nicht gefunden. Probleme: {4} -TYPE_CHECKS_FIXED_CC=Das im Profil {3} definierte Muster [System {0}, Code {1}, und Anzeige ''{2}''] wurde nicht gefunden. Probleme: {4} -TYPE_CHECKS_FIXED_CC_US=Das im Profil {3} definierte Pattern [System {0}, Code {1}, Anzeige ''{2}'' und userSelected {5}] wurde nicht gefunden. Probleme: {4} -VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN=Globale Profilreferenz ''{0}'' von IG {1} konnte nicht aufgel\u00f6st werden, wurde also nicht gepr\u00fcft -VALIDATION_VAL_PROFILE_SIGNPOST_BASE=Ressource gegen Profil validieren -VALIDATION_VAL_PROFILE_SIGNPOST=Ressource gegen Profil {0} validieren -VALIDATION_VAL_PROFILE_SIGNPOST_META=Ressource gegen Profil {0} validieren (per Meta) -VALIDATION_VAL_PROFILE_SIGNPOST_DEP=Ressource gegen Profil {0} validieren (per http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) -VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM=Validierung der Ressource anhand des Profils {0}, das als Bundle-Parameter angegeben wird -VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL=Ressource gegen Profil {0} validieren - ein globales Profil in {1} -ERROR_GENERATING_SNAPSHOT=Fehler bei der Erstellung des Snapshot: {0} (dies l\u00e4sst sich in der Regel auf ein Problem im Differenzial zur\u00fcckf\u00fchren) -SNAPSHOT_EXISTING_PROBLEM=Der erzeugte Snapshot hat eine andere Anzahl von Elementen {1} als der urspr\u00fcnglich bereitgestellte Snapshot {0} -FHIRPATH_LOCATION=(bei {0}) -FHIRPATH_UNKNOWN_CONTEXT=Unbekannter Kontext beim Auswerten des FHIRPath-Ausdrucks: {0} -FHIRPATH_UNKNOWN_CONTEXT_ELEMENT=Unbekanntes Kontextelement bei der Auswertung des FHIRPath-Ausdrucks: {0} -FHIRPATH_ALIAS_COLLECTION=Versuch, eine Sammlung zu aliasen, nicht ein Singleton, bei der Auswertung eines FHIRPath-Ausdrucks -FHIRPATH_UNKNOWN_NAME=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Der Name ''{0}'' ist f\u00fcr keinen der m\u00f6glichen Typen g\u00fcltig: {1} -FHIRPATH_UNKNOWN_CONSTANT=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Ung\u00fcltige FHIR-Konstante {0} -FHIRPATH_CANNOT_USE=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Kann {0} in diesem Kontext nicht verwenden, da {1} -FHIRPATH_CANT_COMPARE=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Werte vom Typ {0} und {1} k\u00f6nnen nicht verglichen werden -FHIRPATH_LEFT_VALUE_other=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Linker Operand zu {1} kann nur 1 Wert haben, hat aber {0} Werte -FHIRPATH_LEFT_VALUE_WRONG_TYPE=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Der linke Operand zu {0} hat den falschen Typ {1} -FHIRPATH_RIGHT_VALUE_other=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: rechter Operand zu {1} kann nur 1 Wert haben, hat aber {0} Werte -FHIRPATH_RIGHT_VALUE_WRONG_TYPE=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: der rechte Operand zu {0} hat den falschen Typ {1} -FHIRPATH_OP_INCOMPATIBLE=Fehler bei der Auswertung des FHIRPath-Ausdrucks {0}: linker und rechter Operand haben inkompatible oder ung\u00fcltige Typen ({1}, {2}) -FHIRPATH_HO_HOST_SERVICES=Interner Fehler beim Auswerten des FHIRPath-Ausdrucks: Es werden keine Host-Services bereitgestellt ({0}) -FHIRPATH_WRONG_PARAM_TYPE=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Parametertyp {2} ist nicht zul\u00e4ssig f\u00fcr {0} Parameter {1}. erwartet {3} -FHIRPATH_ORDERED_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf geordnete Sammlungen angewendet werden -FHIRPATH_REFERENCE_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen geordneten String, uri, canonical oder Reference angewendet werden, wurde aber gefunden {1} -FHIRPATH_CODED_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf geordneten String, Code, uri, Coding, CodeableConcept angewendet werden, aber gefunden {1} -FHIRPATH_STRING_ORD_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf eine geordnete Sammlung von string, uri, code, id angewendet werden, wurde aber {1} gefunden -FHIRPATH_STRING_SING_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf string, uri, code, id angewendet werden, aber gefunden {1} -FHIRPATH_NO_COLLECTION=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen Singleton-Wert angewendet werden, fand aber {1} -FHIRPATH_NOT_IMPLEMENTED=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} ist nicht implementiert -FHIRPATH_PARAM_WRONG=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Ausdruckstyp {0} wird f\u00fcr den Parameter {1} der Funktion {2} nicht unterst\u00fctzt -FHIRPATH_CHECK_FAILED=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Pr\u00fcfung {0} ist fehlgeschlagen -FHIRPATH_NO_TYPE=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Der Typ ''{0}'' ist unbekannt oder wird nicht unterst\u00fctzt bei {1} -FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED=Fehler im Diskriminator bei {0}: beim Aufl\u00f6sen des festen Werts f\u00fcr eine der Slices wurde ein geslictes Element gefunden -FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND=Problem bei der Verwendung von resolve() - Profil {0} auf {1} konnte nicht aufgel\u00f6st werden -FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE=Ung\u00fcltige Verwendung von resolve() in discriminator - kein Typ f\u00fcr Element {0} -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other=Ung\u00fcltige Verwendung von resolve() in discriminator - {0} m\u00f6gliche Typen auf {1} (kann nur einer sein) -FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE=Ung\u00fcltige Verwendung von resolve() in discriminator - Typ auf {0} ist keine Referenz {1} -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other=Ung\u00fcltige Verwendung von resolve() in discriminator - {0} m\u00f6gliche Zieltypprofile auf {1} (kann nur eins sein) -FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND=Problem bei der Verwendung von resolve() - Profil {0} auf {1} konnte nicht aufgel\u00f6st werden -FHIRPATH_DISCRIMINATOR_TYPE_NONE=Unzul\u00e4ssige Verwendung von ofType() im Diskriminator - kein Typ in Element {0} definiert -FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE=Unzul\u00e4ssige Verwendung von ofType() in discriminator - Mehrere m\u00f6gliche Typen auf {0} -FHIRPATH_DISCRIMINATOR_NO_CODE=Ung\u00fcltige Verwendung von ofType() in Diskriminator - Typ verf\u00fcgt \u00fcber keinen Code auf {0} -FHIRPATH_DISCRIMINATOR_BAD_NAME=Ung\u00fcltiger Funktionsname {0}() im Diskriminator -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP=Ung\u00fcltige Ausdruckssyntax im Diskriminator (Gruppe ''{0}'') -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST=Ung\u00fcltige Ausdruckssyntax in discriminator (const) -FHIRPATH_DISCRIMINATOR_CANT_FIND=Diskriminator in Definitionen kann nicht aufgel\u00f6st werden: {0} in Profil {1} auf Element {2}, sucht in Profil {3} -FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION=Der in den Definitionen gefundene Diskriminator {0} auf {2} kann nicht aufgel\u00f6st werden, da die Erweiterung {1} nicht im Profil {3} gefunden wurde. -FHIRPATH_DISCRIMINATOR_NOTYPE=Fehler im Diskriminator bei {0}: keine Kinder, kein Typ -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other=Fehler im Diskriminator bei {1}: keine Kinder, {0} Typen -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other=Fehler im Diskriminator bei {1}: keine Kinder, Profile vom Typ {0} -FHIRPATH_UNABLE_BOOLEAN=Kann nicht als Boolescher Wert ausgewertet werden: {0} -XHTML_XHTML_DOCTYPE_ILLEGAL=Fehlerhaftes XHTML: Es wurde eine DocType-Deklaration gefunden, die nicht zul\u00e4ssig ist (Schutz vor XXE-Sicherheitsl\u00fccken) -PACKAGE_VERSION_MISMATCH=FHIR Version mismatch in Paket {0}: Version ist {2}, muss aber {1} sein (Pfad: {3}) -VALUESET_REFERENCE_UNKNOWN=Der ValueSet-Import {0} konnte nicht gefunden werden und kann daher nicht \u00fcberpr\u00fcft werden -VALUESET_REFERENCE_INVALID_TYPE=Der ValueSet-Import {0} verweist auf eine Ressource des Typs {1}, die nicht g\u00fcltig ist -SD_MUST_HAVE_DERIVATION=StructureDefinition {0} muss eine Ableitung haben, da sie eine baseDefinition hat -VALIDATION_VAL_PROFILE_OTHER_VERSION=Profil ist f\u00fcr eine andere Version von FHIR ({0}) und wurde daher ignoriert -VALIDATION_VAL_PROFILE_THIS_VERSION_OK=Profil f\u00fcr diese Version von FHIR - alles OK -VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER=Profil ist f\u00fcr diese Version von FHIR, aber ist ein ung\u00fcltiger Typ {0} -RENDER_BUNDLE_HEADER_ROOT=Bundle {0} vom Typ {1} -RENDER_BUNDLE_HEADER_ENTRY=Entry {0} -RENDER_BUNDLE_HEADER_ENTRY_URL=Entry {0} - fullUrl = {1} -RENDER_BUNDLE_RESOURCE=Ressource {0}: -RENDER_BUNDLE_SEARCH=Suche: -RENDER_BUNDLE_SEARCH_MODE=Mode = {0} -RENDER_BUNDLE_SEARCH_SCORE=Score = {0} -RENDER_BUNDLE_RESPONSE=Response: -RENDER_BUNDLE_LOCATION=Location = {0} -RENDER_BUNDLE_ETAG=ETag = {0} -RENDER_BUNDLE_LAST_MOD=LastModified = {0} -RENDER_BUNDLE_REQUEST=Request: -RENDER_BUNDLE_IF_NON_MATCH=If-None-Match = {0} -RENDER_BUNDLE_IF_MOD=If-Modified-Since = {0} -RENDER_BUNDLE_IF_MATCH=If-Match = {0} -RENDER_BUNDLE_IF_NONE=If-None-Exist = {0} -BUNDLE_RULE_NONE=Keine Regel -BUNDLE_RULE_UNKNOWN=Bundle Rule verweist auf ung\u00fcltige Ressource {0} -BUNDLE_RULE_INVALID_INDEX=Bundle Rules Index ist ung\u00fcltig ({0}) -BUNDLE_RULE_PROFILE_UNKNOWN=Bundle Rules Profil {1} ist unbekannt f\u00fcr {0} -RENDER_BUNDLE_DOCUMENT_CONTENT=Zus\u00e4tzlicher Dokumenteninhalt -RENDER_BUNDLE_HEADER_DOC_ENTRY_URD={0}. {1} ({2}/{3}) -RENDER_BUNDLE_HEADER_DOC_ENTRY_U={0}. {1} -RENDER_BUNDLE_HEADER_DOC_ENTRY_RD={0}. {2}/{3} -UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_=Es kann nicht festgestellt werden, ob die angegebenen Codes {1} im ValueSet {0} enthalten sind, da das ValueSet oder ein davon abh\u00e4ngiges Codesystem dem Validator nicht bekannt sind -TERMINOLOGY_TX_SYSTEM_WRONG_HTML=Die Code-System-Referenz {0} ist falsch - die Code-System-Referenz kann nicht auf eine HTML-Seite verweisen. Dies k\u00f6nnte die richtige Referenz sein: {1} -TERMINOLOGY_TX_SYSTEM_WRONG_BUILD=Die Code-System-Referenz {0} ist falsch - die Code-System-Referenz kann keine Referenz auf build.fhir.org sein. Dies k\u00f6nnte die richtige Referenz sein: {1} -FHIRPATH_BAD_DATE=Datum {0} kann nicht geparst werden -FHIRPATH_NUMERICAL_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf Integer, Decimal oder Quantity angewendet werden, aber gefunden wurde {1} -FHIRPATH_DECIMAL_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf eine Dezimalzahl angewandt werden, fand aber {1} -FHIRPATH_CONTINUOUS_ONLY=Fehler bei der Auswertung des FHIRPath-Ausdrucks: Die Funktion {0} kann nur auf einen Dezimal- oder Datumstyp angewendet werden, gefunden wurde aber {1} -FHIRPATH_FOCUS_other=Fehler bei der Auswertung eines FHIRPath-Ausdrucks: Fokus f\u00fcr {0} kann nur einen Wert haben, hat aber {0} Werte -REFERENCE_REF_SUSPICIOUS=Die Syntax der Reference ''{0}'' sieht falsch aus und sollte \u00fcberpr\u00fcft werden -TYPE_SPECIFIC_CHECKS_DT_QTY_NO_ANNOTATIONS=UCUM-Codes, die von Menschen lesbare Anmerkungen wie {0} enthalten, k\u00f6nnen irref\u00fchrend sein. Die beste Praxis besteht darin, keine Anmerkungen im UCUM-Code zu verwenden und stattdessen sicherzustellen, dass "Quantity.unit" von Menschen korrekt gelesen werden kann -XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA=Ung\u00fcltiger Elementname innerhalb eines Absatzes im XHTML (''{0}'') -UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE=Nicht unterst\u00fctzte Eigenschaft {3} auf Typ {2} f\u00fcr Pattern des Diskriminators ({0}) f\u00fcr Slice {1} -UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE=Nicht unterst\u00fctzt: keine Properties mit Werten gefunden auf Typ {2} f\u00fcr Pattern des Diskriminators ({0}) f\u00fcr Slice {1} -SD_NESTED_MUST_SUPPORT_DIFF=Das Element {0} hat Typen/Profile/Ziele, die als must-support markiert sind, aber das Element selbst ist nicht als must-support markiert. Die inneren must-supports werden ignoriert, es sei denn, das Element erbt must-support = true -SD_NESTED_MUST_SUPPORT_SNAPSHOT=Das Element {0} hat Typen/Profile/Ziele, die als "must support" gekennzeichnet sind, aber das Element selbst ist nicht als "must support" gekennzeichnet -Unable_to_connect_to_terminology_server=Verbindung zum Terminologieserver kann nicht hergestellt werden. Fehler = {0} -SD_ED_TYPE_PROFILE_UNKNOWN=Profil {0} kann nicht aufgel\u00f6st werden -SD_ED_TYPE_PROFILE_NOTYPE=Profil {0} gefunden, aber nicht in der Lage, den Typ zu bestimmen, f\u00fcr den es gilt -SD_ED_TYPE_PROFILE_WRONG=Profil {0} ist f\u00fcr Typ {1}, aber das Element {3} hat Typ {2} -SD_ED_TYPE_PROFILE_IS_MODIFIER=Profil {0} ist nicht f\u00fcr eine Modifier-Extension gedacht, aber das Element {3} ist ein Modifier -SD_ED_TYPE_PROFILE_NOT_MODIFIER=Profil {0} ist f\u00fcr eine Modifier-Extension, aber das Element {3} ist kein Modifier -SD_ED_TYPE_PROFILE_WRONG_TARGET=Profil {0} ist f\u00fcr den Typ {1}, der kein {4} ist (was erforderlich ist, weil das Element {3} den Typ {2} hat) -SD_ED_TYPE_NO_TARGET_PROFILE=Typ {0} erlaubt keine Zielprofile -TERMINOLOGY_TX_NOSVC_BOUND_REQ=Es konnte nicht best\u00e4tigt werden, dass die angegebenen Codes aus dem required ValueSet {0} stammen, da es keinen Terminologiedienst gibt -TERMINOLOGY_TX_NOSVC_BOUND_EXT=Es konnte nicht best\u00e4tigt werden, dass die angegebenen Codes aus dem extensible ValueSet {0} stammen, da es keinen Terminologiedienst gibt -ARRAY_CANNOT_BE_EMPTY=Array kann nicht leer sein - Property sollte nicht vorhanden sein, falls es keine Werte hat -XHTML_URL_DATA_NO_DATA=Keine Daten in den Daten gefunden: URL -XHTML_URL_DATA_DATA_INVALID_COMMA=Komma im Datenteil der Daten-URL gefunden: {0} -XHTML_URL_DATA_DATA_INVALID=Die Daten sollten g\u00fcltige base64-Inhalte sein: URL: {0} -XHTML_URL_DATA_MIMETYPE=Der Mimetyp-Teil der Daten: URL ist nicht g\u00fcltig ({1}) in URL: {0} -SD_ED_SHOULD_BIND=Das Element {0} hat einen Typ, der eine Bindung haben sollte ({1}), aber es ist keine Bindung vorhanden -SD_ED_SHOULD_BIND_WITH_VS=Das Element {0} hat einen Typ, der eine Bindung haben sollte ({1}), aber die Bindung hat keinen Wert gesetzt -SD_ED_BIND_UNKNOWN_VS=Die valueSet-Referenz {1} auf Element {0} konnte nicht aufgel\u00f6st werden -SD_ED_BIND_NOT_VS=Die ValueSet-Referenz {1} auf Element {0} zeigt auf etwas, das kein ValueSet ist ({2}) -SD_ED_BIND_NO_BINDABLE=Das Element {0} hat eine Bindung, aber es sind keine bindungsf\u00e4higen Typen vorhanden {1} -SD_ED_BIND_MULTIPLE_TYPES=Das Element {0} hat eine Bindung und hat mehrere Typen, die Bindungen unterliegen ({1}). Die Bindung gilt f\u00fcr alle Typen -DISCRIMINATOR_BAD_PATH=Fehler bei der Verarbeitung des Pfadausdrucks f\u00fcr den Diskriminator: {0} (src = ''{1}'') -SLICING_CANNOT_BE_EVALUATED=Slicing kann nicht ausgewertet werden: {0} -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE=Canonical URL ''{0}'' kann nicht aufgel\u00f6st werden -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC=Canonical URL ''{0}'' existiert, kann aber nicht geladen werden, daher kann sie nicht auf G\u00fcltigkeit gepr\u00fcft werden -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE=Canonical URL ''{0}'' verweist auf eine Ressource, die den falschen Typ hat. Gefunden {1}, erwartet eines von {2} -CODESYSTEM_CS_NO_SUPPLEMENT=CodeSystem {0} ist ein Supplement, kann also nicht als Wert in Coding.system verwendet werden -CODESYSTEM_CS_SUPP_CANT_CHECK=CodeSystem {0} kann nicht gefunden werden, daher kann nicht gepr\u00fcft werden, ob die Konzepte g\u00fcltig sind -CODESYSTEM_CS_SUPP_INVALID_CODE=Der Code ''{1}'' ist nicht im Basis-CodeSystem {0} deklariert und daher im Supplement nicht g\u00fcltig -SD_VALUE_TYPE_IILEGAL=Das Element {0} hat ein {1} vom Typ {2}, das nicht in der Liste der erlaubten Typen ({3}) enthalten ist -SD_VALUE_TYPE_REPEAT_HINT=Das sich wiederholende Element hat ein {1}. Die {1} gilt f\u00fcr alle Wiederholungen (dies war nicht allen Benutzern klar) -SD_VALUE_TYPE_REPEAT_WARNING_DOTNET=Das sich wiederholende Element hat einen {1} Wert f\u00fcr einen primitiven Typ. Der DotNet Validator wird dies nicht auf alle Wiederholungen anwenden - dies ist ein Fehler -SD_NO_TYPES_OR_CONTENTREF=Das Element {0} hat keine zugewiesenen Typen und keine Inhaltsreferenz -CODESYSTEM_CS_UNK_EXPANSION=Der angegebene Code ({2}) befindet sich nicht in der Expansion im ValueSet {0}, und es wird ein Code aus diesem ValueSet ben\u00f6tigt. Das System {1} ist unbekannt. -BUNDLE_SEARCH_NOSELF=SearchSet Bundles sollten einen Self-Link haben, der angibt, worum es bei der Suche ging -BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD=Es konnten keine Typen aus dem Suchstring ermittelt werden, so dass die Typen nicht \u00fcberpr\u00fcft werden k\u00f6nnen -BUNDLE_SEARCH_ENTRY_NO_RESOURCE=SearchSet Bundle-Eintr\u00e4ge m\u00fcssen Ressourcen enthalten -BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE=Es konnte nicht festgestellt werden, ob diese Ressource ein g\u00fcltiger Ressourcentyp f\u00fcr diese Suche ist -BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID=Suchergebnisse m\u00fcssen IDs haben -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE=Dies ist kein passender Ressourcentyp f\u00fcr die angegebene Suche ({0}, erwartet {1}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME=Dies ist kein OperationOutcome ({0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE=Dies ist kein passender Ressourcentyp f\u00fcr die angegebene Suche (ist ein Suchmodus erforderlich?) ({0} erwartet {1}) -BUNDLE_SEARCH_NO_MODE=SearchSet-Bundles sollten Suchmodi f\u00fcr die Eintr\u00e4ge enthalten -INV_FAILED=Regel {0} fehlgeschlagen -PATTERN_CHECK_STRING=Das im Profil {1} definierte Pattern [{0}] wurde nicht gefunden. Probleme: {2} -TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE=Beispiel-URLs sind in diesem Zusammenhang nicht zul\u00e4ssig ({0}) -UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED=Die Unicode-Sequenz enth\u00e4lt bidirektionale Steuerzeichen, die in diesem Zusammenhang nicht zul\u00e4ssig sind: {1} -UNICODE_BIDI_CONTROLS_CHARS_MATCH=Die Unicode-Sequenz hat unterminierte bi-di Steuerzeichen (siehe CVE-2021-42574): {1} -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL=HL7 Defined CodeSystems M\u00dcSSEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD=HL7 Defined CodeSysteme SOLLTEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen -CODESYSTEM_CS_NONHL7_MISSING_ELEMENT=CodeSysteme SOLLTEN einen angegebenen Wert f\u00fcr das {0}-Element haben, damit die Benutzer den Status und die Bedeutung des Codesystems eindeutig kennen -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL=CodeSysteme SOLLTEN KEINEN angegebenen Wert f\u00fcr das Element {0} haben, wenn sie ein Supplement sind -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG=CodeSystem Supplements M\u00dcSSEN einen Content-Wert von "supplement" haben. -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING=CodeSystem-Erg\u00e4nzungen mit dem Content-Wert "supplement" M\u00dcSSEN ein supplements-Element haben, das angibt, welches Codesystem erg\u00e4nzt wird. -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_QTY=Gefunden {0} vom Typ {2} im Profil, das eine Quantity validiert (also muss es eine Quantity sein) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH=Der minValue im Profil hat ein System von {0}, das sich von dem System des Wertes {1} unterscheidet, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH=Der minValue im Profil hat einen Systemcode von {0}, der sich von dem Systemcode des Wertes {1} unterscheidet, so dass der Mindestwert nicht gepr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE=Der minValue im Profil enth\u00e4lt keinen aktuellen Wert, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE=Die Menge enth\u00e4lt keinen Wert, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM=Der minValue im Profil enth\u00e4lt kein System, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM=Der Wert enth\u00e4lt kein System, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE=Der minValue im Profil enth\u00e4lt keinen Code, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE=Der Wert enth\u00e4lt keinen Code, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC=Es gibt keinen UCUM-Dienst, und die UCUM-Codes sind nicht identisch, so dass der Mindestwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT=Konvertierung von Wert {0} aus Einheit {1} in minValue-Einheit {2} basierend auf UCUM-Definitionen nicht m\u00f6glich; Mindestwert ist nicht g\u00fcltig -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG=Der Wert in der Instanz ({2}) ist kleiner als der angegebene Mindestwert ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM=Der Wert in der Instanz ({0} {1}) ist nach der UCUM-Konvertierung kleiner als der angegebene minValue ({2} {3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_QTY=Gefunden {0} vom Typ {2} im Profil, das eine Quantity validiert (also muss es eine Quantity sein) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH=Der maxValue im Profil hat ein System von {0}, das sich vom System des Wertes {1} unterscheidet, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH=Der maxValue im Profil hat den Systemcode {0}, der sich von dem Systemcode im Wert {1} unterscheidet, so dass der H\u00f6chstwert nicht gepr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE=Der maxValue im Profil enth\u00e4lt keinen Wert, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE=Die Quantity enth\u00e4lt keinen Wert, so dass der Maximalwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM=Der maxValue im Profil hat kein System, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM=Der Wert hat kein System, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE=Der maxValue im Profil hat keinen Code, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE=Der Wert enth\u00e4lt keinen Code, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC=Es gibt keinen UCUM-Dienst, und die UCUM-Codes sind nicht identisch, so dass der H\u00f6chstwert nicht \u00fcberpr\u00fcft werden kann. -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT=Wert {0} kann nicht von Einheit {1} in maxWert-Einheit {2} umgewandelt werden, basierend auf UCUM-Definitionen; Maximalwert ist nicht g\u00fcltig -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG=Der Wert in der Instanz ({2}) ist gr\u00f6\u00dfer als der angegebene H\u00f6chstwert ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM=Der Wert in der Instanz ({0} {1}) ist nach der UCUM-Konvertierung gr\u00f6\u00dfer als der angegebene maxValue ({2} {3}) -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR=Base64-kodierte Werte d\u00fcrfen keine Leerzeichen enthalten (gem\u00e4\u00df RFC 4648). Beachten Sie, dass nicht-validierende Leser aufgefordert werden, Leerzeichen trotzdem zu akzeptieren -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING=Base64-kodierte Werte SOLLTEN keine Leerzeichen enthalten (gem\u00e4\u00df RFC 4648). Beachten Sie, dass nicht-validierende Leser aufgefordert werden, Leerzeichen trotzdem zu akzeptieren -SD_DERIVATION_KIND_MISMATCH=Die StructureDefinition schr\u00e4nkt eine Art von {0} ein, hat aber eine andere Art ({1}) -VALUESET_IMPORT_UNION_INTERSECTION=Dieser Wertesatz hat ein einzelnes Include mit mehreren importierten Wertes\u00e4tzen. Unter https://jira.hl7.org/browse/FHIR-25179 gab es in der Vergangenheit Verwirrung dar\u00fcber, ob es sich bei diesen Wertes\u00e4tzen um einen Zusammenschluss oder eine \u00dcberschneidung handelt. Wenn dieser Wertesatz in einem Paket enthalten ist, das vor dem 31. M\u00e4rz 2022 ver\u00f6ffentlicht wurde, wird er als Vereinigung behandelt, andernfalls als Schnittmenge. Wenn Sie eine Vereinigung w\u00fcnschen, teilen Sie die Importe der Wertemenge auf mehrere Includes auf -TX_SERVER_NO_BATCH_RESPONSE=Der Server gibt bei einer Batch-Validierungsanfrage null zur\u00fcck -BUNDLE_POSSSIBLE_MATCHES=Das Bundle enth\u00e4lt keine \u00dcbereinstimmung f\u00fcr {1} nach den Regeln der Bundle-Referenzaufl\u00f6sung, aber es hat mehrere Ressourcen, die {0} nach Ressourcentyp und ID entsprechen -BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU=Eintrag {0} stimmt mit dem Verweis {1} nach Typ und ID \u00fcberein, aber er stimmt nicht mit der vollst\u00e4ndigen Ziel-URL {2} nach den Regeln der Bundle-Aufl\u00f6sung \u00fcberein -BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU=Eintrag {0} stimmt mit dem Verweis {1} nach Typ und ID \u00fcberein, aber seine vollst\u00e4ndige URL {2} stimmt nicht mit der vollst\u00e4ndigen Ziel-URL {3} nach den Regeln der Bundle-Aufl\u00f6sung \u00fcberein -SD_ILLEGAL_CHARACTERISTICS=Dieses Element hat ein {0}, aber die Typen {1} machen diese Art von Einschr\u00e4nkung nicht relevant -SD_VALUE_COMPLEX_FIXED=F\u00fcr den komplexen Typ {0} sollte eher ein Pattern als ein fester Wert verwendet werden, um die Instanz nicht zu sehr einzuschr\u00e4nken -VALUESET_SHAREABLE_MISSING=Das ShareableValueSet-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte ValueSets SOLLTEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen -VALUESET_SHAREABLE_EXTRA_MISSING=Das ShareableValueSet-Profil empfiehlt, dass das Element {0} gef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte ValueSets SOLLTEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen -VALUESET_SHAREABLE_MISSING_HL7=Das ShareableValueSet-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published ValueSets M\u00dcSSEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen -VALUESET_SHAREABLE_EXTRA_MISSING_HL7=Das ShareableValueSet-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published ValueSets M\u00dcSSEN mit dem ShareableValueSet-Profil \u00fcbereinstimmen -CODESYSTEM_SHAREABLE_MISSING=Das ShareableCodeSystem-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Codesysteme SOLLTEN mit dem ShareableCodeSystem-Profil \u00fcbereinstimmen -CODESYSTEM_SHAREABLE_EXTRA_MISSING=Das ShareableCodeSystem-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Codesysteme SOLLTEN mit dem ShareableCodeSystem-Profil \u00fcbereinstimmen -CODESYSTEM_SHAREABLE_MISSING_HL7=Das ShareableCodeSystem-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Code-Systeme M\u00dcSSEN dem ShareableCodeSystem-Profil entsprechen -CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7=Das ShareableCodeSystem-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Code-Systeme M\u00dcSSEN dem ShareableCodeSystem-Profil entsprechen -CONCEPTMAP_SHAREABLE_MISSING=Das ShareableConceptMap-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Concept Maps SOLLTEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen -CONCEPTMAP_SHAREABLE_EXTRA_MISSING=Das ShareableConceptMap-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Concept Maps SOLLTEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen -CONCEPTMAP_SHAREABLE_MISSING_HL7=Das ShareableConceptMap-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Concept Maps M\u00dcSSEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen -CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7=Das ShareableConceptMap-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Concept Maps M\u00dcSSEN mit dem ShareableConceptMap-Profil \u00fcbereinstimmen -MEASURE_SHAREABLE_MISSING=Das ShareableMeasure-Profil sagt, dass das {0}-Element obligatorisch ist, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Ma\u00dfnahmen SOLLTEN mit dem ShareableMeasure-Profil \u00fcbereinstimmen -MEASURE_SHAREABLE_EXTRA_MISSING=Das ShareableMeasure-Profil empfiehlt, dass das Element {0} ausgef\u00fcllt wird, aber es ist nicht vorhanden. Ver\u00f6ffentlichte Ma\u00dfnahmen SOLLTEN mit dem ShareableMeasure-Profil \u00fcbereinstimmen -MEASURE_SHAREABLE_MISSING_HL7=Das ShareableMeasure-Profil sagt, dass das {0}-Element obligatorisch ist, aber es wird nicht gefunden. HL7 Published Measures M\u00dcSSEN dem ShareableMeasure-Profil entsprechen -MEASURE_SHAREABLE_EXTRA_MISSING_HL7=Das ShareableMeasure-Profil empfiehlt, dass das Element {0} bef\u00fcllt wird, aber es wird nicht gefunden. HL7 Published Measures M\u00dcSSEN dem ShareableMeasure-Profil entsprechen -TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML=Der Markdown enth\u00e4lt einen Inhalt, der wie ein eingebetteter HTML-Tag aussieht und mit ''{0}'' beginnt. Dies wird (oder SOLLTE) von der Pr\u00e4sentationsschicht escaped werden. Der Inhalt sollte \u00fcberpr\u00fcft werden, um zu best\u00e4tigen, dass dies das gew\u00fcnschte Verhalten ist -TYPE_SPECIFIER_ILLEGAL_TYPE=Der Type specifier {1} spezifizierte einen ung\u00fcltigen Typ {0} -TYPE_SPECIFIER_ABSTRACT_TYPE=Der Type specifier {1} spezifiziert einen abstrakten Typ {0} -TYPE_SPECIFIER_NM_ILLEGAL_TYPE=Kein Typ-Spezifikator matcht, und der zugrunde liegende Typ {0} ist nicht g\u00fcltig -TYPE_SPECIFIER_NM_ABSTRACT_TYPE=Kein Typ-Spezifikator matcht, und der zugrunde liegende Typ {0} ist nicht abstrakt -ELEMENT_CANNOT_BE_NULL=Das Element darf nicht ''null'' sein -MULTIPLE_LOGICAL_MODELS_other={0} Logische Modelle in den gelieferten Profilen gefunden, daher kann das logische Modell nicht analysiert werden (kann nur eines sein, gefunden {1}) -UNRECOGNISED_PROPERTY_TYPE=Ung\u00fcltiger JSON-Typ {0} f\u00fcr das Element {1}; g\u00fcltige Typen = {2} -UNRECOGNISED_PROPERTY_TYPE_WRONG=Ung\u00fcltiger Typ {2} f\u00fcr das Element {1}; g\u00fcltige Typen = {3}, JSON-Typ = {0} -SD_TYPE_MISSING=Kein Typ gefunden -SD_TYPE_NOT_MATCH_NS=Der Typ-Namensraum {0} SOLLTE mit dem Url-Namensraum {1} f\u00fcr die Definition des Typs \u00fcbereinstimmen -SD_TYPE_NOT_DERIVED=Der Typ {0} kann nur als Typ verwendet werden, falls die Basisdefinition des Typs eingeschr\u00e4nkt wird -SD_TYPE_NOT_LOCAL=Der Typ {0} ist nicht zul\u00e4ssig, da er nicht in der FHIR-Spezifikation definiert ist. Andere Typen m\u00fcssen mit einem Namespace versehen sein -SD_TYPE_NOT_LOGICAL=Der Typ {0} kann nur definiert werden, wenn die Art 'logisch' ist, nicht {1} -SD_CONSTRAINED_TYPE_NO_MATCH=Der Typ {0} muss derselbe sein wie der Typ in der Basisstruktur {1}, die eingeschr\u00e4nkt wird -SD_SPECIALIZED_TYPE_MATCHES=Der Typ {0} darf nicht derselbe sein wie der Typ in der Basisstruktur {1}, die spezialisiert wird -SD_CONSTRAINED_KIND_NO_MATCH=Die Art {0} muss dieselbe sein wie die Art {1} in der Basisstruktur {3} (Basistyp = {2}) -SD_PATH_TYPE_MISMATCH=Der Pfad {1} muss mit dem Typ der Struktur {0} beginnen -UNABLE_TO_RESOLVE_CONTENT_REFERENCE=Die Inhaltsreferenz {0} auf Element {1} (Pfad = {2}) kann nicht aufgel\u00f6st werden. -UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT=Die Inhaltsreferenz {0} auf Element {1} (Pfad = {2}) kann in diesem Kontext nicht aufgel\u00f6st werden -RESOURCETYPE_PROPERTY_WRONG_TYPE=Das JSON-Element ''resourceType'' hat den falschen JSON-Typ: {0} -DUPLICATE_JSON_PROPERTY=Die JSON-Eigenschaft ''{0}'' ist ein Duplikat und wird ignoriert -DUPLICATE_JSON_PROPERTY_KEY=Die JSON-Eigenschaft ''{0}'' ist ein Duplikat und wird ignoriert -JSON_PROPERTY_NO_QUOTES=Die JSON-Eigenschaft ''{0}'' hat keine Anf\u00fchrungszeichen um den Namen der Eigenschaft -JSON_PROPERTY_VALUE_NO_QUOTES=Die JSON-Eigenschaft ''{0}'' hat keine Anf\u00fchrungszeichen um den Wert der Eigenschaft ''{1}'' -JSON_COMMA_MISSING=Ein Komma fehlt in der JSON-Datei -JSON_COMMA_EXTRA=Es gibt ein zus\u00e4tzliches Komma am Ende der {0} im JSON -JSON_COMMENTS_NOT_ALLOWED=Kommentare sind in JSON nicht erlaubt -BUNDLE_LINK_UNKNOWN=Der Link-Beziehungstyp ''{0}'' ist unbekannt und in diesem Zusammenhang nicht zul\u00e4ssig -BUNDLE_LINK_SEARCH_PROHIBITED=Der in SearchSets verwendete Verkn\u00fcpfungstyp ''{0}'' ist in diesem Zusammenhang verboten -BUNDLE_LINK_SEARCH_NO_DUPLICATES=Der Verkn\u00fcpfungstyp ''{0}'' kann nur einmal vorkommen -BUNDLE_LINK_STYELSHEET_EXTERNAL=Andere externe Stylesheets als https://hl7.org/fhir/fhir.css SOLLTEN nicht verwendet werden. -BUNDLE_LINK_STYELSHEET_INSECURE=Der Stylesheet-Verweis ist nicht sicher -BUNDLE_LINK_STYELSHEET_LINKABLE=Der Stylesheet-Verweis ist kein aufl\u00f6sbarer Link -BUNDLE_LINK_STYELSHEET_NOT_FOUND=Der Stylesheet-Verweis konnte in diesem Bundle nicht aufgel\u00f6st werden -EXT_VER_URL_NO_MATCH=Extension-URLs kennen keine Versionen. Der Validator war nicht in der Lage, diese URL mit oder ohne versionsbasierte Aufl\u00f6sung aufzul\u00f6sen -EXT_VER_URL_IGNORE=Extension-URLs kennen keine Versionen. Der Validator hat die Version ignoriert und die Erweiterung trotzdem verarbeitet -EXT_VER_URL_MISLEADING=Die Extension-URL enth\u00e4lt ein ''|'', das sie wie eine versionierte URL aussehen l\u00e4sst, aber das ist sie nicht, und das ist verwirrend f\u00fcr Implementierer -EXT_VER_URL_NOT_ALLOWED=Die URL der Extension darf keine Version enthalten -EXT_VER_URL_REVERSION=Die URL der Erweiterung darf keine Version enthalten. Die Erweiterung wurde gegen Version {0} der Erweiterung validiert -ILLEGAL_COMMENT_TYPE=Die Eigenschaft fhir_comments muss ein Array von Strings sein -SD_NO_SLICING_ON_ROOT=Slicing ist an der Wurzel eines Profils nicht erlaubt -REFERENCE_REF_QUERY_INVALID=Der Abfrageteil der bedingten Referenz ist kein g\u00fcltiger Abfrage-String ({0}) -SM_RULEGROUP_NOT_FOUND=Die Gruppe {0} konnte nicht aufgel\u00f6st werden -SM_RULEGROUP_PARAM_COUNT_MISMATCH=Die Gruppe {0} wird mit {1} Parametern aufgerufen, ben\u00f6tigt aber stattdessen {2} -SM_NAME_INVALID=Der Name {0} ist ung\u00fcltig -SM_GROUP_NAME_DUPLICATE=Der Gruppenname ''{0}'' wird bereits verwendet -SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE=Die {1} Variable {2} ist f\u00fcr die Transformation {0} unbekannt -SM_TARGET_TRANSFORM_OP_INVALID_TYPE=Die Variable {1} {0} vom Typ {2} ist ung\u00fcltig - muss ein Primitive sein -UNKNOWN_CODESYSTEM=Das CodeSystem {0} ist unbekannt -UNKNOWN_CODESYSTEM_VERSION=Das CodeSystem {0} Version {1} ist unbekannt. G\u00fcltige Versionen: {2} -UNABLE_TO_INFER_CODESYSTEM=Die System-URI konnte f\u00fcr den Code {0} im ValueSet {1} nicht ermittelt werden -VALUESET_TOO_COSTLY=Das ValueSet {0} hat zu viele Codes f\u00fcr die Anzeige ({1}) -NO_VALID_DISPLAY_FOUND_one=Keine g\u00fcltigen Display Names f\u00fcr {1}#{2} in der Sprache {3} gefunden -NO_VALID_DISPLAY_FOUND_other=Keine g\u00fcltigen Display Names f\u00fcr {1}#{2} in den Sprachen {3} gefunden -SD_NO_CONTEXT_WHEN_NOT_EXTENSION=Der Typ ist {0}, so dass ein Erweiterungskontext nicht angegeben werden sollte -SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION=Der Typ ist {0}, so dass keine Erweiterungskontextinvarianten angegeben werden sollten. -SD_CONTEXT_SHOULD_NOT_BE_ELEMENT=\u00dcberpr\u00fcfen Sie den Erweiterungstyp: Extensions sollten nicht den Kontext {0} haben, es sei denn, es ist wirklich beabsichtigt, dass sie \u00fcberall verwendet werden k\u00f6nnen. -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = +element__null_ = element = null: {0} +element_id__null__on_ = element id = null: {0} on {1} +error_writing_number__to_JSON = Fehler beim Schreiben der Nummer ''{0}'' in JSON +getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList sollte nur aufgerufen werden, wenn das Element Slicing hat +needs_a_snapshot = ben\u00f6tigt einen Snapshot +no_base_profile_provided = kein Basisprofil vorhanden +no_derived_structure_provided = keine abgeleitete Struktur vorhanden. +no_url_in_expand_value_set = keine Url im expand value set +no_url_in_expand_value_set_2 = keine Url im expand value set 2 +no_value_set = kein value set +not_done_yet_cant_fetch_ = noch nicht implementiert: kann {0} nicht aufl\u00f6sen +not_the_right_kind_of_structure_to_generate_schematrons_for = nicht die richtige Art von Struktur zur Erzeugung von Schematrons +null_min = null min +reference_to__cannot_be_resolved = Referenz auf {0} kann nicht aufgel\u00f6st werden +type_on_first_differential_element = type des ersten differential elements definiert! +type_on_first_snapshot_element_for__in__from_ = type des ersten snapshot elements definiert f\u00fcr {0} in {1} von {2} +xml_attr_value_invalid = Das XML-Attribut {0} enth\u00e4lt ein ung\u00fcltiges Zeichen +xml_encoding_invalid = Die XML-Kodierung ist ung\u00fcltig (muss UTF-8 sein) diff --git a/exec/pack/Messages_es.properties b/exec/pack/Messages_es.properties index 0468a4e2f..9093bdf92 100644 --- a/exec/pack/Messages_es.properties +++ b/exec/pack/Messages_es.properties @@ -1,19 +1,46 @@ -#InstanceValidator -Bad_file_path_error = \n********************\n* El nombre del fichero especificado, ''{0}'', no existe en el sistema de archivos local.\n* Por favor verifique que sea una ubicación válida.\n********************\n\n +# InstanceValidator = one,many,other +ALL_OK = TODO OK +ARRAY_CANNOT_BE_EMPTY = El vector no puede estar vacío - la propiedad no debe estar presente si no tiene valores +Adding_wrong_path = Agregando un path erroneo +Adding_wrong_path__outcomegetPath___resultPathBase__ = Se agregó un path erróneo - outcome.getPath() = {0}, resultPathBase = {1} +Adding_wrong_path_in_profile___vs_ = Se agrego el path incorrecto en el perfil {0}: {1} vs {2} +All_observations_should_have_a_performer = !!Todos los recursos Observation deben tener un elemento performer +All_observations_should_have_a_subject = !!Todos los recursos Observation deben tener un elemento subject +All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = !!Todos los recursos Observation deben tener un elemento effectiveDateTime o effectivePeriod +Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Intento de particionar un elemento que no tiene repeticiones: {0}/{1} de {2} en {3}, en el elemento {4} (partición = {5}) +Attempt_to_replace_element_name_for_a_nonchoice_type = Intento de reemplazar un nombre de elemento por un tipo que no es una opción +Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Intento de utilizar el servidor terminológico pero no hay ninguno disponible +Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Intento de usar un snapshot en el perfil ''{0}'' como {1} antes que se genere +BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Excepto para transacciones o lotes , cada elemento entry en un recurso Bundle debe tener un elemento fullUrl cuya identidad es la del recurso contenido en el elemento entry +BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = La Entry {0} coincide con la referencia {1} por tipo e id pero no coincide el fullUrl del destino {2} por reglas de resolución de Bundle +BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = La Entry {0} coincide con la referencia {1} por tipo e id pero su fullUrl {2} no coincide el full Url del destino {3} por reglas de resolución de Bundle +BUNDLE_POSSSIBLE_MATCHES = El Bundle no contiene una coincidencia para {1} según las reglas de la resolución de referencias en Bundles, pero tiene varios recursos que coinciden {0} por tipo de recurso e id +BUNDLE_RULE_INVALID_INDEX = El indice de la regla de Bundle no es válido ({0}) +BUNDLE_RULE_NONE = Sin reglas +BUNDLE_RULE_PROFILE_UNKNOWN = El perfil de reglas del Bundle {1} es desconocido para {0} +BUNDLE_RULE_UNKNOWN = LA regla del Bundle refiere a un recurso inválido {0} +BUNDLE_SEARCH_ENTRY_NO_RESOURCE = Las Entry en los Bundles de tipo searchset deben contener recursos +BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Los resultados de las búsquedas deben tener id +BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Imposible determinar si este recurso es del tipo válido para esta búsqueda +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = Este no es un recurso coincidente con lo esperado para la búsqueda ({0} esperando {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = Este no es un tipo de recurso coincidente para la búsqueda (¿hace falta un modo de búsqueda?) ({0} esperando {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = Este no es un recurso OperationOutcome ({0}) +BUNDLE_SEARCH_NOSELF = Los Bundles de tipo searchset deben tener un vinculo de tipo self que especifique cual fue la búsqueda +BUNDLE_SEARCH_NO_MODE = Los bundles de tipo searchset deben tener modos de busqueda en los elementos entry +BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = No se han podido determinar tipos por la cadena de búsqueda, asi que los tipos no pueden ser validados +Bad_file_path_error = !!\n********************\n* El nombre del fichero especificado, ''{0}'', no existe en el sistema de archivos local.\n* Por favor verifique que sea una ubicación válida.\n********************\n\n +Base__Derived_profiles_have_different_types____vs___ = Los perfiles base y derivados tienen tipos distintos ({0} = {1} vs {2} = {3}) +Base_profile__has_no_type = El perfil basee {0} no tiene tipo Bundle_BUNDLE_Entry_Canonical = La URL canónica ({0}) no puede coincidir con la fullUrl ({1}) salvo en el servidor canónico Bundle_BUNDLE_Entry_Document = El primer elemento de tipo entry en un documento debe ser un recurso Composition Bundle_BUNDLE_Entry_IdUrlMismatch = EL ID del Recurso no coincide con el ID en la fullUrl del elemento entry (''{0}'' vs ''{1}'') Bundle_BUNDLE_Entry_MismatchIdUrl = La URL canónica ({0}) no puede coincidir con el elemento fullUrl ({1}) a menos que el id del recurso ({2}) también coincida +Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = El modelo lógico especificado {1} no ha sido encontrado para el recurso ''Binary/{0}'' Bundle_BUNDLE_Entry_NoFirst = Los documentos o mensajes deben contener al menos un elemento entry Bundle_BUNDLE_Entry_NoFirstResource = No hay ningún recurso en el primer elemento entry Bundle_BUNDLE_Entry_NoFullUrl = El elemento entry del Bundle no tiene elemento fullUrl -BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Excepto para transacciones o lotes , cada elemento entry en un recurso Bundle debe tener un elemento fullUrl cuya identidad es la del recurso contenido en el elemento entry -Bundle_BUNDLE_Entry_NoProfile_TYPE = No se ha encontrado el perfil para el recurso {0} de tipo ''{1}'' Bundle_BUNDLE_Entry_NoProfile_EXPL = El perfil especificado {2} not ha sido encontrado para el recurso {0} de tipo ''{0}'' -Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = El modelo lógico especificado {1} no ha sido encontrado para el recurso ''Binary/{0}'' -Bundle_BUNDLE_Entry_NotFound = No se puede encontrar ''{0}'' en el recurso Bundle ({1}) -Bundle_BUNDLE_Entry_Orphan = La Entry {0} no es alcanzable desde la primera entry del Bundle -BUNDLE_BUNDLE_ENTRY_REVERSE = La Entry {0} no es alcanzable atravesando hacia adelante desde la primera entry del Bundel, y no es un tipo de recurso que habitualmente se use de esta manera - verifique que no se haya perdido +Bundle_BUNDLE_Entry_NoProfile_TYPE = No se ha encontrado el perfil para el recurso {0} de tipo ''{1}'' Bundle_BUNDLE_Entry_Type = El tipo ''{0}'' no es válido - no se permiten recursos aquí (permitido = {1}) Bundle_BUNDLE_Entry_Type2 = El tipo ''{0}'' no es válido - debe ser {1} (permitido = {2}) Bundle_BUNDLE_Entry_Type3_one = El tipo ''{1}'' no es válido - debe ser de tipo {2} @@ -23,16 +50,78 @@ Bundle_BUNDLE_FullUrl_Missing = La referencia relativa aparece dentro de un Bund Bundle_BUNDLE_FullUrl_NeedVersion = Las entradas que coinciden con el elemento fullURL {0} deben declarar los elementos meta/versionId porque son referencias a versión específica Bundle_BUNDLE_MultipleMatches = Hay multiples coincidencias en el Bundle para la referencia {0} Bundle_BUNDLE_Not_Local = La referencia de tipo URN no está contenida localmente dentro del Bundle {0} -Bundle_MSG_Event_Count = Se esperaban {0} pero se encontraron {1} elementos event -Bundle_Document_Date_Missing = Un documento debe tener un elemento date +Bundle_Document_Date_Missing = !!Un documento debe tener un elemento date Bundle_Document_Date_Missing_html = El valor [(type = ''document'') implica (meta.lastUpdated.hasValue())] +Bundle_MSG_Event_Count = Se esperaban {0} pero se encontraron {1} elementos event +CDATA_is_not_allowed = CDATA no está permitido +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = Los CodeSystems definidos por HL7 DEBEN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = Los CodeSystems definidos por HL7 DEBERIAN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = Los CodeSystems NO DEBERIAN tener un valor definido para el elemento {0} si son un suplemento +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = !!Los CodeSystem suplementarios con un valor de content = 'supplement' CodeSystem deben tener un elemento suplements que documenta cual es el code system que suplementan +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = !!Los CodeSystem suplementarios DEBEN tener un valor de content = 'supplement' +CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = Los CodeSystems no definidos por HL7 DEBERIAN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente +CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} es un suplemento, asi que no puede usarse en Coding.system +CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Revisar odos los conjuntos de valores All Codes - los CodeSystems incompletos no deberian tener especificado ''All Codes'' +CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} no se pudo encontrar, por lo que no puede verificarse la validez de los conceptos +CODESYSTEM_CS_SUPP_INVALID_CODE = El código ''{1}'' no se declaró en el CodeSystem base {0} asi que no es válido en el suplemento +CODESYSTEM_CS_UNK_EXPANSION = !!El código provisto ({2}) no está en el conjunto de valores {0}, y se requiere un código de este conjunto de valores. El sistema {1} es desconocido. +CODESYSTEM_CS_VS_EXP_MISMATCH = El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero es una expansión con la cantidad incorrecta de conceptos (encontrados {2}, esperados {3}) +CODESYSTEM_SHAREABLE_EXTRA_MISSING = !!The ShareableCodeSystem profile recommends that the {0} element se complete, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet +CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = !!!!El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet +CODESYSTEM_SHAREABLE_MISSING = !!El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet +CODESYSTEM_SHAREABLE_MISSING_HL7 = !!!!El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet +Can_only_specify_profile_in_the_context = Solo se puede especificar perfil en el contexto +Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Un elemento polimórfico no puede tener hijos- debe particionar y restringir los tipos antes (sortElements: {0}:{1}) CapabalityStatement_CS_SP_WrongType = Discordancia de Tipos - El tipo del parametro de busqueda SearchParameter ''{0}'' es {1}, pero el tipo aquí es {2} +Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Referencias circulares detectadas en el snapshot, no se puede generar el snapshot (stack = {0}) CodeSystem_CS_VS_IncludeDetails = El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero el include tiene detalles adicionales -CodeSystem_CS_VS_Invalid = El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero no tiene un solo include -CODESYSTEM_CS_VS_EXP_MISMATCH = El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero es una expansión con la cantidad incorrecta de conceptos (encontrados {2}, esperados {3}) -CodeSystem_CS_VS_WrongSystem = El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero no tiene un system coincidente ({2}) -Extension_EXTP_Context_Wrong = La extensión {0} no está permitida en este punto (permitido = {1}; este elemento es {2}) +CodeSystem_CS_VS_Invalid = !!El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero no tiene un solo include +CodeSystem_CS_VS_WrongSystem = !!El CodeSystem {0} tiene un set de valores ''all system'' de {1}, pero no tiene un system coincidente ({2}) +Code_found_in_expansion_however_ = El código se encontró en la expansión, sin embargo: {0} +Coding_has_no_system__cannot_validate = !!El Coding no tiene sistema - no puede ser validado +Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = El recurso contenido no parece ser un recurso FHIR (nombre desconocido ''{0}'') +Could_not_match_discriminator_for_slice_in_profile_one = No se encontró coincidencia para el discriminador ({0}) para la partición {1} en el perfil {2} - el discriminador {3} no tiene valor fijo, enlace o una declaración de existencia +Could_not_match_discriminator_for_slice_in_profile_many = No se encontraron coincidencias con discriminadores ({1}) para la partición {2} en el perfil {3} - Ninguno de los {0} discriminadores {4} tiene valor fijo, enlace o una declaración de existencia +Could_not_match_discriminator_for_slice_in_profile_other = No se encontraron coincidencias con discriminadores ({1}) para la partición {2} en el perfil {3} - Ninguno de los {0} discriminadores {4} tiene valor fijo, enlace o una declaración de existencia +DISCRIMINATOR_BAD_PATH = Error procesando la expresión para el discriminador: {0} (src = ''{1}'') +DUPLICATE_ID = Valor de id duplicado ''{0}'' +Delimited_versions_have_exact_match_for_delimiter____vs_ = Las versiones delimitadas tienen una coincidencia exacta con el delimitador ''{0}'' : {1} vs {2} +Derived_profile__has_no_derivation_value_and_so_cant_be_processed = El perfil derivado {0} no tiene valor de derivación por lo cual no puede ser procesado +Derived_profile__has_no_type = El perfil derivado {0} no tiene tipo +Details_for__matching_against_Profile_ = Detalles para {0} coincidente con el perfil {1} +Did_not_find_single_slice_ = No se encontró una partición única: {0} +Did_not_find_type_root_ = No se encontró el tipo raiz : {0} +Differential_does_not_have_a_slice__b_of_____in_profile_ = El diferencian en el perfil {5} no tiene una partición en {6} (en {0}, posición {1} de {2} / {3} / {4}) +Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = La recorrida del diferencial llega a ''{0} (@ {1})'', pero el recurso base no, y no hay un único tipo fijo. El tipo es {2}. Esto no está soportado aún +Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = El discriminador ({0}) está basado en la existencia de un elemento, pero la partición {1} no define cardinalidad min>=1 o max=0 +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_many = El discriminador ({1}) está basado en tipos, pero la partición {2} en {3} tiene {0} tipos: {4} +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = El discriminador ({1}) está basado en tipos, pero la partición {2} en {3} tiene {0} tipos: {4} +Discriminator__is_based_on_type_but_slice__in__has_no_types = El discriminador ({0}) se basa en tipo, pero la partición {1} en {2} no tiene tipos +Display_Name_for__should_be_one_of__instead_of_one = El nombre de display para {1}#{2} debe ser ''{3}'', no ''{4}'' +Display_Name_for__should_be_one_of__instead_of_many = El nombre de display para {1}#{2} debe ser uno de estas opciones {0} de ''{3}'', no ''{4}'' +Display_Name_for__should_be_one_of__instead_of_other = El nombre de display para {1}#{2} debe ser uno de estas opciones {0} de ''{3}'', no ''{4}'' +Does_not_match_slice_ = No coincide con la partición ''{0}'' (discriminador: {1}) +Duplicate_Resource_ = Recurso duplicado {0} de tipo {3} (versión existente {2}, nueva versión {1}) +ELEMENT_CANNOT_BE_NULL = !!El elemento no puede ser ''null'' +ERROR_GENERATING_SNAPSHOT = Error generando el Snapshot: {0} (esto usualmente ocurre por problemas en el diferencial) +EXTENSION_EXTM_CONTEXT_WRONG_XVER = The modifier extension {0} from FHIR version {3} no se puede utilizar en este punto (permitido = {1}; este elemento es [{2}; esto es una advertencia ya que los contextos pueden haber sido renombrados entre versiones de FHIR) +EXTENSION_EXTP_CONTEXT_WRONG_XVER = La extensión {0} de la versión FHIR {3} no se puede utilizar en este punto (permitido = {1}; este elemento es [{2}; esto es una advertencia ya que los contextos pueden haber sido renombrados entre versiones de FHIR) +Element_must_have_some_content = El elemento debe tener algun contenido +Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Error en {0}#{1}: El perfil destino {2} no es una restricción válida sobre la base ({3}) +Error_at_path__Slice_for_type__has_more_than_one_type_ = Error en el path{0}: La partición para el tipo ''{1}'' tiene más de un tipo ''{2}'' +Error_at_path__Slice_for_type__has_wrong_type_ = Error en el path{0}: La partición para el tipo ''{1}'' es del tipo incorrecto ''{2}'' +Error_at_path__Slice_name_must_be__but_is_ = Error en el path{0}: El nombre de la particiópn debe ser ''{1}'' pero es ''{2}'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.count() > 1 +Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.path != ''$this'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.type != ''type'' +Error_at_path__in__Type_slicing_with_slicingordered__true = Error en el path{0} en {1}: La partición por tipo con slicing.ordered = true +Error_expanding_ValueSet_running_without_terminology_services = Error expandiendo el ValueSet: corriendo sin servicios terminológicos +Error_generating_table_for_profile__ = Error generando la tabla para el perfil {0}: {1} +Error_in_profile__at__Base_isSummary___derived_isSummary__ = Error en perfiles {0} de {1}: El recurso Base isSummary = {2}, derivado isSummary = {3} +Error_reading__from_package__ = Error leyendo {0} del paquete {1}#{2}: {3} +Error_validating_code_running_without_terminology_services = !!Error validando código: corriendo sin servicios terminológicos Extension_EXTM_Context_Wrong = El uso de la extensión modificante {0} no es permitido en este punto (permitido = {1}; este elemento es {2}) +Extension_EXTP_Context_Wrong = La extensión {0} no está permitida en este punto (permitido = {1}; este elemento es {2}) Extension_EXT_Count_Mismatch = Discordancia en la cantidad de extensiones: se esperaban {0} pero se encontraron {1} Extension_EXT_Count_NotFound = Discordancia en la cantidad de extensiones: no se pudo encontrar la extensión: {0} Extension_EXT_Fixed_Banned = No se permiten extensiones, ya que el valor fijo especificado no contiene extensiones @@ -46,32 +135,178 @@ Extension_EXT_SubExtension_Invalid = La url para la sub-extensión ''{0}'' no ha Extension_EXT_Type = La definición para la Extensión ''{0}'' permite los tipos {1} pero se encontró {2} Extension_EXT_URL_Absolute = El elemento extension.url debe ser una URL absoluta Extension_EXT_Unknown = Extension desconocida {0} -Extension_EXT_Unknown_NotHere = La extension {0} es desconocida y no está permitida aquí -Extension_EXT_Url_NotFound = El elemento Extension.url es requerido +Extension_EXT_Unknown_NotHere = !!La extension {0} es desconocida y no está permitida aquí +Extension_EXT_Url_NotFound = !!El elemento Extension.url es requerido Extension_EXT_Version_Internal = Estado ilegal para el estado de evaluación de la url para la extensión ''{0}'' Extension_EXT_Version_Invalid = La url de la Extension ''{0}'' no es válida (Versión inválida ''{1}'') Extension_EXT_Version_InvalidId = La url de la Extension ''{0}'' no es válida (Elemento id inválido ''{1}'') Extension_EXT_Version_NoChange = La url de la extensión ''{0}'' no es válida (El Elemento id ''{1}'' es válido, pero no puede utilizarse en un paradigma entre versiones porque no ha habido cambios entre las versiones relevantes) +Extension_PROF_Type = La definición del perfil ''{0}'' permite el tipo {1} pero se han encontrado tipo {2} +FHIRPATH_CANNOT_USE = Error evaluando la expresión FHIRPath: No puede utilizar {0} en este contexto porque {1} +FHIRPATH_CANT_COMPARE = Error evaluando la expresión FHIRPath: No se pueden comparar valores de tipo {0} y {1} +FHIRPATH_CHECK_FAILED = Error evaluando la expresión FHIRPath: La verificación {0} falló +FHIRPATH_CODED_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos string, code, uri, Coding, CodeableConcept pero se han encontrado {1} +FHIRPATH_CONTINUOUS_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un elemento decimal o fecha pero se han encontrado {1} +FHIRPATH_DECIMAL_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un elemento decimal pero se han encontrado {1} +FHIRPATH_DISCRIMINATOR_BAD_NAME = Nombre de función ilegal {0}() en el discriminador +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = expresión sintáctica ilegal en el discriminador (const) +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = expresión sintáctica ilegal en el discriminador (group ''{0}'') +FHIRPATH_DISCRIMINATOR_CANT_FIND = Imposible resolver el discriminador en las definiciones: {0} en el perfil {1} en el elemento {2}, buscando en el perfil {3} +FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Imposible resolver el discriminador{0} en {2} encontrado en las definiciones porque la extension {1} no ha sido encontrada en el perfil {3} +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_many = Error en el discriminador en {1}: no tiene hijos, {0} perfiles de tipo +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Error en el discriminador en {1}: no tiene hijos, {0} perfiles de tipo +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_many = Error en el discriminador en {1}: no tiene hijos , {0} tipos +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Error en el discriminador en {1}: no tiene hijos , {0} tipos +FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Error en el discriminador en {0}: se encontró un elemento particionado mientras se resolvía un valor fijo para una de las particiones +FHIRPATH_DISCRIMINATOR_NOTYPE = Error en el discriminador en {0}: no tiene hijos ni tipo +FHIRPATH_DISCRIMINATOR_NO_CODE = Uso ilegal de ofType() en el discriminador - Type no tiene codigo en {0} +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_many = Uso Ilegal de resolve() en el discriminador - {0} tipos posibles en {1} (puede ser uno solo) +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = Uso Ilegal de resolve() en el discriminador - {0} tipos posibles en {1} (puede ser uno solo) +FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Uso Ilegal de resolve() en el discriminador - el tipo en {0} no es Reference {1} +FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = uso ilegal de resolve() en el discriminador - elemento sin tipo en {0} +FHIRPATH_DISCRIMINATOR_TYPE_NONE = Uso ilegal de ofType() en el discriminador - no hay tipo en el elemento {0} +FHIRPATH_FOCUS_many = Error evaluando la expresión FHIRPath: el foco para {0} puede tener solo un valor, pero tiene {0} valores +FHIRPATH_FOCUS_other = Error evaluando la expresión FHIRPath: el foco para {0} puede tener solo un valor, pero tiene {0} valores +FHIRPATH_HO_HOST_SERVICES = Internal Error evaluando la expresión FHIRPath: No se proveen servicios de host ({0}) +FHIRPATH_LEFT_VALUE_many = Error evaluando la expresión FHIRPath: el operando a la izquierda de {1} puede tener solo 1 valor pero tiene {0} valores +FHIRPATH_LEFT_VALUE_other = Error evaluando la expresión FHIRPath: el operando a la izquierda de {1} puede tener solo 1 valor pero tiene {0} valores +FHIRPATH_LEFT_VALUE_WRONG_TYPE = Error evaluando la expresión FHIRPath: el operando a la izquierda de {0} tiene el tipo incorrecto {1} +FHIRPATH_LOCATION = (en {0}) +FHIRPATH_NOT_IMPLEMENTED = Error evaluando la expresión FHIRPath: La función {0} no fue implementada +FHIRPATH_NO_COLLECTION = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un valor singleton, pero se han encontrado {1} +FHIRPATH_NO_TYPE = !!Error evaluando la expresión FHIRPath: El tipo ''{0}'' es desconocido o no soportado en {1} +FHIRPATH_NUMERICAL_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos integer, decimal o Quantity pero se han encontrado {1} +FHIRPATH_OP_INCOMPATIBLE = Error evaluating FHIRPath expression {0}: los operandos a la izquierda y a la derecha tienen tipos incompatibles o inválidos ({1}, {2}) +FHIRPATH_ORDERED_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para colecciones ordenadas +FHIRPATH_PARAM_WRONG = Error evaluando la expresión FHIRPath: El tipo de expresión {0} no está soportado {1} para la función {2} +FHIRPATH_REFERENCE_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos string, uri, canonical or Reference pero se han encontrado {1} +FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Problema con el uso de resolve() - el perfil {0} en {1} no pudo ser resuelta +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_many = Uso Ilegal de resolve() en el discriminador - {0} perfiles destino posibles de tipo en {1} (solo puede ser uno) +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Uso Ilegal de resolve() en el discriminador - {0} perfiles destino posibles de tipo en {1} (solo puede ser uno) +FHIRPATH_RIGHT_VALUE_many = Error evaluando la expresión FHIRPath: el operando a la derecha de {1} puede tener solo 1 valor pero tiene {0} valores +FHIRPATH_RIGHT_VALUE_other = Error evaluando la expresión FHIRPath: el operando a la derecha de {1} puede tener solo 1 valor pero tiene {0} valores +FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Error evaluando la expresión FHIRPath: el operando a la derecha de {0} tiene el tipo incorrecto {1} +FHIRPATH_STRING_ORD_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para colecciones ordenadas de tipo string, uri, code, id pero se han encontrado {1} +FHIRPATH_STRING_SING_ONLY = !!Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para string, uri, code, id pero se han encontrado {1} +FHIRPATH_UNABLE_BOOLEAN = Imposible evaluar como boolean : {0} +FHIRPATH_UNKNOWN_CONSTANT = Error evaluando la expresión FHIRPath: Constante FHIR Inválida {0} +FHIRPATH_UNKNOWN_CONTEXT = Contexto desconocido evaluando la expresión FHIRPath: {0} +FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Elemento de contexto desconocido evaluando la expresión FHIRPath: {0} +FHIRPATH_UNKNOWN_NAME = !!Error evaluando la expresión FHIRPath: El nombre {0} no es válido para ninguno de los posibles tipos: {1} +FHIRPATH_WRONG_PARAM_TYPE = Error evaluando la expresión FHIRPath: El tipo de parametro {2} no es válido para {0} parametro {1}. esperando {3} Fixed_Type_Checks_DT_Address_Line = Esperados {0} pero encontrados {1} elementos line Fixed_Type_Checks_DT_Name_Family = Esperados {0} pero encontrados {1} elementos family Fixed_Type_Checks_DT_Name_Given = Esperados {0} pero encontrados {1} elementos given Fixed_Type_Checks_DT_Name_Prefix = Esperados {0} pero encontrados {1} elementos prefix Fixed_Type_Checks_DT_Name_Suffix = Esperados {0} pero encontrados {1} elementos suffix +Found__items_for__resolving_discriminator__from_ = Se han encontrado {0} items para {1} resolviendo el discriminator {2} de {3} +INV_FAILED = !!La regla {0} falló +Illegal_path__in_differential_in__illegal_character_ = Path inválido ''{0}'' en el diferencial en {1}: caracter inválido ''{2}'' +Illegal_path__in_differential_in__illegal_characters_ = Path inválido ''{0}'' en el diferencial en {1}: caracteres inválidos [] +Illegal_path__in_differential_in__must_start_with_ = !!Path inválido ''{0}'' en el diferencial en {1}: debe comenzar con {2}.{3} +Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Path inválido ''{0}'' en el diferencial en {1}: name portion exceeds 64 chars in length +Illegal_path__in_differential_in__name_portion_mising_ = Path inválido ''{0}'' en el diferencial en {1}: falta la parte del nombre (''..'') +Illegal_path__in_differential_in__no_unicode_whitespace = Path inválido ''{0}'' en el diferencial en {1}: no unicode whitespace Internal_INT_Bad_Type = Tipo de valor fijo no gestionado {0} +Internal_error___type_not_known_ = Error interno - tipo desconocido {0} +Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist = Partición inválida: hay mas de una partición por tipo en {0}, pero una de ellas ({1}) tiene cardinalidad min = 1, asi que el resto de las particiones no puede existir Language_XHTML_Lang_Different1 = El recurso tiene un elemento language ({0}), y el XHTML tiene un etiqueta lang ({1}), pero difieren Language_XHTML_Lang_Different2 = El recurso tiene un elemento language ({0}), y el XHTML tiene una etiqueta xml:lang ({1}), pero difieren Language_XHTML_Lang_Missing1 = El recurso tiene un elemento language, pero el XHTML no tiene etiquetas lang o xml:lang tag (necesita ambos - ver https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) Language_XHTML_Lang_Missing2 = El recurso tiene un elemento language, pero el XHTML no tiene etiqueta lang (necesita ambas lang y xml:lang - ver https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) Language_XHTML_Lang_Missing3 = El recurso tiene un elemento language, pero el XHTML no tiene etiqueta xml:lang (necesita ambas lang and xml:lang - ver https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +MEASURE_MR_GRP_DUPL_CODE = El código para este grupo está duplicado con otro grupo +MEASURE_MR_GRP_MISSING_BY_CODE = El MeasureReport no incluye un grupo para el grupo {0} +MEASURE_MR_GRP_NO_CODE = El grupo debe tener un código que coincide con la definición del grupo en la medida +MEASURE_MR_GRP_NO_USABLE_CODE = Ninguno de los códigos provistos se puede utilizar para comparar - necesita completar system y code en al menos un elemento code +MEASURE_MR_GRP_NO_WRONG_CODE = El codigo provisto ({0}) no coincide con el codigo definido para el reporte ({1}) +MEASURE_MR_GRP_POP_COUNT_MISMATCH = Discordania entre count {0} y la cantidad de pacientes {1} +MEASURE_MR_GRP_POP_DUPL_CODE = El código para este grupo poblacional está duplicado en otro grupo +MEASURE_MR_GRP_POP_NO_CODE = El grupo debe tener un código que coincida con el código presente en la definicion poblacional incluida en la medida +MEASURE_MR_GRP_POP_NO_COUNT = Count debe estar preseente para reportes donde el tipo es ''subject-list'' +MEASURE_MR_GRP_POP_NO_SUBJECTS = Reportes donde el tipo es ''subject-list'' no tiene pacientes listados +MEASURE_MR_GRP_POP_UNK_CODE = El código para este grupo de población no coincide con ninguno en la definición de la medida +MEASURE_MR_GRP_UNK_CODE = El código para este grupo no tiene coincidencia en la definición de la medida +MEASURE_MR_M_SCORING_UNK = El sistema de scoring en esta medida es desconocido por lo que el valor de measureScore no puede ser verificado +MEASURE_MR_SCORE_FIXED = Este valor está fijado por el recurso Measure a {0} +MEASURE_MR_SCORE_PROHIBITED_MS = No deberia haber measureScore cuando el scoring del mensaje es ''cohort'' +MEASURE_MR_SCORE_PROHIBITED_RT = No deberia haber measureScore donde el tipo de reporte es ''data-collection'' +MEASURE_MR_SCORE_REQUIRED = Se requiere un elemento measureScore cuando Measure.scoring={0} +MEASURE_MR_SCORE_UNIT_PROHIBITED = Un measureScore para esta Measure Scoring ({0}) no deberia tener unidades +MEASURE_MR_SCORE_UNIT_REQUIRED = La unidad debe estar presente cuando el tipo de scoring es {0} +MEASURE_MR_SCORE_VALUE_INVALID_01 = El valor es inválido - debe ser entre 0 y 1 +MEASURE_MR_SCORE_VALUE_REQUIRED = Se requiere un valor cuando Measure.scoring = {0} +MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Error en {0}: La versión compilada de CQL no es válida +MEASURE_M_CRITERIA_CQL_ERROR = Error en {0}: ''{1}'' +MEASURE_M_CRITERIA_CQL_LIB_DUPL = Multiples bibliotecas encontradas para el espacio de nombres {0} +MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = No hay Library para el espacio de nombres {0} +MEASURE_M_CRITERIA_CQL_NOT_FOUND = La función {1} no existe en la biblioteca {0} +MEASURE_M_CRITERIA_CQL_NO_ELM = Error en {0}: No se encontreo una versión compilada de CQL +MEASURE_M_CRITERIA_CQL_NO_LIB = No CQL Libraries found on this Measure +MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = Si la expresión CQL no incluye un espacio de nombres solo puede haber un Library para la medida +MEASURE_M_CRITERIA_UNKNOWN = El lenguaje para expresiones {0} no es soportado, asi que no puede ser validado +MEASURE_M_GROUP_CODE = Los grupos deben tener códigos donde hay mas de un grupo +MEASURE_M_GROUP_POP = Los grupos de las medidas deben definir al menos una población +MEASURE_M_GROUP_POP_NO_CODE = Un grupo de poblacion en una medida debe tener un codigo cuando hay mas de una población definida +MEASURE_M_GROUP_STRATA_COMP_NO_CODE = Un componente de un estratificador de un grupo de medidas debe tener un codigo cuando hay mas de una población definida +MEASURE_M_GROUP_STRATA_NO_CODE = Un estratificador de un grupo de medidas debe tener un codigo cuando hay mas de una población definida +MEASURE_M_LIB_UNKNOWN = La Library {0} no pudo ser resuelta, asi que la expresión de validación puede no ser correcta +MEASURE_M_NO_GROUPS = Una medida debe contener como mínimo un grupo +MEASURE_SHAREABLE_EXTRA_MISSING = !!El perfil ShareableMeasure recomienda que el elemento {0} se complete, pero no está presente. Las medidas publicadas DEBERIAN conformar al perfil ShareableMeasure +MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = !!!!El perfil ShareableMeasure recomienda que el elemento {0} se complete, pero no se encontró. Las medidas publicadas por HL7 DEBEN conformar al perfil ShareableMeasure +MEASURE_SHAREABLE_MISSING = !!El perfil ShareableMeasure dice que el elemento {0} es obligatorio, pero no está presente. Las medidas publicadas DEBERIAN conformar al perfil ShareableMeasure +MEASURE_SHAREABLE_MISSING_HL7 = !!!!El perfil ShareableMeasure dice que el elemento {0} es obligatorio, pero no se encontró. Las medidas publicadas por HL7 DEBEN conformar al perfil ShareableMeasure +MULTIPLE_LOGICAL_MODELS_many = {0} Modelos Lógicos encontrados en los perfiles provistos, asi que es imposible analizar el modelo lógico(puede ser solo uno, se encontraron {1}) +MULTIPLE_LOGICAL_MODELS_other = {0} Modelos Lógicos encontrados en los perfiles provistos, asi que es imposible analizar el modelo lógico(puede ser solo uno, se encontraron {1}) +Measure_MR_M_None = No se identifica un elemento Measure, asi que no se puede validar contra el elemento Measure +Measure_MR_M_NotFound = El elemento Measure ''{0}'' no pudo ser resuelto, asi que no se puede validar contra el elemento Measure Meta_RES_Security_Duplicate = Etiqueta de Seguridad Duplicada {0} MustSupport_VAL_MustSupport = El elemento {0} no está marcado como ''mustSupport'' en el perfil {1}. Considere no usar el elemento, o marcar el elemento como must-Support en el perfil +Named_items_are_out_of_order_in_the_slice = Los items nominados están fuera de orden en la partición +No_ExpansionProfile_provided = No se provee ExpansionProfile +No_Expansion_Parameters_provided = No se proveen parametros de expansion +No_Parameters_provided_to_expandVS = No se proveen parametros para expandVS +No_path_on_element_Definition__in_ = No hay path en la definición del elemento {0} en {1} +No_path_on_element_in_differential_in_ = No hay path en el elemento en el diferencial en {0} +No_path_value_on_element_in_differential_in_ = No hay valor de path en el elemento en el diferencial en {0} +No_processing_instructions_allowed_in_resources = No se permiten instrucciones de procesamiento dentro de los recursos +No_reference_resolving_discriminator__from_ = No se encontró referencia resolviendo el discriminador {0} de {1} +No_type_found_on_ = No se encontro el tipo en ''{0}'' +No_validator_configured = No se ha configurado el validador +Node_type__is_not_allowed = El tipo de nodo {0} no está permitido +None_of_the_provided_codes_are_in_the_value_set_many = Ninguno de los códigos provistos está en el conjunto de valores {0} +None_of_the_provided_codes_are_in_the_value_set_other = Ninguno de los códigos provistos está en el conjunto de valores {0} +Not_done_yet = No implementado aún +Not_done_yet_ValidatorHostServicescheckFunction = No realizado aún (ValidatorHostServices.checkFunction) +Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = No realizado aun (ValidatorHostServices.conformsToProfile), cuando el item no es un elemento +Not_done_yet_ValidatorHostServicesexecuteFunction = No realizado aún (ValidatorHostServices.executeFunction) +Not_done_yet__resolve__locally_2 = No realizado aún - resolver {0} localmente (2) +Not_handled_yet_sortElements_ = No soportado aún (sortElements: {0}:{1}) +OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = Este objeto no puede ser un array json con claves porque no tiene dos hijos en la definición (children = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = Este objeto está definido como un Array json con claves pero la propidad valor designada en las definiciones es una opción - esto no está soportado (valor property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = Este objeto está definido como un Array json con claves pero la propiedad valor designada en las definiciones es una lista - esto no está soportado (valor property = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = Este objeto está definido como un Array json con claves pero la definición no denomina al primer elemento hijo como la clave (children = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = Este objeto está definido como un Array json con claves pero la propiedad clave definida no es un tipo primitivo (children = {0}, type = {1}) +Object_must_have_some_content = El objeto debe tener algún contenido +PACKAGE_VERSION_MISMATCH = Discordancia de versión de FHIR en el paquete {0}: la versión es {2} pero debe ser {1} (path: {3}) +PATTERN_CHECK_STRING = El patrón [{0}] definido en el perfil {1} no fue encontrado. Problemas: {2} +Parser_Type__not_supported = El tipo de Parser {0} no es soportado +Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Problema evaluando la expresión de partición para el elemento en el perfil {0} path {1} (fhirPath = {2}): {3} +Problem_processing_expression__in_profile__path__ = Problema procesando la expresión ''{0}'' en el perfil ''{1}'' en el path ''{2}'': {3} Profile_EXT_Not_Here = La extensión {0} no se puede utilizar en este punto (basado en el invariante contextual ''{1}'') Profile_VAL_MissingElement = El elemento ''{0}'' no se encuentra - es obligatorio en base al valor fijo asignado por el perfil {1} Profile_VAL_NotAllowed = El elemento {0} está presente en la instancia pero no puede ser incluido en el elemento {1} especificado en el perfil -Measure_MR_M_None = No se identifica un elemento Measure, asi que no se puede validar contra el elemento Measure -Measure_MR_M_NotFound = El elemento Measure ''{0}'' no pudo ser resuelto, asi que no se puede validar contra el elemento Measure -Questionnaire_QR_Item_BadOption = El valor provisto ({0}::{1}) no está en el conjunto de valores para las opciones provisto por el cuestionario -Questionnaire_QR_Item_Coding = Error {0} validando el elemento Coding contra las opciones del Recurso Questionnaire +Profile___Error_generating_snapshot = Perfil {0} ({1}). Error generando el snapshot +Profile___base__could_not_be_resolved = Perfil {0} ({1}) la base {2} no puede ser resuelta +Profile___element__Error_generating_snapshot_ = Perfil {0} ({1}), elemento {2}. Error generando snapshot: {3} +Profile___has_no_base_and_no_snapshot = Perfil {0} ({1}) no tiene base ni snapshot +Profile__does_not_match_for__because_of_the_following_profile_issues__ = El perfil {0} no coincide para {1} por los siguientes problemas del perfil: {2} +Profile_based_discriminators_must_have_a_type__in_profile_ = Los discriminadores basados en perfiles deben tener un tipo ({0} en el perfil {1}) +Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Los discriminadores basados en perfiles deben tener un tipo con un perfil ({0} en el perfil {1}) +Profile_based_discriminators_must_have_only_one_type__in_profile_many = Los discriminadores basados en perfiles deben tener un solo tipo ({1} en el perfil {2}) pero se han encontrado {0} tipos +Profile_based_discriminators_must_have_only_one_type__in_profile_other = Los discriminadores basados en perfiles deben tener un solo tipo ({1} en el perfil {2}) pero se han encontrado {0} tipos +Questionnaire_QR_Item_BadOption = !!El valor provisto ({0}::{1}) no está en el conjunto de valores para las opciones provisto por el cuestionario +Questionnaire_QR_Item_Coding = Error {0} validando el elemento Coding contra las opciones del Recurso Questionnaire Questionnaire_QR_Item_CodingNoOptions = No se puede validar la opción del elemento Coding porque no se provee lista de opciones Questionnaire_QR_Item_DateNoOptions = No se puede validar la opción de fecha porque no se ha provisto una lista de opciones Questionnaire_QR_Item_Display = Los items que no sean de tipo DISPLAY no deben tener items - linkId {0} @@ -96,8 +331,6 @@ Questionnaire_QR_Item_NotEnabled = El Item tiene una respuesta (2), aun cuando n Questionnaire_QR_Item_NotEnabled2 = El Item tiene una respuesta, aun cuando no ha sido habilitado (item.id = ''{0}'') Questionnaire_QR_Item_NotFound = El LinkId ''{0}'' no ha sido encontrado en el cuestionario Questionnaire_QR_Item_OnlyOneA = Solo un item con respuesta se permite para items que tengan este linkId -#The following error cannot occur for a single item. _one case left intentionally blank. -Questionnaire_QR_Item_OnlyOneI_one = Questionnaire_QR_Item_OnlyOneI_many = Solo una respuesta permitida para el linkID {1} pero se encontraron {0} items Questionnaire_QR_Item_OnlyOneI_other = Solo una respuesta permitida para el linkID {1} pero se encontraron {0} items Questionnaire_QR_Item_Order = Error Estructural: los items están fuera de orden @@ -114,6 +347,8 @@ Questionnaire_Q_EnableWhen_IsInner = Las preguntas con una regla enableWhen no p Questionnaire_Q_EnableWhen_NoLink = Las preguntas con un enableWhen deben tener un valor para el Link de la pregunta Questionnaire_Q_EnableWhen_NoTarget = No se ha podido encontrar un item con el linkId ''{0}'' que se referencia en la regla enableWhen para ''{1}'' Questionnaire_Q_EnableWhen_Self = El destino para el enableWhen de esta pregunta no puede referenciarse a si misma +REFERENCE_REF_SUSPICIOUS = La sintaxis de la referencia ''{0}'' parece incorrecta y debe ser verificada +REFERENCE_REF_WRONGTARGET_LOAD = El tipo ''{2}'' no es un destino válido para el elemento {0} (debe ser {1}) Reference_REF_Aggregation = La referencia es {0} que no es soportada por los modos de agregación especificados para la referencia ({1}) Reference_REF_BadTargetType = Tipo de Recurso Destino Inválido. Se encontró {0}, pero se esperaba uno de ({1}) Reference_REF_BadTargetType2 = El tipo''{0}'' implicito por la URL de la referencia {1} no es un destino válido para este elemento (debe ser uno de {2}) @@ -129,64 +364,180 @@ Reference_REF_NoType = No se puede determinar el tipo del recurso destino Reference_REF_NotFound_Bundle = La referencia dentro del Bundle o recurso contenido no pudo encontrarse en el Bundle o Recurso {0} Reference_REF_ResourceType = La referencia coincidente para la referencia {0} tiene resourceType {1} Reference_REF_WrongTarget = El tipo ''{0}'' no es un destino válido para este elemento (debe ser uno de {1}) -REFERENCE_REF_WRONGTARGET_LOAD = El tipo ''{2}'' no es un destino válido para el elemento {0} (debe ser {1}) -Resource_RES_ID_Malformed_Length = El id del recurso es inválido: Muy Largo -Resource_RES_ID_Malformed_Chars = El id del recurso es inválido: Caracteres Inválidos +Reference__refers_to_a__not_a_ValueSet = La referencia {0} apunta a un {1} no a un ValueSet +Resource_RES_ID_Malformed_Chars = !!El id del recurso es inválido: Caracteres Inválidos +Resource_RES_ID_Malformed_Length = !!El id del recurso es inválido: Muy Largo Resource_RES_ID_Missing = El recurso requiere un elemento id, pero no se encontró ninguno Resource_RES_ID_Prohibited = El recurso tiene un elemento id, pero no está permitida su inclusión -Terminology_PassThrough_TX_Message = {0} para ''{1}#{2}'' -Terminology_TX_Binding_CantCheck = La Vinculación por referencia URI no pudo ser verificada -Terminology_TX_Binding_Missing = Falta la Vinculación con {0} (CodeableConcept) -Terminology_TX_Binding_Missing2 = Falta la Vinculación con {0} -Terminology_TX_Binding_NoServer = El valor provisto no puede ser validado en ausencia de un servidor terminológico -Terminology_TX_Binding_NoSource = La vinculación para {0} no tiene origen, asi que no ha podido ser verificada -Terminology_TX_Binding_NoSource2 = La vinculacieon no tiene origen, asi que no puede ser verificada -Terminology_TX_Code_NotValid = El código {0} no es un código válido en el sistema de codificación {1} -Terminology_TX_Code_Unknown = Código desconocido ({0}#{1}) -Terminology_TX_Code_ValueSet = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} -Terminology_TX_Code_ValueSet_MISSING = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores -Terminology_TX_Code_ValueSetMax = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} (conjunto maximo de valores {1}) -Terminology_TX_Code_ValueSet_Ext =No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} -Terminology_TX_Coding_Count = Esperados {0} pero encontrados {1} elementos coding -Terminology_TX_Confirm_1_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y se requieren códigos de este conjunto de valores (class = {1}) -Terminology_TX_Confirm_2_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) (class = {1}) -Terminology_TX_Confirm_3_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y se recomienda que los códigos provengan de este conjunto de valores (class = {1}) -Terminology_TX_Confirm_4a = El código provisto ({2}) no está en el conjunto de valores {0}, y un código de este conjunto de valores es requerido: {1} -Terminology_TX_Confirm_4b = Los códigos provistos ({2}) no están en el conjunto de valores {0}, y se requiere un código de este conjunto de valores: {1} -Terminology_TX_Confirm_5 = No se pudo confirmar que los códigos provistos vengan de este conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) -Terminology_TX_Confirm_6 = No se pudo confirmar que los códigos provistos vengan de este conjunto de valores {0}, y se recomienda que los códigos provengan de este conjunto de valores -Terminology_TX_Display_Wrong = El elemento Display deberia ser igual a ''{0}'' -Terminology_TX_Error_CodeableConcept = Error {0} validando el CodeableConcept -Terminology_TX_Error_CodeableConcept_Max = Error {0} validando el CodeableConcept usando maxValueSet -Terminology_TX_Error_Coding1 = Error {0} validando Coding -Terminology_TX_Error_Coding2 = Error {0} validando Coding: {1} -Terminology_TX_NoValid_1_CC = Ninguno de los codings provistos están en el conjunto de valores {0}, y se requiere un código de este conjunto de valores) (codes = {1}) -Terminology_TX_NoValid_10 = El código provisto no está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (code = {1}#{2}) -Terminology_TX_NoValid_11 = El código provisto no está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (code = {1}#{2}), error = {3}) -Terminology_TX_NoValid_12 = El Coding provisto ({2}) no está en el conjunto de valores{0}, y se requiere un código de este conjunto de valores: {1} -Terminology_TX_NoValid_13 = El Coding provisto ({2}) no está en el conjunto de valores{0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {1} -Terminology_TX_NoValid_14 = El Coding provisto ({2}) no está en el conjunto de valores{0}, y se recomienda que los códigos provengan de este conjunto de valores {1} -Terminology_TX_NoValid_15 = El valor provisto (''{0}'') no pudo ser validado en ausencia de un servidor terminológico -Terminology_TX_NoValid_16 = El valor provisto (''{0}'') no está en el conjunto de valores{1}, y se requiere un código de este conjunto de valores) {2} -Terminology_TX_NoValid_17 = El valor provisto (''{0}'') no está en el conjunto de valores{1}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {2} -Terminology_TX_NoValid_18 = El valor provisto (''{0}'') no está en el conjunto de valores{1}, y se recomienda que el código provengan de este conjunto de valores){2} -Terminology_TX_NoValid_2_CC = Ninguno de los codings provistos están en el conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) (codes = {1}) -Terminology_TX_NoValid_3_CC = Ninguno de los codings provistos están en el conjunto de valores {0}, y se recomienda que los códigos provengan de este conjunto de valores ) (codes = {1}) -Terminology_TX_NoValid_4 = El Coding provisto ({2}) no está en el conjunto de valores {0}, y se requiere un código de este conjunto de valores {1} -Terminology_TX_NoValid_5 = El Coding provisto ({2}) no está en el conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {1} -Terminology_TX_NoValid_6 = El Coding provisto ({2}) no está en el conjunto de valores {0}, y se recomienda que el código provengan de este conjunto de valores {1} -Terminology_TX_NoValid_7 = Ninguno de los códigos provistos pueden ser validados contra el conjunto de valores máximo {0}, (error = {2}) -Terminology_TX_NoValid_8 = Ninguno de los códigos provistos está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (codes = {1}) -Terminology_TX_NoValid_9 = Ninguno de los códigos provistos pueden ser validados contra el conjunto de valores máximo {0}, (error = {1}) -Terminology_TX_System_Invalid = URI de Sistema Inválido: {0} -Terminology_TX_System_NotKnown = El URI para el Code System ''{0}'' es desconocido asi que el código no puede ser validado -Terminology_TX_System_Relative = Coding.system debe ser una referencia absoluta, no una referencia local -Terminology_TX_System_Unknown = Sistema de Codificación Desconocido ''{0}'' -Terminology_TX_System_ValueSet = URI de Sistema Inválido: {0} - no se puede utilizar una URI de conjunto de valores como system -Terminology_TX_System_ValueSet2 = El elemento Coding referencia un set de valores, no un sistema de codificación (''{0}'') -Terminology_TX_ValueSet_NotFound = El ValueSet {0} no ha sido encontrado por el validador -Terminology_TX_ValueSet_NotFound_CS = Se encontró una refeencia a un CodeSystem ({0}) donde corresponde un ValueSet -Type_Specific_Checks_DT_Base64_Valid = El valor ''{0}'' no es un valor válido para Base64 +Resource_resolution_services_not_provided = Los servicios de resolución de recurso no han sido provistos +Resource_type_mismatch_for___ = Tipo de recurso no coincidente para {0} / {1} +SD_CONSTRAINED_KIND_NO_MATCH = La clase {0} debe ser la misma {1} en la estructura base {3} (tipo base = {2}) +SD_CONSTRAINED_TYPE_NO_MATCH = El tipo {0} debe ser el mismo en la estructura base {1} que está siendo restringida +SD_DERIVATION_KIND_MISMATCH = La definición de estructura restringe una clase de {0}, pero hay una diferente ({1}) +SD_ED_BIND_MULTIPLE_TYPES = El elemento {0} tiene una vinculación, y tiene multiples tipos sujetos a ser vinculados ({1}). La vinculación aplicará a todos los elementos contenidos +SD_ED_BIND_NOT_VS = La referencia al ValueSet {1} en el elemento apunta a algo que no es un conjunto de valores ({2}) +SD_ED_BIND_NO_BINDABLE = El elemento {0} tiene una vinculación, pero no se encuentran tipos vinculables {1} +SD_ED_BIND_UNKNOWN_VS = La referencia al ValueSet {1} en el elemento {0} no pudo ser resuelta +SD_ED_SHOULD_BIND = El elemento {0} tiene un tipo que deberia tener una vinculación terminológica ({1}), pero no está presente +SD_ED_SHOULD_BIND_WITH_VS = El elemento {0} tiene un tipo que deberia tener una vinculación terminológica ({1}), pero no tiene definido conjunto de valores +SD_ED_TYPE_NO_TARGET_PROFILE = El tipo {0} no permite perfiles destino +SD_ED_TYPE_PROFILE_IS_MODIFIER = El perfil {0} no es para una extensión modificante pero el elemento {3} es un modificador +SD_ED_TYPE_PROFILE_NOTYPE = Se encontró el perfil {0}, pero es imposible definir a que tipo aplica +SD_ED_TYPE_PROFILE_NOT_MODIFIER = El perfil {0} es para una extensión modificante pero el elemento {3} no es un modificador +SD_ED_TYPE_PROFILE_UNKNOWN = !!!!!!!!!!!!!!!!Imposible resolver el perfil {0} +SD_ED_TYPE_PROFILE_WRONG = El perfil {0} es para el tipo {1}, pero el elemento {3} es de tipo {2} +SD_ED_TYPE_PROFILE_WRONG_TARGET = El perfil {0} es para tipo {1}, que no es un {4} (que es requerido porque el elemento {3} es de tipo {2}) +SD_ILLEGAL_CHARACTERISTICS = Este elemento tiene un {0} pero los tipos {1} no hacen que este tipo de restricción sea relevante +SD_MUST_HAVE_DERIVATION = El recurso StructureDefinition {0} debe tener una derivación, ya que tiene un elemento baseDefinition +SD_NESTED_MUST_SUPPORT_DIFF = El elemento {0} tiene tipos/perfiles/destinos que están marcados como must-support pero el elemento en sí no está marcado como must-support. Los must-support internos serán ignorados a menos que que el elemento herede must-support = true +SD_NESTED_MUST_SUPPORT_SNAPSHOT = El elemento {0} tiene tipos/perfiles/destinos que están marcados como must-support pero el elemento en sí no está marcado como must-support. +SD_NO_TYPES_OR_CONTENTREF = El elemento {0} no tiene tipos asignados, y tampoco referencia a contenido alguno +SD_PATH_TYPE_MISMATCH = El path {1} debe empezar con el tipo de la estructura {0} +SD_SPECIALIZED_TYPE_MATCHES = El tipo {0} no debe ser la misma que el tipo en la estructura base {1} que se está especializando +SD_TYPE_MISSING = No se encontró tipo +SD_TYPE_NOT_DERIVED = El tipo {0} solo puede ser usado como tipo cuando se restringe la definición base del tipo +SD_TYPE_NOT_LOCAL = El tipo {0} no es legal porque no está definida en la especificación FHIR. Otros tipos deben tener un espacio de nombres sobre ellos +SD_TYPE_NOT_LOGICAL = !!El tipo {0} solo puede ser definido si la categoria es 'logical' no {1} +SD_TYPE_NOT_MATCH_NS = El espacio de nombres para el tipo {0} DEBERIA coincidir con el espacio de nombres de la url {1} para la definición del tipo +SD_VALUE_COMPLEX_FIXED = Para el tipo complejo {0}, considere usar un patrón en lugar de un valor fijo para evitar restringir la instancia más allá de lo imprescindible +SD_VALUE_TYPE_IILEGAL = El elemento {0} tiene un {1} de tipo {2}, que no está en la lista de tipos permitidos ({3}) +SD_VALUE_TYPE_REPEAT_HINT = El elemento repetitivo tiene un {1}. El {1} aplicará a todas las repeticiones (esto no ha quedado claro para todos los usuarios) +SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = El elemento repetitivo tiene un valor {1} para un tipo primitivo. EL validador DotNet no aplicará esto a todas las repeticiones. Esto es un error +SEARCHPARAMETER_BASE_WRONG = El tipo de recurso {1} no está listado como base en el SearchParameter está derivado de ({0}) +SEARCHPARAMETER_EXP_WRONG = La expresión ''{2}'' no es compatible con la expresión ''{1}'' en el SearchParameter derivedFrom {0}, y esto indica que la relación de derivación no es válida +SEARCHPARAMETER_NOTFOUND = Imposible encontrar el parámetro de búsqueda base {0} asi que no puede validarse que este SearchParameter sea una derivacion correcta del mismo +SEARCHPARAMETER_TYPE_WRONG = El tipo {1} es diferente al tipo {0} en el SearchParameter derivado +SECURITY_STRING_CONTENT_ERROR = El valor de la cadena contiene texto que parece ser etiquetas HTML embebidas, que no pueden ser incluidas por razones de seguridad en este contexto +SECURITY_STRING_CONTENT_WARNING = El valor de la cadena contiene texto que parece ser etiquetas HTML embebidas. Si este contenido se presenta en HTML sin el procesamiento adecuado, puede ser un riesgo de seguridad +SLICING_CANNOT_BE_EVALUATED = La partición no pudo ser evaluada: {0} +SNAPSHOT_EXISTING_PROBLEM = El snapshot generado tiene una cantidad de elementos distinta {1} que el snapshot originalmente provisto {0} +Same_id_on_multiple_elements__in_ = El mismo id ''{0}'' en múltiples elementos {1}/{2} en {3} +Slice_encountered_midway_through_set_path___id___ = Partición encontrada dentro del conjunto (path = {0}, id = {1}); {2} +Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = !!Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - disciminador @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - orden @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - regla @ {2} ({3}) +StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} en {1}: tipo restringido inválido {2} de {3} en {4} +TERMINOLOGY_TX_NOSVC_BOUND_EXT = No se pudo confirmar que los códigos provistos pertenezcan al conjunto de valores extensible {0} porque no hay servicio terminológico +TERMINOLOGY_TX_NOSVC_BOUND_REQ = No se pudo confirmar que los códigos provistos pertenezcan al conjunto de valores requerido {0} porque no hay servicio terminológico +TERMINOLOGY_TX_SYSTEM_HTTPS = La URL de sistema ''{0}'' comienza erróneamente con https: en lugar de http: +TERMINOLOGY_TX_SYSTEM_NO_CODE = !!Un código sin sistema no tiene un significado definido. El elemento system debe estar presente +TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = La referencia al sistema de codificación {0} es errónea - no puede apuntar a build.fhir.org. Esta puede ser la referencia correcta: {1} +TERMINOLOGY_TX_SYSTEM_WRONG_HTML = La referencia al sistema de codificación {0} es errónea - no puede apuntar a una página HTML. Esta puede ser la referencia correcta: {1} +TX_SERVER_NO_BATCH_RESPONSE = El servidor devolvió null sobre una solicitud de validación en lote +TYPE_CHECKS_FIXED_CC = !!!!!!!!!!!!!!!!!!El patrón [system {0}, code {1}, y display ''{2}''] definidos en el perfil {3} no se han encontrado. Problemas: {4} +TYPE_CHECKS_FIXED_CC_US = !!!!!!!!!!!!!!!!!!El patrón [system {0}, code {1}, display ''{2}'' y userSelected {5}] definidos en el perfil {3} no se han encontrado. Problemas: {4} +TYPE_CHECKS_PATTERN_CC = !!!!!!!!!!!!!!!!!!El patrón [system {0}, code {1}, y display ''{2}''] definidos en el perfil {3} no se han encontrado. Problemas: {4} +TYPE_CHECKS_PATTERN_CC_US = !!!!!!!!!!!!!!!!!!El patrón [system {0}, code {1}, display ''{2}'' y userSelected {5}] definidos en el perfil {3} no se han encontrado. Problemas: {4} +TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Las URL canónicas deben ser URLs absolutas si no son fragmentos de referencias ({0}) +TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Las URL canónicas en recursos contenidos deben ser URLs absolutas si están presentes ({0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Los adjuntos tienen datos y/o url, o sino DEBEN tener contentType y/o language +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = El tamaño declarado del adjunto no puede ser verificado porque el validador no puede acceder a la red (url = {0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = El tamaño declarado del adjunto {0} no coincide con el tamaño verdadero del adjunto {1} +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = El tamaño declarado del adjunto {0} no es válido +TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = El tamaño declarado del adjunto {0} bytes lo cual excede el límite de {1} bytes +TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = El tamaño declarado del adjunto no puede ser verificado porquethe el validador no entiend como acceder a {0} +TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = El tamaño declarado del adjunto no puede ser verificado porque hubo un error accediendo a {0}: {1} +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Los valores codificados con Base64 no pueden contener espacios en blanco (por RFC 4648). Notar que los lectores que no validan son invitados a aceptar espacio en blanco de todas maneras. +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Los valores codificados con Base64 no deberían contener espacios en blanco (por RFC 4648). Notar que los lectores que no validan son invitados a aceptar espacio en blanco de todas maneras. +TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = El tamaño del Base64 es {0} bytes lo cual excede el límite definido de {1} bytes +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = La URL Canónica ''{0}'' no puede resolverse +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = La URL Canónica ''{0}'' existe pero no puede cargarse, por lo que no puede utilizarse para validación +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = La URL Canónica''{0}'' refiere a un recurso del tipo erróneo. Se encontró {1} esperando uno de {2} +TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = Se encontraron {0} posiciones decimales lo cual excede el límite definido de {1} dígitos +TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = !!si identifier.system es ''urn:ietf:rfc:3986'', entonces identifier.value debe ser un URI completo (debe empezar con un scheme) +TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = El markdown tiene contenido que parece ser un tag de HTML embebido empezando en ''{0}''. Esto será (o DEBIERA ser) be transformado por la capa de presentación. El contenido debería ser verificado para confirmar que esta es la conducta deseada +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = El elemento maxValue en el perfil tiene un codigo de sistema {0} que es distino al valor en system {1} asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = El elemento maxValue en el perfil no tiene code asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Imposible convertir {0} de unidad {1} a la unidad del elemento maxValue {2} basado en definiciones UCUM; máximo valor no es válido +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = El elemento maxValue en el perfil no tiene system asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = !!El elemento maxValue en el perfil no tiene valor, asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = !!No hay servicio UCUM y los códigos UCUM no son idénticos, asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = El elemento maxValue en el perfil tiene un sistema {0} que es diferente al sistema en el valor {1} asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = El valor no tiene code asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = El elemento value no tiene system asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = !!La cantidad no tiene un valor, asi que el valor máximo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = El valor en la instancia ({2}) es mayor que el valor maximo especificado ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = El valor en la instancia ({0} {1}) es mayor que el valor del elemento maxValue ({2} {3}) luego de la conversión UCUM +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = El elemento minValue en el perfil tiene un código de system code de {0} que es distinto al valor en system {1} asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = El elemento minValue en el perfil no tiene codigo asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Imposible convertir el valor {0} desde unidad {1} a la unidad del elemento minValue {2} basado en definiciones UCUM; el valor mínimo no es válido +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = El minValue en el perfil no tiene system asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = !!El elemento minValue en el perfil no tiene un valor, asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = !!No hay servicio UCUM y los códigos UCUM no son idénticos, asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = El elemento minValue en el perfil tiene un código de system de {0} que es distinto al valor en system {1} asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = El valor no tiene código así que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = El valor no tiene sistema asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = !!La cantidad no tiene un valor, asi que el valor mínimo no puede ser verificado +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = El valor en la instancia ({2}) es menor que el valor mínimo especificado ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = El valor en la instancia ({0} {1}) es menor que el valor mínimo especificado ({2} {3}) luego de la conversión UCUM +TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = No se permiten URLs de ejemplo en este contexto ({0}) +TYPE_SPECIFIER_ABSTRACT_TYPE = El especificador de tipo {1} especificó un tipo abstracto {0} +TYPE_SPECIFIER_ILLEGAL_TYPE = El especificador de tipo {1} especificó un tipo ilegal {0} +TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Ningún especificador de tipo coincide, y el tipo subyacente {0} no es abstracto +TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Ningún especificador de tipo coincide, y el tipo subyacente {0} no es válido +Terminology_PassThrough_TX_Message = !!{0} para ''{1}#{2}'' +Terminology_TX_Binding_CantCheck = La Vinculación por referencia URI no pudo ser verificada +Terminology_TX_Binding_Missing = Falta la Vinculación con {0} (CodeableConcept) +Terminology_TX_Binding_Missing2 = Falta la Vinculación con {0} +Terminology_TX_Binding_NoServer = !!El valor provisto no puede ser validado en ausencia de un servidor terminológico +Terminology_TX_Binding_NoSource = La vinculación para {0} no tiene origen, asi que no ha podido ser verificada +Terminology_TX_Binding_NoSource2 = La vinculacieon no tiene origen, asi que no puede ser verificada +Terminology_TX_Code_ValueSet = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} +Terminology_TX_Code_ValueSetMax = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} (conjunto maximo de valores {1}) +Terminology_TX_Code_ValueSet_Ext = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores {0} +Terminology_TX_Code_ValueSet_MISSING = No se ha provisto un código, y se requiere un código proveniente del conjunto de valores +Terminology_TX_Coding_Count = Esperados {0} pero encontrados {1} elementos coding +Terminology_TX_Confirm_1_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y se requieren códigos de este conjunto de valores (class = {1}) +Terminology_TX_Confirm_2_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) (class = {1}) +Terminology_TX_Confirm_3_CC = No se pudo confirmar que las codificaciones provistas estén en el set de valores{0} y se recomienda que los códigos provengan de este conjunto de valores (class = {1}) +Terminology_TX_Confirm_4a = !!El código provisto ({2}) no está en el conjunto de valores {0}, y un código de este conjunto de valores es requerido: {1} +Terminology_TX_Confirm_5 = !!!!No se pudo confirmar que los códigos provistos vengan de este conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) +Terminology_TX_Confirm_6 = !!!!No se pudo confirmar que los códigos provistos vengan de este conjunto de valores {0}, y se recomienda que los códigos provengan de este conjunto de valores +Terminology_TX_Display_Wrong = El elemento Display deberia ser igual a ''{0}'' +Terminology_TX_Error_CodeableConcept = Error {0} validando el CodeableConcept +Terminology_TX_Error_CodeableConcept_Max = Error {0} validando el CodeableConcept usando maxValueSet +Terminology_TX_Error_Coding1 = Error {0} validando Coding +Terminology_TX_Error_Coding2 = Error {0} validando Coding: {1} +Terminology_TX_NoValid_10 = El código provisto no está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (code = {1}#{2}) +Terminology_TX_NoValid_11 = El código provisto no está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (code = {1}#{2}), error = {3}) +Terminology_TX_NoValid_12 = !!El Coding provisto ({2}) no está en el conjunto de valores{0}, y se requiere un código de este conjunto de valores: {1} +Terminology_TX_NoValid_13 = !!El Coding provisto ({2}) no está en el conjunto de valores{0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {1} +Terminology_TX_NoValid_14 = !!El Coding provisto ({2}) no está en el conjunto de valores{0}, y se recomienda que los códigos provengan de este conjunto de valores {1} +Terminology_TX_NoValid_15 = El valor provisto (''{0}'') no pudo ser validado en ausencia de un servidor terminológico +Terminology_TX_NoValid_16 = !!El valor provisto (''{0}'') no está en el conjunto de valores{1}, y se requiere un código de este conjunto de valores) {2} +Terminology_TX_NoValid_17 = !!El valor provisto (''{0}'') no está en el conjunto de valores{1}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {2} +Terminology_TX_NoValid_18 = !!!!El valor provisto (''{0}'') no está en el conjunto de valores{1}, y se recomienda que el código provengan de este conjunto de valores){2} +Terminology_TX_NoValid_1_CC = Ninguno de los codings provistos están en el conjunto de valores {0}, y se requiere un código de este conjunto de valores) (codes = {1}) +Terminology_TX_NoValid_2_CC = Ninguno de los codings provistos están en el conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) (codes = {1}) +Terminology_TX_NoValid_3_CC = !!Ninguno de los codings provistos están en el conjunto de valores {0}, y se recomienda que los códigos provengan de este conjunto de valores ) (codes = {1}) +Terminology_TX_NoValid_4 = !!El Coding provisto ({2}) no está en el conjunto de valores {0}, y se requiere un código de este conjunto de valores {1} +Terminology_TX_NoValid_5 = !!El Coding provisto ({2}) no está en el conjunto de valores {0}, y deberian provenir de este conjunto de valores a menos que no haya un código apropiado (el validador no pudo juzgar si era o no apropiado) {1} +Terminology_TX_NoValid_6 = !!El Coding provisto ({2}) no está en el conjunto de valores {0}, y se recomienda que el código provengan de este conjunto de valores {1} +Terminology_TX_NoValid_7 = Ninguno de los códigos provistos pueden ser validados contra el conjunto de valores máximo {0}, (error = {2}) +Terminology_TX_NoValid_8 = Ninguno de los códigos provistos está en el conjunto de valores máximo {0}, y se requiere un código de este conjunto de valores) (codes = {1}) +Terminology_TX_NoValid_9 = !!Ninguno de los códigos provistos pueden ser validados contra el conjunto de valores máximo {0}, (error = {1}) +Terminology_TX_System_Invalid = URI de Sistema Inválido: {0} +Terminology_TX_System_Relative = Coding.system debe ser una referencia absoluta, no una referencia local +Terminology_TX_System_Unknown = Sistema de Codificación Desconocido ''{0}'' +Terminology_TX_System_ValueSet = URI de Sistema Inválido: {0} - no se puede utilizar una URI de conjunto de valores como system +Terminology_TX_System_ValueSet2 = El elemento Coding referencia un set de valores, no un sistema de codificación (''{0}'') +Terminology_TX_ValueSet_NotFound = !!El ValueSet {0} no ha sido encontrado por el validador +Terminology_TX_ValueSet_NotFound_CS = !!Se encontró una refeencia a un CodeSystem ({0}) donde corresponde un ValueSet +Text_should_not_be_present = El elemento Text no debe estar presente (''{0}'') +The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = El snapshot base marca la partición como cerrada, pero el diferencial trata de extenderlo en {0}, en {1} ({2}) +This__cannot_be_parsed_as_a_FHIR_object_no_namespace = !!Esto ''{0}'' no puede ser parseado como un objeto FHIR (sin espacio de nombres) +This_base_property_must_be_an_Array_not_ = Esta propiedad base debe ser un Array, no {0} +This_cannot_be_parsed_as_a_FHIR_object_no_name = !!Esto no puede ser parseado como un objeto FHIR (sin nombre) +This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = !!Esto no parece ser un recurso FHIR (nombre desconocido ''{0}'') +This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = !!Esto no parece ser un recurso FHIR (espacio de nombres/nombre desconocido ''{0}::{1}'') +This_element_does_not_match_any_known_slice_ = !!Este elemento no coincide con ninguna partición conocida {0} +This_property_must_be__not_ = Esta propiedad {2} debe ser {0}, no {1} (en {3}) +This_property_must_be_a_Literal_not_ = Esta propiedad debe ser un Literal, no {0} +This_property_must_be_a_URI_or_bnode_not_ = Esta propiedad debe ser una URI o bnode, no {0} +This_property_must_be_an_Array_not_ = !!Esta propiedad debe ser un Array, no {0} +This_property_must_be_an_object_not_ = Esta propiedad debe ser un objeto, no {0} ({1} en {2}) +This_property_must_be_an_simple_value_not_ = Esta propiedad debe ser un valor simple, no {0} ({1} en {2}) +Type_Specific_Checks_DT_Base64_Valid = El valor ''{0}'' no es un valor válido para Base64 Type_Specific_Checks_DT_Boolean_Value = Los valores binarios deben ser ''true'' o ''false'' Type_Specific_Checks_DT_Code_WS = El código ''{0}'' no es válido (reglas de espacio en blanco) Type_Specific_Checks_DT_DateTime_Reasonable = El valor ''{0}'' está fuera del rango razonable de años - verifique la entrada de datos @@ -194,16 +545,16 @@ Type_Specific_Checks_DT_DateTime_Regex = El valor de tipo instant ''{0}'' no es Type_Specific_Checks_DT_DateTime_TZ = si la fecha tiene una hora, tiene que tener una zona horaria Type_Specific_Checks_DT_DateTime_Valid = No es una fecha/hora válida ({0}) Type_Specific_Checks_DT_Date_Valid = No es una fecha válida ({0}) +Type_Specific_Checks_DT_Decimal_GT = !!!!!!el valor es mayor que el valor máximo permitido de {0} +Type_Specific_Checks_DT_Decimal_LT = !!!!!!el valor es menor que el valor mínimo permitido de {0} Type_Specific_Checks_DT_Decimal_Range = El valor ''{0}'' está fuera del rango razonable/soportado para decimales Type_Specific_Checks_DT_Decimal_Valid = El valor ''{0}'' no es un decimal válido -Type_Specific_Checks_DT_Decimal_GT = el valor es mayor que el valor máximo permitido de {0} -Type_Specific_Checks_DT_Decimal_LT = el valor es menor que el valor mínimo permitido de {0} Type_Specific_Checks_DT_ID_Valid = El valor de id ''{0}'' no es válido Type_Specific_Checks_DT_Identifier_System = Identifier.system debe ser una referencia absoluta, no una referencia local Type_Specific_Checks_DT_Instant_Valid = No es válido para el tipo instant ({0}) Type_Specific_Checks_DT_Integer64_Valid = El valor ''{0}'' no es un integer64 válido -Type_Specific_Checks_DT_Integer_GT = el valor es mayor que el valor máximo permitido de {0} -Type_Specific_Checks_DT_Integer_LT = el valor es menor que el valor mínimo permitido de {0} +Type_Specific_Checks_DT_Integer_GT = !!!!!!el valor es mayor que el valor máximo permitido de {0} +Type_Specific_Checks_DT_Integer_LT = !!!!!!el valor es menor que el valor mínimo permitido de {0} Type_Specific_Checks_DT_Integer_LT0 = el valor es menor que el valor mínimo permitido de 0 Type_Specific_Checks_DT_Integer_LT1 = el valor es menor que el valor mínimo permitido de 1 Type_Specific_Checks_DT_Integer_Valid = El valor ''{0}'' no es un entero válido @@ -213,7 +564,7 @@ Type_Specific_Checks_DT_Primitive_Length = el valor es mas largo que la máxima Type_Specific_Checks_DT_Primitive_NotEmpty = @value no puede estar vacío Type_Specific_Checks_DT_Primitive_Regex = El valor del elemento ''{0}'' no cumple con el regex ''{1}'' Type_Specific_Checks_DT_Primitive_ValueExt = Los tipos primitivos deben tener un valor o tener extensiones asociadas -Type_Specific_Checks_DT_Primitive_WS = Los tipos primitivos no pueden ser solo espacio en blanco +Type_Specific_Checks_DT_Primitive_WS = Los tipos primitivos no pueden ser solo espacio en blanco Type_Specific_Checks_DT_String_Length = el valor es mas largo que la máxima longitud permitida de 1 MB (1048576 bytes) Type_Specific_Checks_DT_String_WS = el valor no puede empezar o terminar con espacios en blanco ''{0}'' Type_Specific_Checks_DT_Time_Valid = No es una hora válida ({0}) @@ -222,622 +573,170 @@ Type_Specific_Checks_DT_URI_UUID = Los valores URI no pueden empezar con uuid: Type_Specific_Checks_DT_URI_WS = Los valores URI no pueden tener espacios en blanco (''{0}'') Type_Specific_Checks_DT_URL_Resolve = El valor URL ''{0}'' no puede resolverse Type_Specific_Checks_DT_UUID_Strat = Las UUIDs deben empezar con urn:uuid: -Type_Specific_Checks_DT_UUID_Valid = UUIDs deben ser válidas y en letra minúscula +Type_Specific_Checks_DT_UUID_Valid = !!UUIDs deben ser válidas y en letra minúscula +UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = !!La secuencia Unicode tiene caracteres de control bi-di que no se permiten en este contexto: {1} +UNICODE_BIDI_CONTROLS_CHARS_MATCH = !!La secuencia Unicode tiene caracteres de control bi-di inconclusos (see CVE-2021-42574): {1} +UNKNOWN_CODE_IN_FRAGMENT = Código desconocido {0} en {1} - note que el sistema de codificación está etiquetado como fragmento, así que el código puede ser válido mas allá del fragmento +UNRECOGNISED_PROPERTY_TYPE = Tipo JSON inválido {0} para el elemento {1}; tipos válidos = {2} +UNRECOGNISED_PROPERTY_TYPE_WRONG = Tipo inválido {2} para el elemento {1}; tipos válidos = {3}, tipo JSON = {0} +UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = No soportado: no se han encontrado propiedades con valores en el tipo {2} para el patrón para el discriminador ({0}) para la partición {1} +UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Propiedad no soportada {3} en el tipo {2} para el patron del discriminador ({0}) para la partición {1} +Unable_to_connect_to_terminology_server = !!Imposible conectarse con el servidor terminológico. Error = {0} +Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = !!Incapaz de conectar al servicio terminológico. Use el parámetro ''-tx n/a'' para correr sin servicios terminológicos para validar LOINC, SNOMED, ICD-X etc. Error = {0} +Unable_to_find__resolving_discriminator__from_ = Imposible encontrar {0} resolviendo el discriminador {1} de {2} +Unable_to_find_base__for_ = Imposible encontrar la base {0} para {1} +Unable_to_find_base_definition_for_logical_model__from_ = Imposible encontrar la definición base para el modelo lógico: {0} de {1} +Unable_to_find_element_ = Incapaz de encontrar elemento {0} +Unable_to_find_element__in_ = Imposible encontrar el elemento {0} en {1} +Unable_to_find_element_with_id_ = Imposible encontrar un elemento con id ''{0}'' +Unable_to_find_profile__at_ = Imposible encontrar el perfil ''{0}'' a {1} +Unable_to_find_resourceType_property = Imposible encontrar la propiedad resourceType +Unable_to_find_resource__at__resolving_discriminator__from_ = Imposible encontrar el recurso {0} en {1} resolviendo el discriminador {2} de {3} +Unable_to_handle_system__concept_filter_with_op__ = Incapaz de manejar el sistema {0} filtro de concepto con op = {1} +Unable_to_handle_system__filter_with_property__ = !!Incapaz de manejar el sistema {0} filtro con property = {1} +Unable_to_locate_the_profile__in_order_to_validate_against_it = Imposible localizar el perfil ''{0}'' para utilizarlo en validación +Unable_to_process_request_for_resource_for___ = Imposible procesar la solicitud para el recurso para {0} / {1} +Unable_to_resolve_ = Imposible resolver la referencia{0} +Unable_to_resolve_actual_type_ = Imposible resolver el tipo {0} +Unable_to_resolve_element__in_profile_ = Imposible resolver el elemento {0} en el perfil {1} +Unable_to_resolve_name_reference__at_path_ = Imposible resolver la referencia al nombre {0} en el path {1} +Unable_to_resolve_profile__in_element_ = Imposible resolver el perfil {0} en elemento {1} +Unable_to_resolve_reference_to_ = Imposible resolver la referencia a {0} +Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Imposible resolver la particion - no hay valor fijo o conjunto de valores requerido +Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Imposible resolver la particion - no se realizó partición por conjunto de valores +Unable_to_resolve_system__no_value_set = Incapaz de resolver el sistema - no tiene conjunto de valores +Unable_to_resolve_system__value_set_has_imports = !!Incapaz de resolver el sistema - el conjunto de valores tiene imports +Unable_to_resolve_system__value_set_has_include_with_filter = !!!!Incapaz de resolver el sistema - conjunto de valores {0} include #{1} tiene un filtro en system {2} +Unable_to_resolve_system__value_set_has_include_with_no_system = Incapaz de resolver el sistema - conjunto de valores {0} include #{1} no tiene system +Unable_to_resolve_system__value_set_has_include_with_unknown_system = !!Incapaz de resolver el sistema - conjunto de valores {0} include #{1} tiene system {2} desconocido, y el servidor devuelve error {3} +Unable_to_resolve_system__value_set_has_multiple_matches = !!Incapaz de resolver el sistema - el conjunto de valores expandido tiene multiples coincidencias: {0} +Unable_to_resolve_system__value_set_has_no_includes_or_expansion = !!Incapaz de resolver el sistema - el conjunto de valores {0} no tiene include o expansio +Unable_to_resolve_value_Set_ = !!Incapaz de resolver el conjunto de valores {0} +Unable_to_validate_code_without_using_server = !!Imposible validar el código sin usar el servidor +Undefined_attribute__on__for_type__properties__ = Atributo indefinido ''@{0}'' en {1} para el tipo {2} +Undefined_element_ = !!Elemento indefinido ''{0}'' +Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Condición inesperada en el diferencial y el nombre implícito de la partición no contiene un tipo válido (''{0}''?) en {1}/{2} +Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Condición inesperada en el diferencial en {0}/{1} +Unexpected_datatype_for_rdfstype = Tipo de datos no esperado para rdfs:type +Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Situación no controlada: el recurso está perfilado a mas de una opción - no se puede ordenar el perfil +Unknown_Code_in = Código desconocido {0} en {1} +Unknown_Code_in_Version = Código desconocido {0} en {1} versión {2} +Unknown_Data_format_ = Formato de Datos desconocido ''{0}'' +Unknown_Date_format_ = Formato de Fecha desconocido ''{0}'' +Unknown_resource_type_missing_rdfstype = Tipo de recurso desconocido (falta rdfs:type) +Unknown_type__at_ = Unknown type {0} at {1} +Unrecognised_extension_context_ = !!Contexto de extensión no reconocido {0} +Unrecognised_predicate_ = !!Predicado desconocido ''{0}'' +Unrecognised_property_ = Propiedad No Reconocida ''{0}'' +Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - las extensiones no se permiten para el discriminador ({0}) de la partición {1} +Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - must have at least one coding - para el discriminador ({0}) de la partición {1} +Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - usa text - para el discriminador ({0}) de la partición {1} +Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Patrón de Identifier no soportado - las extensiones no se permiten - para el discriminador ({0}) de la partición {1} +Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Tipo de patrón de valor fijo no soportado para el discriminador ({0}) para la partición {1}: {2} +Unsupported_fixed_value_type_for_discriminator_for_slice__ = Tipo de valor fijo no soportado para el discriminador ({0}) para la partición {1}: {2} +Unsupported_version_R1 = Versión No Soportada R1 +Unsupported_version_R2 = Versión No Soportada R2 +Unsupported_version_R2B = Versión No Soportada R2B +Unxpected_internal_condition__no_source_on_diff_element = Condicion interna inesperada, no hay origen en un elemento del diferencial +VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = La referencia al perfil global ''{0}'' desde la IG {1} no pudo ser resuelta asi que no ha sido verificada +VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Restricción inválida en el perfil {0} en el path {1} - no se puede restringir a tipo {2} desde los tipos base {3} +VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = El perfile {1} identifica {2} como una dependencia (usando la extensión http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), pero este perfil no pudo ser encontrado +VALIDATION_VAL_PROFILE_OTHER_VERSION = El perfil es para una versión diferente de FHIR ({0}) así que fue ignorado +VALIDATION_VAL_PROFILE_SIGNPOST = Validar el recurso contra el perfil {0} +VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Validar el recurso contra el perfil +VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Validar el recurso contra el perfil {0} - provisto como un parámetro del bundle +VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Validar el recurso contra el perfil {0} (por http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies en {1}) +VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Validar el recurso contra el perfil {0} - un perfil global en {1} +VALIDATION_VAL_PROFILE_SIGNPOST_META = Validar el recurso contra el perfil {0} (por el elemento meta) +VALIDATION_VAL_PROFILE_THIS_VERSION_OK = El perfil es para esta versión de FHIR- Todo OK +VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = El perfil es para esta versión de FHIR, pero es de tipo inválido {0} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = !!La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y se produjo un error {1} al cargarlo +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = !!La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y el host {1} no pudo ser encontrado +VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = !!La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y el validador está configurado para no aceptar perfiles desconocidos +VALUESET_IMPORT_UNION_INTERSECTION = Este conjunto de valores tiene un sólo include con multiples conjunto de valores importados. Según el item https://jira.hl7.org/browse/FHIR-25179, ha habido confusión en el pasado sobre si estos conjunto de valores se unen o intersectan. Si este conjunto de valores está contenido en un paquete publicado antes del 31-Marzo-2022, se tratará como una unión, sino como una intersección. Si desea una unión, parta el conjunto de valores importado entre multiples includes +VALUESET_INCLUDE_INVALID_CONCEPT_CODE = !!El código {1} no es válido en el sistema {0} +VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = !!El código {2} no es válido en el sistema {0} versión {1} +VALUESET_NO_SYSTEM_WARNING = !!No se especifica System, así que los Conceptos y Filtros no pueden ser verificados +VALUESET_REFERENCE_INVALID_TYPE = The conjunto de valores a importar {0} apunta a un recurso de tipo {1} que no es válido +VALUESET_REFERENCE_UNKNOWN = El conjunto de valores a importar {0} no pudo ser encontrado por lo que no puede verificarse +VALUESET_SHAREABLE_EXTRA_MISSING = !!El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet +VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = !!!!El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no se encontró.Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet +VALUESET_SHAREABLE_MISSING = !!El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet +VALUESET_SHAREABLE_MISSING_HL7 = !!!!El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet +VALUESET_UNC_SYSTEM_WARNING = Se especificó el sistema desconocido ''{0}'', así que los Conceptos y Filtros no pueden ser verificados (Detalles: {1}) +VALUESET_UNC_SYSTEM_WARNING_VER = Se especificó un sistema/versión desconocido ''{0}'', así que los Conceptos y Filtros no pueden ser verificados (Detalles: {1}) Validation_BUNDLE_Message = La primera entry en un mensaje tiene que ser un recurso MessageHeader -Validation_VAL_Content_Unknown = Contenido No Reconocido {0} +Validation_VAL_Content_Unknown = !!Contenido No Reconocido {0} Validation_VAL_NoType = Tipo Desconocido {0} Validation_VAL_Profile_MatchMultiple = Perfil {0}, El elemento coincide con más de un slice - {1}, {2} -## for the next 4 messages, the available parameters are: 0: profile url, 1: ed.path, 2: ed.id, 3: ed.sliceName, 4: ed.label, 5: element.path, 6: ed.min and optionally 7: actual count Validation_VAL_Profile_Maximum_one = {3}: max permitido = {7}, pero se han encontrado {0} (de {1}) Validation_VAL_Profile_Maximum_many = {3}: max permitido = {7}, pero se han encontrado {0} (de {1}) Validation_VAL_Profile_Maximum_other = {3}: max permitido = {7}, pero se han encontrado {0} (de {1}) Validation_VAL_Profile_Minimum_one = {3}: mínimo requerido = {7}, pero sólo se han encontrado {0} (de {1}) Validation_VAL_Profile_Minimum_many = {3}: mínimo requerido = {7}, pero sólo se han encontrado {0} (de {1}) Validation_VAL_Profile_Minimum_other = {3}: mínimo requerido = {7}, pero sólo se han encontrado {0} (de {1}) +Validation_VAL_Profile_MultipleMatches_one = Se han encontrado multiples perfiles coincidentes entre {0} opción: {1} +Validation_VAL_Profile_MultipleMatches_many = Se han encontrado multiples perfiles coincidentes entre {0} opciones: {1} +Validation_VAL_Profile_MultipleMatches_other = Se han encontrado multiples perfiles coincidentes entre {0} opciones: {1} Validation_VAL_Profile_NoCheckMax_one = {3}: Se encontró {0} coincidencia, pero es imposible verificar el max permitido ({2}) debido a la falta de validación del particionado (de {1}) Validation_VAL_Profile_NoCheckMax_many = {3}: Se encontraron {0} coincidencias, pero es imposible verificar el max permitido ({2}) debido a la falta de validación del particionado (de {1}) Validation_VAL_Profile_NoCheckMax_other = {3}: Se encontraron {0} coincidencias, pero es imposible verificar el max permitido ({2}) debido a la falta de validación del particionado (de {1}) Validation_VAL_Profile_NoCheckMin_one = {3}: Found {0} match, pero es imposible verificar el mínimo requerido ({2}) debido a la falta de validación del particionado (de {1}) Validation_VAL_Profile_NoCheckMin_many = {3}: Se encontraron {0} coincidencias, pero es imposible verificar el mínimo requerido ({2}) debido a la falta de validación del particionado (de {1}) Validation_VAL_Profile_NoCheckMin_other = {3}: Se encontraron {0} coincidencias, pero es imposible verificar el mínimo requerido ({2}) debido a la falta de validación del particionado (de {1}) -Validation_VAL_Profile_MultipleMatches_one = Se han encontrado multiples perfiles coincidentes entre {0} opción: {1} -Validation_VAL_Profile_MultipleMatches_many = Se han encontrado multiples perfiles coincidentes entre {0} opciones: {1} -Validation_VAL_Profile_MultipleMatches_other = Se han encontrado multiples perfiles coincidentes entre {0} opciones: {1} Validation_VAL_Profile_NoDefinition = No se encontró la definición para el tipo de recurso ''{0}'' Validation_VAL_Profile_NoMatch = Imposible encontrar una coincidencia para el perfil especificado entre las opciones: {0} Validation_VAL_Profile_NoSnapshot = El recurso StructureDefinition {0} no tiene snapshot - la validación se realiza contra el snapshot, asi que debe ser provisto -Validation_VAL_Profile_NoType = El tipo de elemento {0} es desconocido, lo cual es ilegal. Los tipos válidos en este punto son {1} +Validation_VAL_Profile_NoType = !!El tipo de elemento {0} es desconocido, lo cual es ilegal. Los tipos válidos en este punto son {1} Validation_VAL_Profile_NotAllowed = Este elemento no está permitido por el perfil {0} Validation_VAL_Profile_NotSlice = Este elemento no coincide con ninguna partición conocida {0} y las particiones están CERRADAS: {1} Validation_VAL_Profile_OutOfOrder = Según se especifica en el perfil {0}, el elemento ''{1}'' está fuera de orden (encontrado luego de {2}) Validation_VAL_Profile_SliceOrder = Según se especifica en el perfil {0}, el elemento ''{1}'' está fuera de orden en la partición ordenada -Validation_VAL_Profile_Unknown = La referencia al perfil ''{0}'' no ha sido verificada porque el perfil es desconocido -VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y el validador está configurado para no aceptar perfiles desconocidos -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y se produjo un error {1} al cargarlo -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = La referencia al perfil ''{0}'' no ha sido verificada ya que es desconocido, y el host {1} no pudo ser encontrado +Validation_VAL_Profile_Unknown = !!La referencia al perfil ''{0}'' no ha sido verificada porque el perfil es desconocido +Validation_VAL_Profile_WrongType = El tipo de perfil especificado fue ''{0}'' en el perfil ''{2}'', pero se han encontrado tipo ''{1}'' +Validation_VAL_Profile_WrongType2 = Disonancia de tipos procesando el perfil {0} en el path {1}: El tipo de elemento es {4}, pero el perfil {3} es para un tipo diferente {2} Validation_VAL_Unknown_Profile = Perfil desconocido {0} -VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = El perfile {1} identifica {2} como una dependencia (usando la extensión http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), pero este perfil no pudo ser encontrado +Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Discordancia de versión. El contexto tiene la versión {0} cargada, y el nuevo contenido cargado tiene la versión {1} +Wrong_namespace__expected_ = Espacio de nombres erróneo - se esperaba ''{0}'' +Wrong_type_for_resource = Tipo incorrecto para el recurso +XHTML_URL_DATA_DATA_INVALID = El elemento data debe ser contenido base64 válido URL: {0} +XHTML_URL_DATA_DATA_INVALID_COMMA = Una coma encontrada en el elemento data de la URL: {0} +XHTML_URL_DATA_MIMETYPE = La porción mimetype de data: URL no es válido ({1}) en la URL: {0} +XHTML_URL_DATA_NO_DATA = Sin datos en el elemento data de la URL +XHTML_URL_EMPTY = La URL está vacía +XHTML_URL_INVALID = La URL no es válida porque ''({1})'': {0} +XHTML_URL_INVALID_CHARS_one = La URL contiene Caracteres Inválidos ({1}) +XHTML_URL_INVALID_CHARS_many = La URL contiene {0} Caracteres Inválidos ({1}) +XHTML_URL_INVALID_CHARS_other = La URL contiene {0} Caracteres Inválidos ({1}) XHTML_XHTML_Attribute_Illegal = Nombre de atributo inválido en el XHTML (''{0}'' en ''{1}'') +XHTML_XHTML_DOCTYPE_ILLEGAL = XHTML Malformado: Se encontró una declaración DocType, y no están permitidas (Protección contra la Vulnerabilidad de seguridad XXE) +XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = !!Nombre de elemento ilegal en un párrafo en el XHTML (''{0}'') XHTML_XHTML_Element_Illegal = Nombre de elemento inválido en el XHTML (''{0}'') XHTML_XHTML_Entity_Illegal = Entidad inválido en el XHTML (''{0}'') XHTML_XHTML_Image_Reference_Illegal = Referencia ilegal a imagen en el XHTML (''{0}'') XHTML_XHTML_NS_InValid = Espacio de Nombre Erroneo en XHTML (''{0}'', debe ser ''{1}'') XHTML_XHTML_Name_Invalid = Nombre erróneo en el XHTML (''{0}'') - debe empezar con div -_DT_Fixed_Wrong = El valor es ''{0}'' but debe ser ''{1}'' -All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = Todos los recursos Observation deben tener un elemento effectiveDateTime o effectivePeriod -All_observations_should_have_a_performer = Todos los recursos Observation deben tener un elemento performer -All_observations_should_have_a_subject = Todos los recursos Observation deben tener un elemento subject -Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Imposible resolver la particion - no hay valor fijo o conjunto de valores requerido -Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Imposible resolver la particion - no se realizó partición por conjunto de valores -Problem_processing_expression__in_profile__path__ = Problema procesando la expresión ''{0}'' en el perfil ''{1}'' en el path ''{2}'': {3} -Unable_to_find_element_with_id_ = Imposible encontrar un elemento con id ''{0}'' -Slice_encountered_midway_through_set_path___id___ = Partición encontrada dentro del conjunto (path = {0}, id = {1}); {2} -Unable_to_resolve_actual_type_ = Imposible resolver el tipo {0} -Unsupported_version_R1 = Versión No Soportada R1 -Unsupported_version_R2 = Versión No Soportada R2 -Unsupported_version_R2B = Versión No Soportada R2B -Unsupported_fixed_value_type_for_discriminator_for_slice__ = Tipo de valor fijo no soportado para el discriminador ({0}) para la partición {1}: {2} -Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - las extensiones no se permiten para el discriminador ({0}) de la partición {1} -Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - must have at least one coding - para el discriminador ({0}) de la partición {1} -Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Patrón para CodeableConcept no soportado - usa text - para el discriminador ({0}) de la partición {1} -Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Patrón de Identifier no soportado - las extensiones no se permiten - para el discriminador ({0}) de la partición {1} -Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Tipo de patrón de valor fijo no soportado para el discriminador ({0}) para la partición {1}: {2} -Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Problema evaluando la expresión de partición para el elemento en el perfil {0} path {1} (fhirPath = {2}): {3} -Could_not_match_discriminator_for_slice_in_profile_one = No se encontró coincidencia para el discriminador ({0}) para la partición {1} en el perfil {2} - el discriminador {3} no tiene valor fijo, enlace o una declaración de existencia -Could_not_match_discriminator_for_slice_in_profile_many = No se encontraron coincidencias con discriminadores ({1}) para la partición {2} en el perfil {3} - Ninguno de los {0} discriminadores {4} tiene valor fijo, enlace o una declaración de existencia -Could_not_match_discriminator_for_slice_in_profile_other = No se encontraron coincidencias con discriminadores ({1}) para la partición {2} en el perfil {3} - Ninguno de los {0} discriminadores {4} tiene valor fijo, enlace o una declaración de existencia -Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = El discriminador ({0}) está basado en la existencia de un elemento, pero la partición {1} no define cardinalidad min>=1 o max=0 -Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Los discriminadores basados en perfiles deben tener un tipo con un perfil ({0} en el perfil {1}) -#The following error cannot occur for a single item. _one case left intentionally blank. -Profile_based_discriminators_must_have_only_one_type__in_profile_one = -Profile_based_discriminators_must_have_only_one_type__in_profile_many = Los discriminadores basados en perfiles deben tener un solo tipo ({1} en el perfil {2}) pero se han encontrado {0} tipos -Profile_based_discriminators_must_have_only_one_type__in_profile_other = Los discriminadores basados en perfiles deben tener un solo tipo ({1} en el perfil {2}) pero se han encontrado {0} tipos -Profile_based_discriminators_must_have_a_type__in_profile_ = Los discriminadores basados en perfiles deben tener un tipo ({0} en el perfil {1}) -Discriminator__is_based_on_type_but_slice__in__has_no_types = El discriminador ({0}) se basa en tipo, pero la partición {1} en {2} no tiene tipos -#The following error cannot occur for a single item. _one case left intentionally blank. -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one = -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_many = El discriminador ({1}) está basado en tipos, pero la partición {2} en {3} tiene {0} tipos: {4} -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = El discriminador ({1}) está basado en tipos, pero la partición {2} en {3} tiene {0} tipos: {4} -Found__items_for__resolving_discriminator__from_ = Se han encontrado {0} items para {1} resolviendo el discriminator {2} de {3} -Unable_to_find__resolving_discriminator__from_ = Imposible encontrar {0} resolviendo el discriminador {1} de {2} -Unable_to_find_resource__at__resolving_discriminator__from_ = Imposible encontrar el recurso {0} en {1} resolviendo el discriminador {2} de {3} -No_reference_resolving_discriminator__from_ = No se encontró referencia resolviendo el discriminador {0} de {1} -Unable_to_resolve_element__in_profile_ = Imposible resolver el elemento {0} en el perfil {1} -Unable_to_resolve_profile_ = Imposible resolver el perfil {0} -Resource_resolution_services_not_provided = Los servicios de resolución de recurso no han sido provistos -Unrecognised_extension_context_ = Contexto de extensión no reconocido {0} -Unable_to_locate_the_profile__in_order_to_validate_against_it = Imposible localizar el perfil ''{0}'' para utilizarlo en validación -Reference__refers_to_a__not_a_ValueSet = La referencia {0} apunta a un {1} no a un ValueSet -Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = No realizado aun (ValidatorHostServices.conformsToProfile), cuando el item no es un elemento -Not_supported_yet = No soportado aún -Unable_to_resolve_ = Imposible resolver la referencia{0} -Not_done_yet__resolve__locally_2 = No realizado aún - resolver {0} localmente (2) -Not_done_yet_ValidatorHostServicesexecuteFunction = No realizado aún (ValidatorHostServices.executeFunction) -Not_done_yet_ValidatorHostServicescheckFunction = No realizado aún (ValidatorHostServices.checkFunction) -Not_done_yet_ValidatorHostServicesresolveFunction_ = No realizado aún (ValidatorHostServices.resolveFunction): {0} -Unable_to_find_base_definition_for_logical_model__from_ = Imposible encontrar la definición base para el modelo lógico: {0} de {1} -Same_id_on_multiple_elements__in_ = El mismo id ''{0}'' en múltiples elementos {1}/{2} en {3} -No_path_on_element_Definition__in_ = No hay path en la definición del elemento {0} en {1} -needs_a_snapshot = requiere un snapshot -not_the_right_kind_of_structure_to_generate_schematrons_for = no es la clase de estructura para la cual generar schematrons -Not_handled_yet_sortElements_ = No soportado aún (sortElements: {0}:{1}) -Unable_to_resolve_profile__in_element_ = Imposible resolver el perfil {0} en elemento {1} -Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Un elemento polimórfico no puede tener hijos- debe particionar y restringir los tipos antes (sortElements: {0}:{1}) -Unable_to_find_profile__at_ = Imposible encontrar el perfil ''{0}'' a {1} -Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Situación no controlada: el recurso está perfilado a mas de una opción - no se puede ordenar el perfil -Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_ = Detección de recursión interna: ciclo de recursion find() detectado > {0} - verifique que las paths sean válidas (para path {1}/{2}) -Internal_error___type_not_known_ = Error interno - tipo desconocido {0} -Unable_to_find_element_ = Incapaz de encontrar elemento {0} -Error_generating_table_for_profile__ = Error generando la tabla para el perfil {0}: {1} -StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} en {1}: tipo restringido inválido {2} de {3} en {4} -Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Error en {0}#{1}: El perfil destino {2} no es una restricción válida sobre la base ({3}) -Error_in_profile__at__Base_isSummary___derived_isSummary__ = Error en perfiles {0} de {1}: El recurso Base isSummary = {2}, derivado isSummary = {3} -StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_ = StructureDefinition {0} en {1}: intento inválido de cambiar una vinculación terminológica de {2} a {3} -Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Condición inesperada en el diferencial en {0}/{1} -Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Condición inesperada en el diferencial y el nombre implícito de la partición no contiene un tipo válido (''{0}''?) en {1}/{2} -Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Intento de usar un snapshot en el perfil ''{0}'' como {1} antes que se genere -null_min = min nulo -_has_children__for_type__in_profile__but_cant_find_type = {0} tiene hijos ({1}) para el tipo {2} en el perfil {3}, pero no pudo encontrarse el tipo +_DT_Fixed_Wrong = !!El valor es ''{0}'' but debe ser ''{1}'' _has_children__and_multiple_types__in_profile_ = {0} tiene hijos ({1}) y multiples tipos ({2}) en el perfil {3} -Adding_wrong_path = Agregando un path erroneo -Named_items_are_out_of_order_in_the_slice=Los items nominados están fuera de orden en la partición -The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = El snapshot base marca la partición como cerrada, pero el diferencial trata de extenderlo en {0}, en {1} ({2}) -Not_done_yet = No implementado aún -Unknown_type__at_ = Unknown type {0} at {1} -Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = La recorrida del diferencial llega a ''{0} (@ {1})'', pero el recurso base no, y no hay un único tipo fijo. El tipo es {2}. Esto no está soportado aún -Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - regla @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - disciminador @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Las reglas de partición en el diferencial ({0}) no coinciden con aquellos en el recurso base ({1}) - orden @ {2} ({3}) -not_done_yet__slicing__types__ = no implementado aún - particiones / tipos @ {0} -Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Partición inválida: hay mas de una partición por tipo en {0}, pero una de ellas ({1}) tiene cardinalidad min = 1, asi que el resto de las particiones no puede existir -Did_not_find_type_root_ = No se encontró el tipo raiz : {0} -Error_at_path__Slice_for_type__has_wrong_type_ = Error en el path{0}: La partición para el tipo ''{1}'' es del tipo incorrecto ''{2}'' -Error_at_path__Slice_for_type__has_more_than_one_type_ = Error en el path{0}: La partición para el tipo ''{1}'' tiene más de un tipo ''{2}'' -Error_at_path__Slice_name_must_be__but_is_ = Error en el path{0}: El nombre de la particiópn debe ser ''{1}'' pero es ''{2}'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.path != ''$this'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.type != ''type'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Error en el path {0} in {1}: La partición por tipo con slicing.discriminator.count() > 1 -Error_at_path__in__Type_slicing_with_slicingordered__true = Error en el path{0} en {1}: La partición por tipo con slicing.ordered = true -Adding_wrong_path_in_profile___vs_ = Se agrego el path incorrecto en el perfil {0}: {1} vs {2} +_has_children__for_type__in_profile__but_cant_find_type = {0} tiene hijos ({1}) para el tipo {2} en el perfil {3}, pero no pudo encontrarse el tipo _has_no_children__and_no_types_in_profile_ = {0} no tiene hijos ({1}) y no hay tipos en el perfil {2} -not_done_yet = no implementado aún -Did_not_find_single_slice_ = No se encontró una partición única: {0} -Differential_does_not_have_a_slice__b_of_____in_profile_ = El diferencian en el perfil {5} no tiene una partición en {6} (en {0}, posición {1} de {2} / {3} / {4}) -Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Intento de particionar un elemento que no tiene repeticiones: {0}/{1} de {2} en {3}, en el elemento {4} (partición = {5}) -Unable_to_resolve_reference_to_ = Imposible resolver la referencia a {0} -Unable_to_find_element__in_ = Imposible encontrar el elemento {0} en {1} -Unable_to_find_base__for_ = Imposible encontrar la base {0} para {1} -Adding_wrong_path__outcomegetPath___resultPathBase__ = Se agregó un path erróneo - outcome.getPath() = {0}, resultPathBase = {1} -Illegal_path__in_differential_in__illegal_characters_ = Path inválido ''{0}'' en el diferencial en {1}: caracteres inválidos [] -Illegal_path__in_differential_in__illegal_character_ = Path inválido ''{0}'' en el diferencial en {1}: caracter inválido ''{2}'' -Illegal_path__in_differential_in__no_unicode_whitespace = Path inválido ''{0}'' en el diferencial en {1}: no unicode whitespace -Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Path inválido ''{0}'' en el diferencial en {1}: name portion exceeds 64 chars in length -Illegal_path__in_differential_in__name_portion_mising_ = Path inválido ''{0}'' en el diferencial en {1}: falta la parte del nombre (''..'') -Illegal_path__in_differential_in__must_start_with_ = Path inválido ''{0}'' en el diferencial en {1}: debe comenzar con {2}.{3} -No_path_value_on_element_in_differential_in_ = No hay valor de path en el elemento en el diferencial en {0} -No_path_on_element_in_differential_in_ = No hay path en el elemento en el diferencial en {0} -Unxpected_internal_condition__no_source_on_diff_element = Condicion interna inesperada, no hay origen en un elemento del diferencial -type_on_first_snapshot_element_for__in__from_ = el tipo del primer elemento del snapshot para {0} en {1} de {2} -type_on_first_differential_element = tipo en el primer elemento del diferencial! -Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Referencias circulares detectadas en el snapshot, no se puede generar el snapshot (stack = {0}) -Base__Derived_profiles_have_different_types____vs___ = Los perfiles base y derivados tienen tipos distintos ({0} = {1} vs {2} = {3}) -Derived_profile__has_no_derivation_value_and_so_cant_be_processed = El perfil derivado {0} no tiene valor de derivación por lo cual no puede ser procesado -Derived_profile__has_no_type = El perfil derivado {0} no tiene tipo -Base_profile__has_no_type = El perfil basee {0} no tiene tipo -no_derived_structure_provided = no se provee la estructura derivada -no_base_profile_provided = no se provee el perfil base -element_id__null__on_ = element id = nulo: {0} en {1} -element__null_ = element = nulo: {0} -getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList debe ser llamada cuando el elemento está particionado -Unable_to_resolve_name_reference__at_path_ = Imposible resolver la referencia al nombre {0} en el path {1} -Details_for__matching_against_Profile_ = Detalles para {0} coincidente con el perfil {1} -Does_not_match_slice_ = No coincide con la partición ''{0}'' (discriminador: {1}) -Profile__does_not_match_for__because_of_the_following_profile_issues__ = El perfil {0} no coincide para {1} por los siguientes problemas del perfil: {2} -This_element_does_not_match_any_known_slice_ = Este elemento no coincide con ninguna partición conocida {0} defined_in_the_profile = definido en el perfil -This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Esto no parece ser un recurso FHIR (nombre desconocido ''{0}'') -This_cannot_be_parsed_as_a_FHIR_object_no_name = Esto no puede ser parseado como un objeto FHIR (sin nombre) -This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = Esto no parece ser un recurso FHIR (espacio de nombres/nombre desconocido ''{0}::{1}'') -This__cannot_be_parsed_as_a_FHIR_object_no_namespace = Esto ''{0}'' no puede ser parseado como un objeto FHIR (sin espacio de nombres) -Unable_to_find_resourceType_property = Imposible encontrar la propiedad resourceType -Error_analizando_JSON_the_primitive_value_must_be_a_string = Error analizando JSON: el valor primitivo debe ser de tipo string -Error_analizando_JSON_the_primitive_value_must_be_a_number = Error analizando JSON: el valor primitivo debe ser de tipo number -Error_analizando_JSON_the_primitive_value_must_be_a_boolean = Error analizando JSON: el valor primitivo debe ser de tipo boolean -Error_analizando_XHTML_ = Error analizando XHTML: {0} -This_property_must_be_an_object_not_ = Esta propiedad debe ser un objeto, no {0} ({1} en {2}) -This_property_must_be_an_simple_value_not_ = Esta propiedad debe ser un valor simple, no {0} ({1} en {2}) -This_property_must_be__not_ = Esta propiedad {2} debe ser {0}, no {1} (en {3}) -This_property_must_be_an_Array_not_ = Esta propiedad {1} debe ser un Array JSON, no {0} (en {2}) -OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = Este objeto no puede ser un array json con claves porque no tiene dos hijos en la definición (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = Este objeto está definido como un Array json con claves pero la definición no denomina al primer elemento hijo como la clave (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = Este objeto está definido como un Array json con claves pero la propiedad clave definida no es un tipo primitivo (children = {0}, type = {1}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = Este objeto está definido como un Array json con claves pero la propidad valor designada en las definiciones es una opción - esto no está soportado (valor property = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = Este objeto está definido como un Array json con claves pero la propiedad valor designada en las definiciones es una lista - esto no está soportado (valor property = {0}) -Unrecognised_property_ = Propiedad No Reconocida ''{0}'' -Object_must_have_some_content = El objeto debe tener algún contenido -Error_analizando_JSON_ = Error analizando JSON: {0} -Node_type__is_not_allowed = El tipo de nodo {0} no está permitido -CDATA_is_not_allowed = CDATA no está permitido -Undefined_element_ = Elemento indefinido ''{0}'' -Undefined_attribute__on__for_type__properties__ = Atributo indefinido ''@{0}'' en {1} para el tipo {2} -Text_should_not_be_present = El elemento Text no debe estar presente (''{0}'') -Wrong_namespace__expected_ = Espacio de nombres erróneo - se esperaba ''{0}'' -Element_must_have_some_content = El elemento debe tener algun contenido -No_processing_instructions_allowed_in_resources = No se permiten instrucciones de procesamiento dentro de los recursos -Unknown_resource_type_missing_rdfstype = Tipo de recurso desconocido (falta rdfs:type) -reference_to__cannot_be_resolved = La referencia a {0} no puede ser resuelta -This_property_must_be_a_URI_or_bnode_not_ = Esta propiedad debe ser una URI o bnode, no {0} -This_property_must_be_a_Literal_not_ = Esta propiedad debe ser un Literal, no {0} -Unrecognised_predicate_ = Predicado desconocido ''{0}'' -Error_analizando_Turtle_ = Error analizando Turtle: {0} -Unexpected_datatype_for_rdfstype = Tipo de datos no esperado para rdfs:type -Attempt_to_replace_element_name_for_a_nonchoice_type= Intento de reemplazar un nombre de elemento por un tipo que no es una opción -Wrong_type_for_resource = Tipo incorrecto para el recurso -Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = El recurso contenido no parece ser un recurso FHIR (nombre desconocido ''{0}'') -Unknown_Date_format_ = Formato de Fecha desconocido ''{0}'' -Unknown_Data_format_ = Formato de Datos desconocido ''{0}'' -No_type_found_on_ = No se encontro el tipo en ''{0}'' +documentmsg = (documento) +element__null_ = element = nulo: {0} +element_id__null__on_ = element id = nulo: {0} en {1} error_writing_number__to_JSON = error escribiendo el número ''{0}'' en JSON -Unable_to_process_request_for_resource_for___ = Imposible procesar la solicitud para el recurso para {0} / {1} -Resource_type_mismatch_for___ = Tipo de recurso no coincidente para {0} / {1} -not_done_yet_cant_fetch_ = No implementado aun: no se puede cargar {0} -Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Intento de utilizar el servidor terminológico pero no hay ninguno disponible -No_ExpansionProfile_provided = No se provee ExpansionProfile -Can_only_specify_profile_in_the_context = Solo se puede especificar perfil en el contexto -no_url_in_expand_value_set_2 = no hay url el conjunto de valores expandido 2 +getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList debe ser llamada cuando el elemento está particionado +needs_a_snapshot = requiere un snapshot +no_base_profile_provided = no se provee el perfil base +no_derived_structure_provided = no se provee la estructura derivada no_url_in_expand_value_set = no hay url en el conjunto de valores expandido +no_url_in_expand_value_set_2 = no hay url el conjunto de valores expandido 2 no_value_set = El conjunto de valores carece de propiedad url -No_Parameters_provided_to_expandVS = No se proveen parametros para expandVS -No_Expansion_Parameters_provided = No se proveen parametros de expansion -Unable_to_resolve_value_Set_ = Incapaz de resolver el conjunto de valores {0} -Delimited_versions_have_exact_match_for_delimiter____vs_ = Las versiones delimitadas tienen una coincidencia exacta con el delimitador ''{0}'' : {1} vs {2} -Duplicate_Resource_ = Recurso duplicado {0} de tipo {3} (versión existente {2}, nueva versión {1}) -DUPLICATE_RESOURCE_VERSION = Recurso duplicado {0} Versión {1} de tipo {2} -Error_expanding_ValueSet_running_without_terminology_services = Error expandiendo el ValueSet: corriendo sin servicios terminológicos -Error_validating_code_running_without_terminology_services = Error validando código: corriendo sin servicios terminológicos -Unable_to_validate_code_without_using_server = Imposible validar el código sin usar el servidor -Profile___Error_generating_snapshot = Perfil {0} ({1}). Error generando el snapshot -Profile___element__Error_generating_snapshot_ = Perfil {0} ({1}), elemento {2}. Error generando snapshot: {3} -Profile___base__could_not_be_resolved = Perfil {0} ({1}) la base {2} no puede ser resuelta -Profile___has_no_base_and_no_snapshot = Perfil {0} ({1}) no tiene base ni snapshot -No_validator_configured = No se ha configurado el validador -Parser_Type__not_supported = El tipo de Parser {0} no es soportado -Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Discordancia de versión. El contexto tiene la versión {0} cargada, y el nuevo contenido cargado tiene la versión {1} -Error_reading__from_package__ = Error leyendo {0} del paquete {1}#{2}: {3} -Error_analizando_ = Error analizando {0}:{1} -Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Incapaz de conectar al servicio terminológico. Use el parámetro ''-tx n/a'' para correr sin servicios terminológicos para validar LOINC, SNOMED, ICD-X etc. Error = {0} -Display_Name_for__should_be_one_of__instead_of_one = El nombre de display para {1}#{2} debe ser ''{3}'', no ''{4}'' -Display_Name_for__should_be_one_of__instead_of_many = El nombre de display para {1}#{2} debe ser uno de estas opciones {0} de ''{3}'', no ''{4}'' -Display_Name_for__should_be_one_of__instead_of_other = El nombre de display para {1}#{2} debe ser uno de estas opciones {0} de ''{3}'', no ''{4}'' -Unknown_Code_in = Código desconocido {0} en {1} -Unknown_Code_in_Version = Código desconocido {0} en {1} versión {2} -UNKNOWN_CODE_IN_FRAGMENT = Código desconocido {0} en {1} - note que el sistema de codificación está etiquetado como fragmento, así que el código puede ser válido mas allá del fragmento -Code_found_in_expansion_however_ = El código se encontró en la expansión, sin embargo: {0} -None_of_the_provided_codes_are_in_the_value_set_one = -None_of_the_provided_codes_are_in_the_value_set_many = Ninguno de los códigos provistos está en el conjunto de valores {0} -None_of_the_provided_codes_are_in_the_value_set_other = Ninguno de los códigos provistos está en el conjunto de valores {0} -Coding_has_no_system__cannot_validate = El Coding no tiene sistema - no puede ser validado -Unable_to_handle_system__concept_filter_with_op__ = Incapaz de manejar el sistema {0} filtro de concepto con op = {1} -Unable_to_handle_system__filter_with_property__ = Incapaz de manejar el sistema {0} filtro con property = {1} -Unable_to_resolve_system__value_set_has_include_with_no_system = Incapaz de resolver el sistema - conjunto de valores {0} include #{1} no tiene system -Unable_to_resolve_system__value_set_has_include_with_unknown_system = Incapaz de resolver el sistema - conjunto de valores {0} include #{1} tiene system {2} desconocido, y el servidor devuelve error {3} -Unable_to_resolve_system__value_set_has_include_with_filter = Incapaz de resolver el sistema - conjunto de valores {0} include #{1} tiene un filtro en system {2} -Unable_to_resolve_system__value_set_has_imports = Incapaz de resolver el sistema - el conjunto de valores tiene imports -Unable_to_resolve_system__value_set_has_multiple_matches = Incapaz de resolver el sistema - el conjunto de valores expandido tiene multiples coincidencias: {0} -Unable_to_resolve_system__value_set_has_no_includes_or_expansion = Incapaz de resolver el sistema - el conjunto de valores {0} no tiene include o expansio -Unable_to_resolve_system__no_value_set = Incapaz de resolver el sistema - no tiene conjunto de valores -This_base_property_must_be_an_Array_not_ = Esta propiedad base debe ser un Array, no {0} -This_property_must_be_an_Array_not_ = Esta propiedad debe ser un Array, no {0} -documentmsg = (documento) +not_done_yet_cant_fetch_ = No implementado aun: no se puede cargar {0} +not_the_right_kind_of_structure_to_generate_schematrons_for = no es la clase de estructura para la cual generar schematrons +null_min = min nulo +reference_to__cannot_be_resolved = La referencia a {0} no puede ser resuelta +type_on_first_differential_element = tipo en el primer elemento del diferencial! +type_on_first_snapshot_element_for__in__from_ = el tipo del primer elemento del snapshot para {0} en {1} de {2} xml_attr_value_invalid = El atributo XML {0} tiene un caracter inválido xml_encoding_invalid = La codificación de XML es inválida (debe ser UTF-8) -xml_stated_encoding_invalid = La codificación de XML declarada en la cabecera es inválida (debe ser ''UTF-8'' si se declara) -XHTML_URL_INVALID = La URL no es válida porque ''({1})'': {0} -MEASURE_MR_GRP_NO_CODE = El grupo debe tener un código que coincide con la definición del grupo en la medida -MEASURE_MR_GRP_UNK_CODE = El código para este grupo no tiene coincidencia en la definición de la medida -MEASURE_MR_GRP_DUPL_CODE = El código para este grupo está duplicado con otro grupo -MEASURE_MR_GRP_MISSING_BY_CODE = El MeasureReport no incluye un grupo para el grupo {0} -MEASURE_MR_GRP_NO_USABLE_CODE = Ninguno de los códigos provistos se puede utilizar para comparar - necesita completar system y code en al menos un elemento code -MEASURE_MR_GRP_NO_WRONG_CODE = El codigo provisto ({0}) no coincide con el codigo definido para el reporte ({1}) -DUPLICATE_ID = Valor de id duplicado ''{0}'' -TERMINOLOGY_TX_SYSTEM_NO_CODE = Un código sin sistema no tiene un significado definido. El elemento system debe estar presente -MEASURE_MR_GRP_POP_NO_CODE = El grupo debe tener un código que coincida con el código presente en la definicion poblacional incluida en la medida -MEASURE_MR_GRP_POP_UNK_CODE = El código para este grupo de población no coincide con ninguno en la definición de la medida -MEASURE_MR_GRP_POP_DUPL_CODE = El código para este grupo poblacional está duplicado en otro grupo -MEASURE_MR_GRP_POP_MISSING_BY_CODE = El recurso MeasureReport no incluye un grupo poblacional para el grupo {0} -MEASURE_MR_GRP_POP_COUNT_MISMATCH = Discordania entre count {0} y la cantidad de pacientes {1} -MEASURE_MR_GRP_POP_NO_SUBJECTS = Reportes donde el tipo es ''subject-list'' no tiene pacientes listados -MEASURE_MR_GRP_POP_NO_COUNT = Count debe estar preseente para reportes donde el tipo es ''subject-list'' -MEASURE_M_NO_GROUPS = Una medida debe contener como mínimo un grupo -MEASURE_M_GROUP_CODE = Los grupos deben tener códigos donde hay mas de un grupo -MEASURE_M_GROUP_POP = Los grupos de las medidas deben definir al menos una población -MEASURE_M_GROUP_STRATA = Los grupos de las medidas deben tener al menos un estratificador -MEASURE_M_GROUP_POP_NO_CODE = Un grupo de poblacion en una medida debe tener un codigo cuando hay mas de una población definida -MEASURE_M_GROUP_STRATA_NO_CODE = Un estratificador de un grupo de medidas debe tener un codigo cuando hay mas de una población definida -MEASURE_M_GROUP_STRATA_COMP_NO_CODE = Un componente de un estratificador de un grupo de medidas debe tener un codigo cuando hay mas de una población definida -MEASURE_M_LIB_UNKNOWN = La Library {0} no pudo ser resuelta, asi que la expresión de validación puede no ser correcta -TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Las URL canónicas deben ser URLs absolutas si no son fragmentos de referencias ({0}) -TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Las URL canónicas en recursos contenidos deben ser URLs absolutas si están presentes ({0}) -MEASURE_MR_SCORE_PROHIBITED_RT = No deberia haber measureScore donde el tipo de reporte es ''data-collection'' -MEASURE_MR_SCORE_PROHIBITED_MS = No deberia haber measureScore cuando el scoring del mensaje es ''cohort'' -MEASURE_MR_SCORE_REQUIRED = Se requiere un elemento measureScore cuando Measure.scoring={0} -MEASURE_MR_M_SCORING_UNK = El sistema de scoring en esta medida es desconocido por lo que el valor de measureScore no puede ser verificado -MEASURE_MR_SCORE_UNIT_PROHIBITED = Un measureScore para esta Measure Scoring ({0}) no deberia tener unidades -MEASURE_MR_SCORE_VALUE_REQUIRED = Se requiere un valor cuando Measure.scoring = {0} -MEASURE_MR_SCORE_VALUE_INVALID_01 = El valor es inválido - debe ser entre 0 y 1 -MEASURE_MR_SCORE_FIXED = Este valor está fijado por el recurso Measure a {0} -MEASURE_MR_SCORE_UNIT_REQUIRED = La unidad debe estar presente cuando el tipo de scoring es {0} -MEASURE_M_CRITERIA_UNKNOWN = El lenguaje para expresiones {0} no es soportado, asi que no puede ser validado -MEASURE_M_CQL_NOT_FOUND = Ninguna de las bibliotecas CQL define un una función {0} -MEASURE_M_CRITERIA_CQL_NO_LIB = No CQL Libraries found on this Measure -MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = Si la expresión CQL no incluye un espacio de nombres solo puede haber un Library para la medida -MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = No hay Library para el espacio de nombres {0} -MEASURE_M_CRITERIA_CQL_LIB_DUPL = Multiples bibliotecas encontradas para el espacio de nombres {0} -MEASURE_M_CRITERIA_CQL_ERROR = Error en {0}: ''{1}'' -MEASURE_M_CRITERIA_CQL_NO_ELM = Error en {0}: No se encontreo una versión compilada de CQL -MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Error en {0}: La versión compilada de CQL no es válida -MEASURE_M_CRITERIA_CQL_NOT_FOUND = La función {1} no existe en la biblioteca {0} -XHTML_URL_EMPTY = La URL está vacía -XHTML_URL_INVALID_CHARS_one = La URL contiene Caracteres Inválidos ({1}) -XHTML_URL_INVALID_CHARS_many = La URL contiene {0} Caracteres Inválidos ({1}) -XHTML_URL_INVALID_CHARS_other = La URL contiene {0} Caracteres Inválidos ({1}) -TERMINOLOGY_TX_SYSTEM_HTTPS = La URL de sistema ''{0}'' comienza erróneamente con https: en lugar de http: -CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Revisar odos los conjuntos de valores All Codes - los CodeSystems incompletos no deberian tener especificado ''All Codes'' -TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = si identifier.system es ''urn:ietf:rfc:3986'', entonces identifier.value debe ser un URI completo (debe empezar con un scheme) -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = El tamaño declarado del adjunto {0} no es válido -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = El tamaño declarado del adjunto {0} no coincide con el tamaño verdadero del adjunto {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = El tamaño declarado del adjunto no puede ser verificado porque el validador no puede acceder a la red (url = {0}) -TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = El tamaño declarado del adjunto no puede ser verificado porquethe el validador no entiend como acceder a {0} -TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = El tamaño declarado del adjunto no puede ser verificado porque hubo un error accediendo a {0}: {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = El tamaño declarado del adjunto {0} bytes lo cual excede el límite de {1} bytes -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Los adjuntos tienen datos y/o url, o sino DEBEN tener contentType y/o language -TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = El tamaño del Base64 es {0} bytes lo cual excede el límite definido de {1} bytes -TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = Se encontraron {0} posiciones decimales lo cual excede el límite definido de {1} dígitos -Validation_VAL_Profile_WrongType = El tipo de perfil especificado fue ''{0}'' en el perfil ''{2}'', pero se han encontrado tipo ''{1}'' -Validation_VAL_Profile_WrongType2 = Disonancia de tipos procesando el perfil {0} en el path {1}: El tipo de elemento es {4}, pero el perfil {3} es para un tipo diferente {2} -VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Restricción inválida en el perfil {0} en el path {1} - no se puede restringir a tipo {2} desde los tipos base {3} -EXTENSION_EXTP_CONTEXT_WRONG_XVER = La extensión {0} de la versión FHIR {3} no se puede utilizar en este punto (permitido = {1}; este elemento es [{2}; esto es una advertencia ya que los contextos pueden haber sido renombrados entre versiones de FHIR) -EXTENSION_EXTM_CONTEXT_WRONG_XVER = The modifier extension {0} from FHIR version {3} no se puede utilizar en este punto (permitido = {1}; este elemento es [{2}; esto es una advertencia ya que los contextos pueden haber sido renombrados entre versiones de FHIR) -SECURITY_STRING_CONTENT_ERROR = El valor de la cadena contiene texto que parece ser etiquetas HTML embebidas, que no pueden ser incluidas por razones de seguridad en este contexto -SECURITY_STRING_CONTENT_WARNING = El valor de la cadena contiene texto que parece ser etiquetas HTML embebidas. Si este contenido se presenta en HTML sin el procesamiento adecuado, puede ser un riesgo de seguridad -ALL_OK = TODO OK -SEARCHPARAMETER_NOTFOUND = Imposible encontrar el parámetro de búsqueda base {0} asi que no puede validarse que este SearchParameter sea una derivacion correcta del mismo -SEARCHPARAMETER_BASE_WRONG = El tipo de recurso {1} no está listado como base en el SearchParameter está derivado de ({0}) -SEARCHPARAMETER_TYPE_WRONG = El tipo {1} es diferente al tipo {0} en el SearchParameter derivado -SEARCHPARAMETER_EXP_WRONG = La expresión ''{2}'' no es compatible con la expresión ''{1}'' en el SearchParameter derivedFrom {0}, y esto indica que la relación de derivación no es válida -VALUESET_NO_SYSTEM_WARNING = No se especifica System, así que los Conceptos y Filtros no pueden ser verificados -VALUESET_INCLUDE_INVALID_CONCEPT_CODE = El código {1} no es válido en el sistema {0} -VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = El código {2} no es válido en el sistema {0} versión {1} -VALUESET_UNC_SYSTEM_WARNING = Se especificó el sistema desconocido ''{0}'', así que los Conceptos y Filtros no pueden ser verificados (Detalles: {1}) -VALUESET_UNC_SYSTEM_WARNING_VER = Se especificó un sistema/versión desconocido ''{0}'', así que los Conceptos y Filtros no pueden ser verificados (Detalles: {1}) -Extension_PROF_Type = La definición del perfil ''{0}'' permite el tipo {1} pero se han encontrado tipo {2} -TYPE_CHECKS_PATTERN_CC = El patrón [system {0}, code {1}, y display ''{2}''] definidos en el perfil {3} no se han encontrado. Problemas: {4} -TYPE_CHECKS_PATTERN_CC_US = El patrón [system {0}, code {1}, display ''{2}'' y userSelected {5}] definidos en el perfil {3} no se han encontrado. Problemas: {4} -TYPE_CHECKS_FIXED_CC = El patrón [system {0}, code {1}, y display ''{2}''] definidos en el perfil {3} no se han encontrado. Problemas: {4} -TYPE_CHECKS_FIXED_CC_US = El patrón [system {0}, code {1}, display ''{2}'' y userSelected {5}] definidos en el perfil {3} no se han encontrado. Problemas: {4} -VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = La referencia al perfil global ''{0}'' desde la IG {1} no pudo ser resuelta asi que no ha sido verificada -VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Validar el recurso contra el perfil -VALIDATION_VAL_PROFILE_SIGNPOST = Validar el recurso contra el perfil {0} -VALIDATION_VAL_PROFILE_SIGNPOST_META = Validar el recurso contra el perfil {0} (por el elemento meta) -VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Validar el recurso contra el perfil {0} (por http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies en {1}) -VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Validar el recurso contra el perfil {0} - provisto como un parámetro del bundle -VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Validar el recurso contra el perfil {0} - un perfil global en {1} -ERROR_GENERATING_SNAPSHOT = Error generando el Snapshot: {0} (esto usualmente ocurre por problemas en el diferencial) -SNAPSHOT_EXISTING_PROBLEM = El snapshot generado tiene una cantidad de elementos distinta {1} que el snapshot originalmente provisto {0} -FHIRPATH_LOCATION = (en {0}) -FHIRPATH_UNKNOWN_CONTEXT = Contexto desconocido evaluando la expresión FHIRPath: {0} -FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Elemento de contexto desconocido evaluando la expresión FHIRPath: {0} -FHIRPATH_ALIAS_COLLECTION = Intento de generar un alias para una colección, no un singleton evaluando una expresión FHIRPath -FHIRPATH_UNKNOWN_NAME = Error evaluando la expresión FHIRPath: El nombre {0} no es válido para ninguno de los posibles tipos: {1} -FHIRPATH_UNKNOWN_CONSTANT = Error evaluando la expresión FHIRPath: Constante FHIR Inválida {0} -FHIRPATH_CANNOT_USE = Error evaluando la expresión FHIRPath: No puede utilizar {0} en este contexto porque {1} -FHIRPATH_CANT_COMPARE = Error evaluando la expresión FHIRPath: No se pueden comparar valores de tipo {0} y {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_LEFT_VALUE_one = -FHIRPATH_LEFT_VALUE_many = Error evaluando la expresión FHIRPath: el operando a la izquierda de {1} puede tener solo 1 valor pero tiene {0} valores -FHIRPATH_LEFT_VALUE_other = Error evaluando la expresión FHIRPath: el operando a la izquierda de {1} puede tener solo 1 valor pero tiene {0} valores -FHIRPATH_LEFT_VALUE_WRONG_TYPE = Error evaluando la expresión FHIRPath: el operando a la izquierda de {0} tiene el tipo incorrecto {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RIGHT_VALUE_one = -FHIRPATH_RIGHT_VALUE_many = Error evaluando la expresión FHIRPath: el operando a la derecha de {1} puede tener solo 1 valor pero tiene {0} valores -FHIRPATH_RIGHT_VALUE_other = Error evaluando la expresión FHIRPath: el operando a la derecha de {1} puede tener solo 1 valor pero tiene {0} valores -FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Error evaluando la expresión FHIRPath: el operando a la derecha de {0} tiene el tipo incorrecto {1} -FHIRPATH_OP_INCOMPATIBLE = Error evaluating FHIRPath expression {0}: los operandos a la izquierda y a la derecha tienen tipos incompatibles o inválidos ({1}, {2}) -FHIRPATH_HO_HOST_SERVICES = Internal Error evaluando la expresión FHIRPath: No se proveen servicios de host ({0}) -FHIRPATH_WRONG_PARAM_TYPE = Error evaluando la expresión FHIRPath: El tipo de parametro {2} no es válido para {0} parametro {1}. esperando {3} -FHIRPATH_ORDERED_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para colecciones ordenadas -FHIRPATH_REFERENCE_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos string, uri, canonical or Reference pero se han encontrado {1} -FHIRPATH_CODED_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos string, code, uri, Coding, CodeableConcept pero se han encontrado {1} -FHIRPATH_STRING_ORD_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para colecciones ordenadas de tipo string, uri, code, id pero se han encontrado {1} -FHIRPATH_STRING_SING_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para string, uri, code, id pero se han encontrado {1} -FHIRPATH_NO_COLLECTION = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un valor singleton, pero se han encontrado {1} -FHIRPATH_NOT_IMPLEMENTED = Error evaluando la expresión FHIRPath: La función {0} no fue implementada -FHIRPATH_PARAM_WRONG = Error evaluando la expresión FHIRPath: El tipo de expresión {0} no está soportado {1} para la función {2} -FHIRPATH_CHECK_FAILED = Error evaluando la expresión FHIRPath: La verificación {0} falló -FHIRPATH_NO_TYPE = Error evaluando la expresión FHIRPath: El tipo ''{0}'' es desconocido o no soportado en {1} -FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Error en el discriminador en {0}: se encontró un elemento particionado mientras se resolvía un valor fijo para una de las particiones -FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = Problema con el uso de resolve() - el perfil {0} en {1} no pudo ser resuelta -FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = uso ilegal de resolve() en el discriminador - elemento sin tipo en {0} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_many = Uso Ilegal de resolve() en el discriminador - {0} tipos posibles en {1} (puede ser uno solo) -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = Uso Ilegal de resolve() en el discriminador - {0} tipos posibles en {1} (puede ser uno solo) -FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Uso Ilegal de resolve() en el discriminador - el tipo en {0} no es Reference {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_one = -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_many = Uso Ilegal de resolve() en el discriminador - {0} perfiles destino posibles de tipo en {1} (solo puede ser uno) -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Uso Ilegal de resolve() en el discriminador - {0} perfiles destino posibles de tipo en {1} (solo puede ser uno) -FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Problema con el uso de resolve() - el perfil {0} en {1} no pudo ser resuelta -FHIRPATH_DISCRIMINATOR_TYPE_NONE = Uso ilegal de ofType() en el discriminador - no hay tipo en el elemento {0} -FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = Uso ilegal de ofType() en el discriminador- Multiples posibles tipos en {0} -FHIRPATH_DISCRIMINATOR_NO_CODE = Uso ilegal de ofType() en el discriminador - Type no tiene codigo en {0} -FHIRPATH_DISCRIMINATOR_BAD_NAME = Nombre de función ilegal {0}() en el discriminador -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = expresión sintáctica ilegal en el discriminador (group ''{0}'') -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = expresión sintáctica ilegal en el discriminador (const) -FHIRPATH_DISCRIMINATOR_CANT_FIND = Imposible resolver el discriminador en las definiciones: {0} en el perfil {1} en el elemento {2}, buscando en el perfil {3} -FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Imposible resolver el discriminador{0} en {2} encontrado en las definiciones porque la extension {1} no ha sido encontrada en el perfil {3} -FHIRPATH_DISCRIMINATOR_NOTYPE = Error en el discriminador en {0}: no tiene hijos ni tipo -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_many = Error en el discriminador en {1}: no tiene hijos , {0} tipos -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Error en el discriminador en {1}: no tiene hijos , {0} tipos -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_many = Error en el discriminador en {1}: no tiene hijos, {0} perfiles de tipo -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Error en el discriminador en {1}: no tiene hijos, {0} perfiles de tipo -FHIRPATH_UNABLE_BOOLEAN = Imposible evaluar como boolean : {0} -XHTML_XHTML_DOCTYPE_ILLEGAL = XHTML Malformado: Se encontró una declaración DocType, y no están permitidas (Protección contra la Vulnerabilidad de seguridad XXE) -PACKAGE_VERSION_MISMATCH = Discordancia de versión de FHIR en el paquete {0}: la versión es {2} pero debe ser {1} (path: {3}) -VALUESET_REFERENCE_UNKNOWN = El conjunto de valores a importar {0} no pudo ser encontrado por lo que no puede verificarse -VALUESET_REFERENCE_INVALID_TYPE = The conjunto de valores a importar {0} apunta a un recurso de tipo {1} que no es válido -SD_MUST_HAVE_DERIVATION = El recurso StructureDefinition {0} debe tener una derivación, ya que tiene un elemento baseDefinition -VALIDATION_VAL_PROFILE_OTHER_VERSION = El perfil es para una versión diferente de FHIR ({0}) así que fue ignorado -VALIDATION_VAL_PROFILE_THIS_VERSION_OK = El perfil es para esta versión de FHIR- Todo OK -VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = El perfil es para esta versión de FHIR, pero es de tipo inválido {0} -RENDER_BUNDLE_HEADER_ROOT = Bundle {0} De tipo {1} -RENDER_BUNDLE_HEADER_ENTRY = Entry {0} -RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - FullURL = {1} -RENDER_BUNDLE_RESOURCE = Recurso {0}: -RENDER_BUNDLE_SEARCH = Búsqueda: -RENDER_BUNDLE_SEARCH_MODE = mode = {0} -RENDER_BUNDLE_SEARCH_SCORE = score = {0} -RENDER_BUNDLE_RESPONSE = Respuesta: -RENDER_BUNDLE_LOCATION = Location = {0} -RENDER_BUNDLE_ETAG = ETag = {0} -RENDER_BUNDLE_LAST_MOD = LastModified = {0} -RENDER_BUNDLE_REQUEST = Request: -RENDER_BUNDLE_IF_NON_MATCH = If-None-Match = {0} -RENDER_BUNDLE_IF_MOD = If-Modified-Since = {0} -RENDER_BUNDLE_IF_MATCH = If-Match = {0} -RENDER_BUNDLE_IF_NONE = If-None-Exist = {0} -BUNDLE_RULE_NONE = Sin reglas -BUNDLE_RULE_UNKNOWN = LA regla del Bundle refiere a un recurso inválido {0} -BUNDLE_RULE_INVALID_INDEX = El indice de la regla de Bundle no es válido ({0}) -BUNDLE_RULE_PROFILE_UNKNOWN = El perfil de reglas del Bundle {1} es desconocido para {0} -RENDER_BUNDLE_DOCUMENT_CONTENT = Contenido adicional del documento -RENDER_BUNDLE_HEADER_DOC_ENTRY_URD = {0}. {1} ({2}/{3}) -RENDER_BUNDLE_HEADER_DOC_ENTRY_U = {0}. {1} -RENDER_BUNDLE_HEADER_DOC_ENTRY_RD = {0}. {2}/{3} -UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = Imposible determinar si los códigos provistos están en el conjunto de valores {0} porque el conjunto de valores o un sistema de codificación del que depende es desconocido por el validador -TERMINOLOGY_TX_SYSTEM_WRONG_HTML = La referencia al sistema de codificación {0} es errónea - no puede apuntar a una página HTML. Esta puede ser la referencia correcta: {1} -TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = La referencia al sistema de codificación {0} es errónea - no puede apuntar a build.fhir.org. Esta puede ser la referencia correcta: {1} -FHIRPATH_BAD_DATE = Imposible analizar el elemento Date {0} -FHIRPATH_NUMERICAL_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para los tipos integer, decimal o Quantity pero se han encontrado {1} -FHIRPATH_DECIMAL_ONLY = Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un elemento decimal pero se han encontrado {1} -FHIRPATH_CONTINUOUS_ONLY= Error evaluando la expresión FHIRPath: La función {0} solo puede ser utilizada para un elemento decimal o fecha pero se han encontrado {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_FOCUS_one = -FHIRPATH_FOCUS_many = Error evaluando la expresión FHIRPath: el foco para {0} puede tener solo un valor, pero tiene {0} valores -FHIRPATH_FOCUS_other = Error evaluando la expresión FHIRPath: el foco para {0} puede tener solo un valor, pero tiene {0} valores -REFERENCE_REF_SUSPICIOUS = La sintaxis de la referencia ''{0}'' parece incorrecta y debe ser verificada -TYPE_SPECIFIC_CHECKS_DT_QTY_NO_ANNOTATIONS = Los códigos UCUM que contiene anotaciones legibles por humanos como {0} pueden ser engañosas. La mejor práctica es no usar anotaciones en los códigos UCUM, y asegurarse que Quantity.unit es correctamente legible por humanos -XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = Nombre de elemento ilegal en un párrafo en el XHTML (''{0}'') -UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Propiedad no soportada {3} en el tipo {2} para el patron del discriminador ({0}) para la partición {1} -UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = No soportado: no se han encontrado propiedades con valores en el tipo {2} para el patrón para el discriminador ({0}) para la partición {1} -SD_NESTED_MUST_SUPPORT_DIFF = El elemento {0} tiene tipos/perfiles/destinos que están marcados como must-support pero el elemento en sí no está marcado como must-support. Los must-support internos serán ignorados a menos que que el elemento herede must-support = true -SD_NESTED_MUST_SUPPORT_SNAPSHOT = El elemento {0} tiene tipos/perfiles/destinos que están marcados como must-support pero el elemento en sí no está marcado como must-support. -Unable_to_connect_to_terminology_server = Imposible conectarse con el servidor terminológico. Error = {0} -SD_ED_TYPE_PROFILE_UNKNOWN = Imposible resolver el perfil {0} -SD_ED_TYPE_PROFILE_NOTYPE = Se encontró el perfil {0}, pero es imposible definir a que tipo aplica -SD_ED_TYPE_PROFILE_WRONG = El perfil {0} es para el tipo {1}, pero el elemento {3} es de tipo {2} -SD_ED_TYPE_PROFILE_IS_MODIFIER = El perfil {0} no es para una extensión modificante pero el elemento {3} es un modificador -SD_ED_TYPE_PROFILE_NOT_MODIFIER = El perfil {0} es para una extensión modificante pero el elemento {3} no es un modificador -SD_ED_TYPE_PROFILE_WRONG_TARGET = El perfil {0} es para tipo {1}, que no es un {4} (que es requerido porque el elemento {3} es de tipo {2}) -SD_ED_TYPE_NO_TARGET_PROFILE = El tipo {0} no permite perfiles destino -TERMINOLOGY_TX_NOSVC_BOUND_REQ = No se pudo confirmar que los códigos provistos pertenezcan al conjunto de valores requerido {0} porque no hay servicio terminológico -TERMINOLOGY_TX_NOSVC_BOUND_EXT = No se pudo confirmar que los códigos provistos pertenezcan al conjunto de valores extensible {0} porque no hay servicio terminológico -ARRAY_CANNOT_BE_EMPTY = El vector no puede estar vacío - la propiedad no debe estar presente si no tiene valores -XHTML_URL_DATA_NO_DATA = Sin datos en el elemento data de la URL -XHTML_URL_DATA_DATA_INVALID_COMMA = Una coma encontrada en el elemento data de la URL: {0} -XHTML_URL_DATA_DATA_INVALID = El elemento data debe ser contenido base64 válido URL: {0} -XHTML_URL_DATA_MIMETYPE = La porción mimetype de data: URL no es válido ({1}) en la URL: {0} -SD_ED_SHOULD_BIND = El elemento {0} tiene un tipo que deberia tener una vinculación terminológica ({1}), pero no está presente -SD_ED_SHOULD_BIND_WITH_VS = El elemento {0} tiene un tipo que deberia tener una vinculación terminológica ({1}), pero no tiene definido conjunto de valores -SD_ED_BIND_UNKNOWN_VS = La referencia al ValueSet {1} en el elemento {0} no pudo ser resuelta -SD_ED_BIND_NOT_VS = La referencia al ValueSet {1} en el elemento apunta a algo que no es un conjunto de valores ({2}) -SD_ED_BIND_NO_BINDABLE = El elemento {0} tiene una vinculación, pero no se encuentran tipos vinculables {1} -SD_ED_BIND_MULTIPLE_TYPES = El elemento {0} tiene una vinculación, y tiene multiples tipos sujetos a ser vinculados ({1}). La vinculación aplicará a todos los elementos contenidos -DISCRIMINATOR_BAD_PATH = Error procesando la expresión para el discriminador: {0} (src = ''{1}'') -SLICING_CANNOT_BE_EVALUATED = La partición no pudo ser evaluada: {0} -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = La URL Canónica ''{0}'' no puede resolverse -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = La URL Canónica ''{0}'' existe pero no puede cargarse, por lo que no puede utilizarse para validación -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = La URL Canónica''{0}'' refiere a un recurso del tipo erróneo. Se encontró {1} esperando uno de {2} -CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} es un suplemento, asi que no puede usarse en Coding.system -CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} no se pudo encontrar, por lo que no puede verificarse la validez de los conceptos -CODESYSTEM_CS_SUPP_INVALID_CODE = El código ''{1}'' no se declaró en el CodeSystem base {0} asi que no es válido en el suplemento -SD_VALUE_TYPE_IILEGAL = El elemento {0} tiene un {1} de tipo {2}, que no está en la lista de tipos permitidos ({3}) -SD_VALUE_TYPE_REPEAT_HINT = El elemento repetitivo tiene un {1}. El {1} aplicará a todas las repeticiones (esto no ha quedado claro para todos los usuarios) -SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = El elemento repetitivo tiene un valor {1} para un tipo primitivo. EL validador DotNet no aplicará esto a todas las repeticiones. Esto es un error -SD_NO_TYPES_OR_CONTENTREF = El elemento {0} no tiene tipos asignados, y tampoco referencia a contenido alguno -CODESYSTEM_CS_UNK_EXPANSION = El código provisto ({2}) no está en el conjunto de valores {0}, y se requiere un código de este conjunto de valores. El sistema {1} es desconocido. -BUNDLE_SEARCH_NOSELF = Los Bundles de tipo searchset deben tener un vinculo de tipo self que especifique cual fue la búsqueda -BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = No se han podido determinar tipos por la cadena de búsqueda, asi que los tipos no pueden ser validados -BUNDLE_SEARCH_ENTRY_NO_RESOURCE = Las Entry en los Bundles de tipo searchset deben contener recursos -BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Imposible determinar si este recurso es del tipo válido para esta búsqueda -BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Los resultados de las búsquedas deben tener id -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = Este no es un recurso coincidente con lo esperado para la búsqueda ({0} esperando {1}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = Este no es un recurso OperationOutcome ({0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = Este no es un tipo de recurso coincidente para la búsqueda (¿hace falta un modo de búsqueda?) ({0} esperando {1}) -BUNDLE_SEARCH_NO_MODE = Los bundles de tipo searchset deben tener modos de busqueda en los elementos entry -INV_FAILED = La regla {0} falló -PATTERN_CHECK_STRING = El patrón [{0}] definido en el perfil {1} no fue encontrado. Problemas: {2} -TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = No se permiten URLs de ejemplo en este contexto ({0}) -UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = La secuencia Unicode tiene caracteres de control bi-di que no se permiten en este contexto: {1} -UNICODE_BIDI_CONTROLS_CHARS_MATCH = La secuencia Unicode tiene caracteres de control bi-di inconclusos (see CVE-2021-42574): {1} -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = Los CodeSystems definidos por HL7 DEBEN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = Los CodeSystems definidos por HL7 DEBERIAN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente -CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = Los CodeSystems no definidos por HL7 DEBERIAN tener un valor definido para el elemento {0} para que los usuarios conozcan el estado y significado del sistema de codificación claramente -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = Los CodeSystems NO DEBERIAN tener un valor definido para el elemento {0} si son un suplemento -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = Los CodeSystem suplementarios DEBEN tener un valor de content = 'supplement' -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = Los CodeSystem suplementarios con un valor de content = 'supplement' CodeSystem deben tener un elemento suplements que documenta cual es el code system que suplementan -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_QTY = Encontrado {0} de tipo {2} en el perfil validando un elemento Quantity (para que sea un Quantity) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = El elemento minValue en el perfil tiene un código de system de {0} que es distinto al valor en system {1} asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = El elemento minValue en el perfil tiene un código de system code de {0} que es distinto al valor en system {1} asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = El elemento minValue en el perfil no tiene un valor, asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = La cantidad no tiene un valor, asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = El minValue en el perfil no tiene system asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = El valor no tiene sistema asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = El elemento minValue en el perfil no tiene codigo asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = El valor no tiene código así que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = No hay servicio UCUM y los códigos UCUM no son idénticos, asi que el valor mínimo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Imposible convertir el valor {0} desde unidad {1} a la unidad del elemento minValue {2} basado en definiciones UCUM; el valor mínimo no es válido -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = El valor en la instancia ({2}) es menor que el valor mínimo especificado ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = El valor en la instancia ({0} {1}) es menor que el valor mínimo especificado ({2} {3}) luego de la conversión UCUM -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_QTY = Se encontró {0} de tipo {2} en el perfil validando una cantidad (debe ser de tipo Quantity) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = El elemento maxValue en el perfil tiene un sistema {0} que es diferente al sistema en el valor {1} asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = El elemento maxValue en el perfil tiene un codigo de sistema {0} que es distino al valor en system {1} asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = El elemento maxValue en el perfil no tiene valor, asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = La cantidad no tiene un valor, asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = El elemento maxValue en el perfil no tiene system asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = El elemento value no tiene system asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = El elemento maxValue en el perfil no tiene code asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = El valor no tiene code asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = No hay servicio UCUM y los códigos UCUM no son idénticos, asi que el valor máximo no puede ser verificado -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Imposible convertir {0} de unidad {1} a la unidad del elemento maxValue {2} basado en definiciones UCUM; máximo valor no es válido -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = El valor en la instancia ({2}) es mayor que el valor maximo especificado ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = El valor en la instancia ({0} {1}) es mayor que el valor del elemento maxValue ({2} {3}) luego de la conversión UCUM -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Los valores codificados con Base64 no pueden contener espacios en blanco (por RFC 4648). Notar que los lectores que no validan son invitados a aceptar espacio en blanco de todas maneras. -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Los valores codificados con Base64 no deberían contener espacios en blanco (por RFC 4648). Notar que los lectores que no validan son invitados a aceptar espacio en blanco de todas maneras. -SD_DERIVATION_KIND_MISMATCH = La definición de estructura restringe una clase de {0}, pero hay una diferente ({1}) -VALUESET_IMPORT_UNION_INTERSECTION = Este conjunto de valores tiene un sólo include con multiples conjunto de valores importados. Según el item https://jira.hl7.org/browse/FHIR-25179, ha habido confusión en el pasado sobre si estos conjunto de valores se unen o intersectan. Si este conjunto de valores está contenido en un paquete publicado antes del 31-Marzo-2022, se tratará como una unión, sino como una intersección. Si desea una unión, parta el conjunto de valores importado entre multiples includes -TX_SERVER_NO_BATCH_RESPONSE = El servidor devolvió null sobre una solicitud de validación en lote -BUNDLE_POSSSIBLE_MATCHES = El Bundle no contiene una coincidencia para {1} según las reglas de la resolución de referencias en Bundles, pero tiene varios recursos que coinciden {0} por tipo de recurso e id -BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = La Entry {0} coincide con la referencia {1} por tipo e id pero no coincide el fullUrl del destino {2} por reglas de resolución de Bundle -BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = La Entry {0} coincide con la referencia {1} por tipo e id pero su fullUrl {2} no coincide el full Url del destino {3} por reglas de resolución de Bundle -SD_ILLEGAL_CHARACTERISTICS = Este elemento tiene un {0} pero los tipos {1} no hacen que este tipo de restricción sea relevante -SD_VALUE_COMPLEX_FIXED = Para el tipo complejo {0}, considere usar un patrón en lugar de un valor fijo para evitar restringir la instancia más allá de lo imprescindible -VALUESET_SHAREABLE_MISSING = El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet -VALUESET_SHAREABLE_EXTRA_MISSING = El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet -VALUESET_SHAREABLE_MISSING_HL7 = El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet -VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no se encontró.Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet -CODESYSTEM_SHAREABLE_MISSING = El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet -CODESYSTEM_SHAREABLE_EXTRA_MISSING = The ShareableCodeSystem profile recommends that the {0} element se complete, pero no está presente. Los conjuntos de valores publicados DEBERIAN conformar al perfil ShareableValueSet -CODESYSTEM_SHAREABLE_MISSING_HL7 = El perfil ShareableValueSet dice que el elemento {0} es obligatorio, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet -CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = El perfil ShareableValueSet recomienda que el elemento {0} se complete, pero no se encontró. Los conjuntos de valores publicados por HL7 DEBEN conformar al perfil ShareableValueSet -MEASURE_SHAREABLE_MISSING = El perfil ShareableMeasure dice que el elemento {0} es obligatorio, pero no está presente. Las medidas publicadas DEBERIAN conformar al perfil ShareableMeasure -MEASURE_SHAREABLE_EXTRA_MISSING = El perfil ShareableMeasure recomienda que el elemento {0} se complete, pero no está presente. Las medidas publicadas DEBERIAN conformar al perfil ShareableMeasure -MEASURE_SHAREABLE_MISSING_HL7 = El perfil ShareableMeasure dice que el elemento {0} es obligatorio, pero no se encontró. Las medidas publicadas por HL7 DEBEN conformar al perfil ShareableMeasure -MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = El perfil ShareableMeasure recomienda que el elemento {0} se complete, pero no se encontró. Las medidas publicadas por HL7 DEBEN conformar al perfil ShareableMeasure -TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = El markdown tiene contenido que parece ser un tag de HTML embebido empezando en ''{0}''. Esto será (o DEBIERA ser) be transformado por la capa de presentación. El contenido debería ser verificado para confirmar que esta es la conducta deseada -TYPE_SPECIFIER_ILLEGAL_TYPE = El especificador de tipo {1} especificó un tipo ilegal {0} -TYPE_SPECIFIER_ABSTRACT_TYPE = El especificador de tipo {1} especificó un tipo abstracto {0} -TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Ningún especificador de tipo coincide, y el tipo subyacente {0} no es válido -TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Ningún especificador de tipo coincide, y el tipo subyacente {0} no es abstracto -ELEMENT_CANNOT_BE_NULL = El elemento no puede ser ''null'' -#The following error cannot occur for a single item. _one case left intentionally blank. -MULTIPLE_LOGICAL_MODELS_one= -MULTIPLE_LOGICAL_MODELS_many={0} Modelos Lógicos encontrados en los perfiles provistos, asi que es imposible analizar el modelo lógico(puede ser solo uno, se encontraron {1}) -MULTIPLE_LOGICAL_MODELS_other={0} Modelos Lógicos encontrados en los perfiles provistos, asi que es imposible analizar el modelo lógico(puede ser solo uno, se encontraron {1}) -UNRECOGNISED_PROPERTY_TYPE = Tipo JSON inválido {0} para el elemento {1}; tipos válidos = {2} -UNRECOGNISED_PROPERTY_TYPE_WRONG = Tipo inválido {2} para el elemento {1}; tipos válidos = {3}, tipo JSON = {0} -SD_TYPE_MISSING = No se encontró tipo -SD_TYPE_NOT_MATCH_NS = El espacio de nombres para el tipo {0} DEBERIA coincidir con el espacio de nombres de la url {1} para la definición del tipo -SD_TYPE_NOT_DERIVED = El tipo {0} solo puede ser usado como tipo cuando se restringe la definición base del tipo -SD_TYPE_NOT_LOCAL = El tipo {0} no es legal porque no está definida en la especificación FHIR. Otros tipos deben tener un espacio de nombres sobre ellos -SD_TYPE_NOT_LOGICAL = El tipo {0} solo puede ser definido si la categoria es 'logical' no {1} -SD_CONSTRAINED_TYPE_NO_MATCH = El tipo {0} debe ser el mismo en la estructura base {1} que está siendo restringida -SD_SPECIALIZED_TYPE_MATCHES = El tipo {0} no debe ser la misma que el tipo en la estructura base {1} que se está especializando -SD_CONSTRAINED_KIND_NO_MATCH = La clase {0} debe ser la misma {1} en la estructura base {3} (tipo base = {2}) -SD_PATH_TYPE_MISMATCH = El path {1} debe empezar con el tipo de la estructura {0} -//ARREGLARME -NO_VALID_DISPLAY_FOUND_one = -NO_VALID_DISPLAY_FOUND_many = -NO_VALID_DISPLAY_FOUND_other = -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_many = -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = -UNICODE_XML_BAD_CHARS_one = -UNICODE_XML_BAD_CHARS_many = -UNICODE_XML_BAD_CHARS_other = -Display_Name_WS_for__should_be_one_of__instead_of_one = -Display_Name_WS_for__should_be_one_of__instead_of_many = -Display_Name_WS_for__should_be_one_of__instead_of_other = -SD_ED_TYPE_PROFILE_WRONG_TYPE_one = -SD_ED_TYPE_PROFILE_WRONG_TYPE_many = -SD_ED_TYPE_PROFILE_WRONG_TYPE_other = -VALUESET_SUPPLEMENT_MISSING_one = -VALUESET_SUPPLEMENT_MISSING_many = -VALUESET_SUPPLEMENT_MISSING_other = -BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_one = -BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_many = -BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_other = diff --git a/exec/pack/Messages_ja.properties b/exec/pack/Messages_ja.properties index d728c5483..466305d0a 100644 --- a/exec/pack/Messages_ja.properties +++ b/exec/pack/Messages_ja.properties @@ -1,1035 +1,899 @@ -InstanceValidator -Bad_file_path_error = \n********************\n* ã‚ãªãŸãŒæŒ‡å®šã—ãŸãƒ•ã‚¡ã‚¤ãƒ«å〠''{0}'' ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«å­˜åœ¨ã—ã¾ã›ã‚“。\n* ã“ã‚ŒãŒæœ‰åŠ¹ãªãƒ•ã‚¡ã‚¤ãƒ«ã®å ´æ‰€ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。\n********************\n\n -Bundle_BUNDLE_Entry_Canonical = æ­£è¦URL({0})ã¯ã€æ­£è¦ã‚µãƒ¼ãƒä¸Šã§ãªã‘ã‚Œã°ã€fullUrl({1})ã¨ä¸€è‡´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Bundle_BUNDLE_Entry_Document = 文書ã®æœ€åˆã®ã‚¨ãƒ³ãƒˆãƒªã¯compositionã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_IdUrlMismatch = リソースIDã¯ã‚¨ãƒ³ãƒˆãƒªã®fullUrl内ã®ID(''{0}'' vs ''{1}'')ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -Bundle_BUNDLE_Entry_MismatchIdUrl = æ­£è¦URL({0})ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ID({2})も一致ã™ã‚‹å ´åˆã«é™ã‚Šã€fullUrl({1})ã¨ä¸€è‡´ã§ãã¾ã™ -Bundle_BUNDLE_Entry_NoFirst = ドキュメントã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å°‘ãªãã¨ã‚‚一ã¤ã®ã‚¨ãƒ³ãƒˆãƒªã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Bundle_BUNDLE_Entry_NoFirstResource = 最åˆã®ã‚¨ãƒ³ãƒˆãƒªã«ãƒªã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_NoFullUrl = BundleエントリãŒfullUrlを欠ã„ã¦ã„ã¾ã™ -BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = トランザクションã¨ãƒãƒƒãƒã‚’除ãã€Bundleã®å„エントリã«ã¯ã€ã‚¨ãƒ³ãƒˆãƒªå†…ã®ãƒªã‚½ãƒ¼ã‚¹ã®è­˜åˆ¥å­ã§ã‚ã‚‹fullUrlãŒå¿…è¦ã§ã™ -Bundle_BUNDLE_Entry_NoProfile_TYPE = タイプ''{1}''ã®{0}リソースã«å¯¾ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_NoProfile_EXPL = {0}リソースã®ã‚¿ã‚¤ãƒ—''{0}''ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸãƒ—ロファイル{2}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = リソース''Binary/{0}''ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸè«–ç†ãƒ¢ãƒ‡ãƒ«{1}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_NotFound = ãƒãƒ³ãƒ‰ãƒ«({1})内ã§''{0}''ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_Orphan_MESSAGE = エントリ{0}ã¯MessageHeaderã‹ã‚‰ã®ãƒªãƒ³ã‚¯ï¼ˆå‰æ–¹ã¾ãŸã¯å¾Œæ–¹ï¼‰ã‚’ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ããªã„ãŸã‚ã€ãã®å­˜åœ¨ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡¦ç†ã«å¿…è¦ï¼Ÿï¼‰ -Bundle_BUNDLE_Entry_Orphan_DOCUMENT = エントリ{0}ã¯Compositionã‹ã‚‰ã®ãƒªãƒ³ã‚¯ï¼ˆå‰æ–¹ã¾ãŸã¯å¾Œæ–¹ï¼‰ã‚’ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“ -BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = エントリ{0}ã¯Compositionã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã®ã‚ˆã†ãªä½¿ç”¨æ³•ãŒæ‰¿èªã•ã‚Œã¦ã„ã‚‹ã®ã¯Provenanceã®ã¿ã§ã™ï¼ˆR4セクション3.3.1) -BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = エントリ{0}ã¯Compositionã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒnarrative contentã®ã‚½ãƒ¼ã‚¹ã§ã‚ã‚‹å ´åˆã€compositionã‹ã‚‰ç›´æŽ¥ãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ã¹ãã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„ -BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = エントリ{0}ã¯MessageHeaderã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ„図ã—ã¦å«ã¾ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‹ç¢ºèªã—ã¦ãã ã•ã„(メッセージã®å‡¦ç†ã«å¿…è¦ã§ã™ï¼‰ -Bundle_BUNDLE_Entry_Type = タイプ''{0}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - ã“ã“ã§ã¯ãƒªã‚½ãƒ¼ã‚¹ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(allowed = {1}) -Bundle_BUNDLE_Entry_Type2 = タイプ''{0}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - {1}ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(allowed = {2}) -Bundle_BUNDLE_Entry_Type3_one = タイプ''{1}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - タイプ{2}ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Bundle_BUNDLE_Entry_Type3_other = タイプ''{1}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - {0}タイプã®ã†ã¡ã®ä¸€ã¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“: {2} -Bundle_BUNDLE_FullUrl_Missing = fullUrlを欠ã„ãŸBundle内ã«ã®ã‚¨ãƒ³ãƒˆãƒªã«ç›¸å¯¾ReferenceãŒå­˜åœ¨ã—ã¾ã™ -Bundle_BUNDLE_FullUrl_NeedVersion = fullURL {0}ã«ä¸€è‡´ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³å›ºæœ‰ã®å‚ç…§ãŒã‚ã‚‹ãŸã‚meta/versionIdを宣言ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Bundle_BUNDLE_MultipleMatches = reference {0}ã«å¯¾ã—ã¦ãƒãƒ³ãƒ‰ãƒ«å†…ã§è¤‡æ•°ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Bundle_BUNDLE_Not_Local = URN referenceã¯ãƒãƒ³ãƒ‰ãƒ«{0}内ã«ãƒ­ãƒ¼ã‚«ãƒ«ã§å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ -Bundle_MSG_Event_Count = {0} ãŒæœŸå¾…ã•ã‚Œã¾ã—ãŸãŒã€{1} ã®ã‚¤ãƒ™ãƒ³ãƒˆè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Bundle_Document_Date_Missing = ドキュメントã¯æ—¥ä»˜ã‚’æŒã£ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(Bundle.timestamp) -Bundle_Document_Date_Missing_html = [(type = ''document'') 㯠(meta.lastUpdated.hasValue()) ã‚’æ„味ã—ã¾ã™] -CapabalityStatement_CS_SP_WrongType = タイプã®ä¸ä¸€è‡´ - SearchParameter ''{0}'' ã®ã‚¿ã‚¤ãƒ—㯠{1} ã§ã™ãŒã€ã“ã“ã§ã¯ã‚¿ã‚¤ãƒ—㯠{2} ã§ã™ -CodeSystem_CS_VS_IncludeDetails = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã«ä½™åˆ†ãªè©³ç´°ãŒã‚ã‚Šã¾ã™ -CodeSystem_CS_VS_Invalid = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ValueSetã«ã¯ä¸€ã¤ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã—ã‹ã‚ã‚Šã¾ã›ã‚“ -CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãã‚Œã¯conceptã®æ•°ãŒç•°ãªã‚‹expansionã§ã™ï¼ˆæœŸå¾…ã—ãŸã®ã¯ {3} 件ã§ã™ãŒã€ {2} 件見ã¤ã‘ã¾ã—ãŸï¼‰ -CodeSystem_CS_VS_WrongSystem = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ValueSetã«ã¯ä¸€è‡´ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ï¼ˆ{2})ãŒã‚ã‚Šã¾ã›ã‚“ -EXTENSION_CONTEXT_UNABLE_TO_CHECK_PROFILE = extension {0} ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} を指定ã—ã¾ã™ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ç¾æ™‚点ã§ã¯ãƒ—ロファイルãŒæœ‰åŠ¹ã‹ã©ã†ã‹ã‚’確èªã§ãã¾ã›ã‚“ -EXTENSION_CONTEXT_UNABLE_TO_FIND_PROFILE = extension {0} ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} を指定ã—ã¾ã™ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãã®ãƒ—ロファイルを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Extension_EXTP_Context_Wrong = extension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ {2}) -Extension_EXTM_Context_Wrong = modifierExtension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ {2}) -Extension_EXT_Count_Mismatch = extensionã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“: 期待ã—ãŸã®ã¯ {0} 件ã§ã™ãŒã€ {1} 件見ã¤ã‘ã¾ã—㟠-Extension_EXT_Count_NotFound = extensionã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“: extensionを見ã¤ã‘られã¾ã›ã‚“: {0} -Extension_EXT_Fixed_Banned = 指定ã•ã‚ŒãŸå›ºå®šå€¤ã«extensionãŒå«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€extensionã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“ -Extension_EXT_Modifier_MismatchN = Extension modifierã®ä¸ä¸€è‡´: extensionè¦ç´ ã¯modifierã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã¾ã›ã‚“ãŒã€åŸºç¤Žã¨ãªã‚‹extensionã¯modifierã§ã™ -Extension_EXT_Modifier_MismatchY = Extension modifierã®ä¸ä¸€è‡´: extensionè¦ç´ ã¯modifierã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã¾ã™ãŒã€åŸºç¤Žã¨ãªã‚‹extensionã¯modifierã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Extension_EXT_Modifier_N = extension ''{0}'' ã¯extensionã¨ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ (ãã‚Œã¯modifierExtensionã§ã™) -Extension_EXT_Modifier_Y = extension ''{0}'' ã¯modifierExtensionã¨ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ (ãã‚Œã¯é€šå¸¸ã®extensionã§ã™) -Extension_EXT_Simple_ABSENT = extension ''{0}'' ã®å®šç¾©ã¯å˜ç´”ãªextensionã®ãŸã‚ã€å€¤ã‚’å«ã¾ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Extension_EXT_Simple_WRONG = extension ''{0}'' ã®å®šç¾©ã¯å˜ç´”ãªextensionã®ãŸã‚ã€extensionã§ã¯ãªã値をå«ã¾ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Extension_EXT_SubExtension_Invalid = サブextensionã®url ''{0}'' ã¯extension {1} ã«ã‚ˆã£ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Extension_EXT_Type = extension ''{0}'' ã®å®šç¾©ã¯ã‚¿ã‚¤ãƒ— {1} を許å¯ã—ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {2} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Extension_EXT_URL_Absolute = Extension.urlã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Extension_EXT_Unknown = 未知ã®extension {0} -Extension_EXT_Unknown_NotHere = extension {0} ã¯æœªçŸ¥ã§ã‚ã‚Šã€ã“ã“ã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Extension_EXT_Url_NotFound = Extension.urlã¯å¿…é ˆã§ã™ -Extension_EXT_Version_Internal = extensionã®url ''{0}'' ã®è©•ä¾¡çŠ¶æ…‹ãŒç„¡åŠ¹ã§ã™ -Extension_EXT_Version_Invalid = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (無効ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ ''{1}'') -Extension_EXT_Version_InvalidId = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (無効ãªElement id ''{1}'') -Extension_EXT_Version_NoChange = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (Element id ''{1}'' ã¯æœ‰åŠ¹ã§ã™ãŒã€é–¢é€£ã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å¤‰æ›´ãŒãªã„ãŸã‚ã€ã‚¯ãƒ­ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ‘ラダイムã§ä½¿ç”¨ã§ãã¾ã›ã‚“) -Fixed_Type_Checks_DT_Address_Line = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®è¡Œè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠-Fixed_Type_Checks_DT_Name_Family = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®familyè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠-Fixed_Type_Checks_DT_Name_Given = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®givenè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠-Fixed_Type_Checks_DT_Name_Prefix = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®prefixè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠-Fixed_Type_Checks_DT_Name_Suffix = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®suffixè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠-Internal_INT_Bad_Type = 未処ç†ã®å›ºå®šå€¤ã‚¿ã‚¤ãƒ— {0} -Language_XHTML_Lang_Different1 = リソースã¯language({0})ã‚’æŒã£ã¦ãŠã‚Šã€XHTMLã‚‚lang ({1})ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãれらã¯ç•°ãªã‚Šã¾ã™ -Language_XHTML_Lang_Different2 = リソースã¯language({0})ã‚’æŒã£ã¦ãŠã‚Šã€XHTMLã‚‚xml:lang ({1})ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãれらã¯ç•°ãªã‚Šã¾ã™ -Language_XHTML_Lang_Missing1 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯langã‚¿ã‚°ã¾ãŸã¯xml:langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (両方ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing2 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (langã¨xml:langã®ä¸¡æ–¹ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -Language_XHTML_Lang_Missing3 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯xml:langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (langã¨xml:langã®ä¸¡æ–¹ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) -eta_RES_Security_Duplicate = é‡è¤‡ã—ãŸã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ©ãƒ™ãƒ« {0} -ustSupport_VAL_MustSupport = è¦ç´  {0} ã¯ãƒ—ロファイル {1} 㧠''mustSupport''ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。ãã®è¦ç´ ã‚’使ã‚ãªã„ã‹ã€ã¾ãŸã¯ãƒ—ロファイルã§è¦ç´ ã‚’must-Supportã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„ -Profile_EXT_Not_Here = extension {0} ã¯ã€ã“ã®ç‚¹ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯è¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“(コンテキストä¸å¤‰ ''{1}'' ã«åŸºã¥ã„ã¦ï¼‰ -Profile_VAL_MissingElement = è¦ç´  ''{0}'' ãŒæ¬ è½ã—ã¦ã„ã¾ã™ - プロファイル {1} ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå›ºå®šå€¤ã«ã‚ˆã‚Šå¿…è¦ã¨ã•ã‚Œã¾ã™ -Profile_VAL_NotAllowed = è¦ç´  {0} ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ—ロファイルã§æŒ‡å®šã•ã‚ŒãŸé©ç”¨å¯èƒ½ãª {1} ã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -easure_MR_M_None = MeasureãŒç‰¹å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€Measureã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“ -easure_MR_M_NotFound = Measure ''{0}'' を解決ã§ãã¾ã›ã‚“ã§ã—ãŸã€Measureã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_BadOption = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ {1}(システム {0})ã¯Questionnaireã®ã‚ªãƒ—ションValueSet({2})ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“: {3} -QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ {1} ã¯Questionnaireã®ã‚ªãƒ—ションValueSet({2})ã§æ¤œè¨¼ã§ãã¾ã›ã‚“。システム {0} ã¯æœªçŸ¥ã§ã™ -Questionnaire_QR_Item_Coding = エラー {0} ã¯Questionnaireオプションã«å¯¾ã™ã‚‹Codingを検証ã—ã¾ã™ -Questionnaire_QR_Item_CodingNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€Codingオプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_DateNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ—¥ä»˜ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_Display = DISPLAYタイプ以外ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ - linkId {0} -Questionnaire_QR_Item_Group = グループタイプã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å›žç­”ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_GroupAnswer = グループタイプ以外ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã€å›žç­”ã®å¤–å´ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“(.itemã§ã¯ãªãanswer.itemを使用ã—ã¾ã™ï¼‰ -Questionnaire_QR_Item_IntNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€integerã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_Missing = 必須アイテム ''{0}'' ã«å¯¾ã™ã‚‹å›žç­”ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoCoding = コード {0}::{1} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoDate = 日付 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoInteger = æ•´æ•° {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoLinkId = LinkIdãŒãªã„ãŸã‚ã€æ¤œè¨¼ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptions = オプションãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã‚ªãƒ—ションを検証ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptionsCoding = オプションリストã«ã¯codingåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptionsDate = オプションリストã«ã¯dateåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptionsInteger = オプションリストã«ã¯integeråž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptionsString = オプションリストã«ã¯stringåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoOptionsTime = オプションリストã«ã¯timeåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoString = 文字列 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoTime = 時間 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_NoType = アイテム {0} ã®å®šç¾©ã«ã¯ã‚¿ã‚¤ãƒ—ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ -Questionnaire_QR_Item_NotEnabled = アイテムãŒæœ‰åŠ¹ã§ãªã„ã«ã‚‚ã‹ã‹ã‚らãšå›žç­”(2)をæŒã£ã¦ã„ã¾ã™ {0} -Questionnaire_QR_Item_NotEnabled2 = アイテムãŒæœ‰åŠ¹ã§ãªã„ã«ã‚‚ã‹ã‹ã‚らãšå›žç­”ã‚’æŒã£ã¦ã„ã¾ã™ï¼ˆitem id = ''{0}'') -Questionnaire_QR_Item_NotFound = Questionnaireã§LinkId ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_OnlyOneA = ã“ã®LinkIdã‚’æŒã¤å›žç­”アイテムã¯1ã¤ã ã‘許å¯ã•ã‚Œã¾ã™ -Questionnaire_QR_Item_OnlyOneI_one = -Questionnaire_QR_Item_OnlyOneI_other = LinkId {1} ã‚’æŒã¤å›žç­”アイテムã¯1ã¤ã ã‘許å¯ã•ã‚Œã¾ã™ - {0} 個ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Questionnaire_QR_Item_Order = 構造的エラー:アイテムã®é †åºãŒä¸é©åˆ‡ã§ã™ -Questionnaire_QR_Item_StringNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€stringåž‹ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_Text = テキストãŒå­˜åœ¨ã™ã‚‹å ´åˆã€ãã‚Œã¯LinkId {0} ã®Questionnaire定義ã¨ä¸€è‡´ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_TimeNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ™‚é–“åž‹ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_QR_Item_WrongType_one = 回答値㯠{1}åž‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Questionnaire_QR_Item_WrongType_other = 回答値㯠{0} åž‹ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ ({1}) -Questionnaire_QR_Q_None = QuestionnaireãŒç‰¹å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒ™ãƒ¼ã‚¹Questionnaireã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯è¡Œãˆã¾ã›ã‚“ -Questionnaire_QR_Q_NotFound = Questionnaire ''{0}'' を解決ã§ããªã„ãŸã‚ã€ãƒ™ãƒ¼ã‚¹Questionnaireã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯è¡Œãˆã¾ã›ã‚“ -Questionnaire_Q_EnableWhen_After = ã“ã®enableWhenルール ({0}) ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯ã€è³ªå•è‡ªä½“ã®å¾Œã«æ¥ã¾ã™ -Questionnaire_Q_EnableWhen_IsInner = enableWhenã‚’æŒã¤è³ªå•ã¯ã€ãã®enableWhenæ¡ä»¶ã«ã¤ã„ã¦å†…部質å•ã‚’å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Questionnaire_Q_EnableWhen_NoLink = enableWhenã‚’æŒã¤è³ªå•ã¯ã€è³ªå•ãƒªãƒ³ã‚¯ã«å€¤ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ -Questionnaire_Q_EnableWhen_NoTarget = enableWhenã«ã¦ ''{1}'' ã®å‚ç…§ãŒã‚ã‚‹linkId ''{0}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Questionnaire_Q_EnableWhen_Self = ã“ã®è³ªå•ã®enableWhenã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯è‡ªèº«ã‚’å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Reference_REF_Aggregation = å‚照㯠{0} ã§ã‚ã‚Šã€å‚ç…§ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸé›†ç´„モード({1})ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -Reference_REF_BadTargetType = 無効ãªãƒªã‚½ãƒ¼ã‚¹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¿ã‚¤ãƒ—。{0} を見ã¤ã‘ã¾ã—ãŸãŒã€ ({1}) ã®ã„ãšã‚Œã‹ã‚’期待ã—ã¦ã„ã¾ã—㟠-Reference_REF_BadTargetType2 = å‚ç…§URL {1} ã«ã‚ˆã£ã¦ç¤ºã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ— ''{0}'' ã¯ã€ã“ã®è¦ç´ ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({2} ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -Reference_REF_CantMatchChoice = é¸æŠžè‚¢ {1} ã®ä¸­ã‹ã‚‰profile {0} ã®ãƒžãƒƒãƒã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Reference_REF_CantMatchType = é¸æŠžè‚¢ {1} ã®ä¸­ã‹ã‚‰profile {0}(タイプ別)ã®ãƒžãƒƒãƒã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Reference_REF_CantResolve = å‚ç…§ ''{0}'' ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解決ã§ãã¾ã›ã‚“ -Reference_REF_CantResolveProfile = profileå‚ç…§ ''{0}'' を解決ã§ãã¾ã›ã‚“ -Reference_REF_Format1 = 相対URLã¯[ResourceName]/[id]ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ã¾ãŸã¯æ¤œç´¢URL([type]?parameters)ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚ {0} ã«é­é‡ã—ã¾ã—㟠-Reference_REF_Format2 = 相対URLã¯[ResourceName]/[id]ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。 {0} ã«é­é‡ã—ã¾ã—㟠-Reference_REF_MultipleMatches = é¸æŠžè‚¢ {1} ã®ä¸­ã§ {0} ã«å¯¾ã™ã‚‹è¤‡æ•°ã®profileãŒãƒžãƒƒãƒã—ã¾ã—㟠-Reference_REF_NoDisplay = 実際ã®referenceã¾ãŸã¯identifierãŒãªã„referenceã¯displayã‚’æŒã¤ã¹ãã§ã™ -Reference_REF_NoType = Bundleã¾ãŸ+D130ã¯containedå‚ç…§ãŒãƒãƒ³ãƒ‰ãƒ«/リソース {0} 内ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Reference_REF_NotFound_Bundle = Bundle/containedリソースã«å¯¾ã™ã‚‹å‚ç…§ãŒãƒãƒ³ãƒ‰ãƒ«/リソース {0} 内ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Reference_REF_ResourceType = reference {0} ãŒresourceType {1}ã«ãƒžãƒƒãƒã—ã¦ã„ã¾ã™ -Reference_REF_WrongTarget = タイプ ''{0}'' ã¯ã“ã®è¦ç´ ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({1} ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -REFERENCE_REF_WRONGTARGET_LOAD = タイプ ''{2}'' ã¯è¦ç´  {0} ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({1} ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -Resource_RES_ID_Malformed_Length = 無効ãªãƒªã‚½ãƒ¼ã‚¹ID:長ã™ãŽã¾ã™ ({0} 文字) -Resource_RES_ID_Malformed_Chars = 無効ãªãƒªã‚½ãƒ¼ã‚¹ID:無効ãªæ–‡å­— (''{0}'') -Resource_RES_ID_Missing = リソースã«ã¯idãŒå¿…è¦ã§ã™ãŒã€å­˜åœ¨ã—ã¾ã›ã‚“ -Resource_RES_ID_Prohibited = リソースã«ã¯idãŒã‚ã‚Šã¾ã™ãŒã€è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Terminology_PassThrough_TX_Message = {0} for ''{1}#{2}'' -Terminology_TX_Binding_CantCheck = URIå‚ç…§ã«ã‚ˆã‚‹ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -Terminology_TX_Binding_Missing = CodeableConcept {0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ -Terminology_TX_Binding_Missing2 = Coding {0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ -Terminology_TX_Binding_NoServer = 用語サーãƒãƒ¼ãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ[{0}])を検証ã§ãã¾ã›ã‚“ã§ã—㟠-Terminology_TX_Binding_NoSource = パス{0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã¯ã‚½ãƒ¼ã‚¹ãŒãªã„ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -Terminology_TX_Binding_NoSource2 = ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã‚½ãƒ¼ã‚¹ãŒãªã„ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -Terminology_TX_Code_NotValid = コード{0}ã¯ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ {1}ã§æœ‰åŠ¹ãªã‚³ãƒ¼ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Terminology_TX_Code_Unknown = ä¸æ˜Žãªã‚³ãƒ¼ãƒ‰ï¼ˆ{0}#{1}) -Terminology_TX_Code_ValueSet = コードãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。ValueSet {0} ã®ã‚³ãƒ¼ãƒ‰ãŒå¿…é ˆã§ã™ -Terminology_TX_Code_ValueSet_MISSING = コードãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。ValueSetã®ã‚³ãƒ¼ãƒ‰ãŒå¿…é ˆã§ã™ -Terminology_TX_Code_ValueSetMax = コードãŒæä¾›ã•ã‚Œã¦ãŠã‚‰ãšã€ValueSet{0}ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆæœ€å¤§ValueSet{1}) -Terminology_TX_Code_ValueSet_Ext = コードãŒæä¾›ã•ã‚Œã¦ãŠã‚‰ãšã€ValueSet{0}ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Terminology_TX_Coding_Count = {0}ãŒæœŸå¾…ã•ã‚Œã¦ã„ã¾ã—ãŸãŒã€{1}ã®codingè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Terminology_TX_Confirm_1_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…é ˆã§ã™ï¼ˆã‚¯ãƒ©ã‚¹= {1}) -Terminology_TX_Confirm_2_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)(クラス= {1}) -Terminology_TX_Confirm_3_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codingãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¹= {1}) -Terminology_TX_Confirm_4a = æä¾›ã•ã‚ŒãŸcode({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼š{1} -Terminology_TX_Confirm_4b = æä¾›ã•ã‚ŒãŸcode({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼š{1} -Terminology_TX_Confirm_5 = æä¾›ã•ã‚ŒãŸcodeãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“) -Terminology_TX_Confirm_6 = æä¾›ã•ã‚ŒãŸcodeãŒValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ -Terminology_TX_Display_Wrong = displayã¯''{0}''ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Terminology_TX_Error_CodeableConcept = CodeableConceptã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} -Terminology_TX_Error_CodeableConcept_Max = maxValueSetを使用ã—ã¦CodeableConceptを検証ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} -Terminology_TX_Error_Coding1 = Codingã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} -Terminology_TX_Error_Coding2 = Codingã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0}: {1} -Terminology_TX_NoValid_1_CC = æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet {0}ã«å«ã¾ã‚Œã¦ãŠã‚‰ãšã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆcodes = {1}) -Terminology_TX_NoValid_10 = æä¾›ã•ã‚ŒãŸcodeã¯æœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆcode = {1}#{2}) -Terminology_TX_NoValid_11 = æä¾›ã•ã‚ŒãŸcodeã¯æœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆcode = {1}#{2}, error = {3}) -Terminology_TX_NoValid_12 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ã€‚{1} -Terminology_TX_NoValid_13 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªcodeãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)。{1} -Terminology_TX_NoValid_14 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ã€‚{1} -Terminology_TX_NoValid_15 = 用語サーãƒãƒ¼ãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')を検証ã§ãã¾ã›ã‚“ã§ã—㟠-Terminology_TX_NoValid_15A = code system {1}ãŒä¸æ˜ŽãªãŸã‚ã€æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')を検証ã§ãã¾ã›ã‚“ã§ã—㟠-Terminology_TX_NoValid_16 = æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet {1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼‰{2} -Terminology_TX_NoValid_17 = æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet {1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“){2} -Terminology_TX_NoValid_18 = æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet{1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼‰{2} -Terminology_TX_NoValid_2_CC = æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)(codes = {1}) -Terminology_TX_NoValid_3_CC = æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ãªã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codingãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼‰ï¼ˆcodes = {1}) -Terminology_TX_NoValid_4 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™{1} -Terminology_TX_NoValid_5 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“){1} -Terminology_TX_NoValid_6 = æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ {1} -Terminology_TX_NoValid_7 = æä¾›ã•ã‚ŒãŸcodeã®ã„ãšã‚Œã‚‚ãŒæœ€å¤§ValueSet {0}ã§æ¤œè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆerror = {2}) -Terminology_TX_NoValid_8 = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‚‚ãŒæœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ï¼ˆcodes = {1}) -Terminology_TX_NoValid_9 = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ï¼ˆ{2})ã¯æœ€å¤§ValueSet {0}ã§æ¤œè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆã‚¨ãƒ©ãƒ¼= {1}) -Terminology_TX_System_Invalid = 無効ãªã‚·ã‚¹ãƒ†ãƒ URI:{0} -Terminology_TX_System_NotKnown = コードシステムURI ''{0}''ãŒä¸æ˜ŽãªãŸã‚ã€ã‚³ãƒ¼ãƒ‰ã‚’検証ã§ãã¾ã›ã‚“ -TERMINOLOGY_TX_SYSTEM_NOT_USABLE = URIãŒ''{0}''ã®CodeSystemã®å®šç¾©ã«ã¯codeãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€codeを検証ã§ãã¾ã›ã‚“ -Terminology_TX_System_Relative = Coding.systemã¯ãƒ­ãƒ¼ã‚«ãƒ«å‚ç…§ã§ã¯ãªãã€çµ¶å¯¾å‚ç…§ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Terminology_TX_System_Unknown = ä¸æ˜ŽãªCodeSystem ''{0}'' -Terminology_TX_System_ValueSet = 無効ãªã‚·ã‚¹ãƒ†ãƒ URI:{0} - ValueSetURIをシステムã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“ -Terminology_TX_System_ValueSet2 = CodingãŒCodeSystemã§ã¯ãªãã€ValueSetã‚’å‚ç…§ã—ã¦ã„ã¾ã™ï¼ˆ''{0}'') -Terminology_TX_ValueSet_NotFound = ValueSet {0}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Terminology_TX_ValueSet_NotFound_CS = ValueSetãŒã‚ã‚‹ã¹ã場所ã«CodeSystem({0})ã¸ã®å‚ç…§ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Type_Specific_Checks_DT_Base64_Valid = 値''{0}''ã¯æœ‰åŠ¹ãªBase64値ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Boolean_Value = 真å½å€¤ã¯''true''ã¾ãŸã¯''false''ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Code_WS = コード ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (空白ã®ãƒ«ãƒ¼ãƒ«) -Type_Specific_Checks_DT_DateTime_Reasonable = 値 ''{0}'' ã¯ã€åˆç†çš„ãªå¹´ã®ç¯„囲外ã§ã™ - データ入力エラーを確èªã—ã¦ãã ã•ã„ -Type_Specific_Checks_DT_DateTime_Regex = instant ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“(正è¦è¡¨ç¾ã«ã‚ˆã‚‹ï¼‰ -Type_Specific_Checks_DT_DateTime_TZ = 日付ã«æ™‚é–“ãŒã‚ã‚‹å ´åˆã€ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚’æŒãŸãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_DateTime_Valid = 有効ãªæ—¥ä»˜/時間ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -Type_Specific_Checks_DT_Date_Valid = 有効ãªæ—¥ä»˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -Type_Specific_Checks_DT_Decimal_Range = 値 ''{0}'' ã¯ã€ä¸€èˆ¬çš„ã«/åˆç†çš„ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹å進数ã®ç¯„囲外ã§ã™ -Type_Specific_Checks_DT_Decimal_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªå進数ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Decimal_GT = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§å€¤ {0} を超ãˆã¦ã„ã¾ã™ -Type_Specific_Checks_DT_Decimal_LT = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ {0} を下回ã£ã¦ã„ã¾ã™ -Type_Specific_Checks_DT_ID_Valid = id値 ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Identifier_System = Identifier.systemã¯çµ¶å¯¾å‚ç…§ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ãƒ­ãƒ¼ã‚«ãƒ«å‚ç…§ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Instant_Valid = 有効ãªinstantã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -Type_Specific_Checks_DT_Integer64_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªinteger64ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_Integer_GT = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§å€¤ {0} を超ãˆã¦ã„ã¾ã™ -Type_Specific_Checks_DT_Integer_LT = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ {0} を下回ã£ã¦ã„ã¾ã™ -Type_Specific_Checks_DT_Integer_LT0 = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ 0 を下回ã£ã¦ã„ã¾ã™ -Type_Specific_Checks_DT_Integer_LT1 = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ 1 を下回ã£ã¦ã„ã¾ã™ -Type_Specific_Checks_DT_Integer_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªæ•´æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_OID_Start = OIDã¯urn:oid:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Type_Specific_Checks_DT_OID_Valid = OIDã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ ({0}) -Type_Specific_Checks_DT_Primitive_Length = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§é•· {0} より長ã„ã§ã™ -Type_Specific_Checks_DT_Primitive_NotEmpty = 値ã¯ç©ºã«ã§ãã¾ã›ã‚“ -Type_Specific_Checks_DT_Primitive_Regex = è¦ç´ å€¤ ''{0}'' ã¯æ­£è¦è¡¨ç¾ ''{1}'' を満ãŸã—ã¦ã„ã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = タイプ {1} ã«å¯¾ã™ã‚‹æ­£è¦è¡¨ç¾ ''{0}'' を評価中ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼š{2} -Type_Specific_Checks_DT_Primitive_Regex_Type = è¦ç´ å€¤ ''{0}'' 㯠{1} ã®æ­£è¦è¡¨ç¾ ''{2}'' を満ãŸã—ã¦ã„ã¾ã›ã‚“ -Type_Specific_Checks_DT_Primitive_ValueExt = プリミティブ型ã¯å€¤ã‚’æŒã¤ã‹ã€å­ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ -Type_Specific_Checks_DT_Primitive_WS = プリミティブ型ã¯ç©ºç™½ã ã‘ã§ã‚ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Type_Specific_Checks_DT_String_Length = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§é•· 1 MB (1048576 bytes) より長ã„ã§ã™ -Type_Specific_Checks_DT_String_WS = 値ã¯ç©ºç™½ã§å§‹ã¾ã£ãŸã‚Šçµ‚ã‚ã£ãŸã‚Šã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“  ''{0}'' -Type_Specific_Checks_DT_String_WS_ALL = 値ã¯ã™ã¹ã¦ç©ºç™½ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“ ''{0}'' -Type_Specific_Checks_DT_Time_Valid = 有効ãªæ™‚é–“ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -Type_Specific_Checks_DT_URI_OID = URIã®å€¤ã¯oid:ã§å§‹ã¾ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Type_Specific_Checks_DT_URI_UUID = URIã®å€¤ã¯uuid:ã§å§‹ã¾ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -Type_Specific_Checks_DT_URI_WS = URIã®å€¤ã«ã¯ç©ºç™½ãŒã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“(''{0}'') -Type_Specific_Checks_DT_URL_Resolve = URL値 ''{0}'' ã¯è§£æ±ºã§ãã¾ã›ã‚“ -Type_Specific_Checks_DT_UUID_Strat = UUIDã¯urn:uuid:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Type_Specific_Checks_DT_UUID_Valid = UUIDã¯æœ‰åŠ¹ã§å°æ–‡å­—ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ ({0}) -Validation_BUNDLE_Message = メッセージã®æœ€åˆã®ã‚¨ãƒ³ãƒˆãƒªã¯MessageHeaderã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Validation_VAL_Content_Unknown = èªè­˜ã§ããªã„内容 {0} -Validation_VAL_NoType = 未知ã®åž‹ {0} -Validation_VAL_Profile_MatchMultiple = プロファイル{0}ã€è¦ç´ ã¯è¤‡æ•°ã®ã‚¹ãƒ©ã‚¤ã‚¹ã«ä¸€è‡´ã—ã¾ã™ - {1}, {2} -Validation_VAL_Profile_Maximum_one = {3}: 最大許容値 = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) -Validation_VAL_Profile_Maximum_other = {3}: 最大許容値 = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) -Validation_VAL_Profile_Minimum_one = {3}: 最å°å¿…è¦å€¤ = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) -Validation_VAL_Profile_Minimum_other = {3}: 最å°å¿…è¦å€¤ = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) -Validation_VAL_Profile_NoCheckMax_one = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最大許容値({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) -Validation_VAL_Profile_NoCheckMax_other = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最大許容値({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) -Validation_VAL_Profile_NoCheckMin_one = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最å°å¿…è¦å€¤({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) -Validation_VAL_Profile_NoCheckMin_other = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最å°å¿…è¦å€¤({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) -Validation_VAL_Profile_MultipleMatches_one = {0}ã®é¸æŠžè‚¢ã®ä¸­ã§è¤‡æ•°ã®ä¸€è‡´ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: {1} -Validation_VAL_Profile_MultipleMatches_other = {0}ã®é¸æŠžè‚¢ã®ä¸­ã§è¤‡æ•°ã®ä¸€è‡´ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: {1} -Validation_VAL_Profile_NoDefinition = リソースタイプ''{0}''ã®å®šç¾©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Validation_VAL_Profile_NoMatch = 指定ã•ã‚ŒãŸãƒ—ロファイルã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ãŒé¸æŠžè‚¢{0}ã®ä¸­ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Validation_VAL_Profile_NoSnapshot = StructureDefinition {0}ã«ã¯snapshotãŒã‚ã‚Šã¾ã›ã‚“ - 検証ã¯snapshotã«å¯¾ã—ã¦è¡Œã‚れるãŸã‚ã€ã“れをæä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -Validation_VAL_Profile_NoType = è¦ç´ {0}ã®åž‹ãŒæœªçŸ¥ã§ã‚ã‚Šã€ç„¡åŠ¹ã§ã™ã€‚ã“ã®æ™‚点ã§æœ‰åŠ¹ãªåž‹ã¯{1}ã§ã™ -Validation_VAL_Profile_NotAllowed = ã“ã®è¦ç´ ã¯ãƒ—ロファイル {0}ã«ã‚ˆã£ã¦è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Validation_VAL_Profile_NotSlice = ã“ã®è¦ç´ ã¯æ—¢çŸ¥ã®ã‚¹ãƒ©ã‚¤ã‚¹{0}ã¨ä¸€è‡´ã›ãšã€ã‚¹ãƒ©ã‚¤ã‚¹ã¯é–‰ã˜ã¦ã„ã¾ã™: {1} -Validation_VAL_Profile_OutOfOrder = プロファイル {0}ã«ã‚ˆã‚‹ã¨ã€è¦ç´ ''{1}''ã®é †åºãŒèª¤ã£ã¦ã„ã¾ã™ï¼ˆ{2}ã®å¾Œã«è¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼‰ -Validation_VAL_Profile_SliceOrder = プロファイル {0}ã«ã‚ˆã‚‹ã¨ã€é †åºä»˜ã‘ã•ã‚ŒãŸã‚¹ãƒ©ã‚¤ã‚¹ã®ä¸­ã§è¦ç´ ''{1}''ã®é †åºãŒèª¤ã£ã¦ã„ã¾ã™ -Validation_VAL_Profile_Unknown = プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“ -VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ã¯æœªçŸ¥ã®ãƒ—ロファイルをå–å¾—ã—ãªã„設定ã«ãªã£ã¦ã„ã¾ã™ -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。å–å¾—ã¯ã‚¨ãƒ©ãƒ¼ {1}ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—㟠-VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。ホスト {1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Validation_VAL_Unknown_Profile = 未知ã®ãƒ—ロファイル {0} -VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = プロファイル {1} ãŒä¾å­˜é–¢ä¿‚ {2} を特定ã—ã¦ã„ã¾ã™ï¼ˆextension http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies を使用)ãŒã€ã“ã®ãƒ—ロファイルã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠-XHTML_XHTML_Attribute_Illegal = XHTMLã®å±žæ€§åãŒç„¡åŠ¹ã§ã™(''{0}'' on ''{1}'') -XHTML_XHTML_Element_Illegal = XHTMLã®è¦ç´ åãŒç„¡åŠ¹ã§ã™(''{0}'') -XHTML_XHTML_Entity_Illegal = XHTMLã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãŒç„¡åŠ¹ã§ã™(''{0}'') -XHTML_XHTML_Image_Reference_Illegal = XHTMLã®ç”»åƒå‚ç…§ãŒç„¡åŠ¹ã§ã™(''{0}'') -XHTML_XHTML_NS_InValid = XHTMLã®ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ãŒé–“é•ã£ã¦ã„ã¾ã™(''{0}'', ''{1}''ã§ã‚ã‚‹ã¹ãã§ã™) -XHTML_XHTML_Name_Invalid = XHTMLã®åå‰ãŒé–“é•ã£ã¦ã„ã¾ã™(''{0}'') - divã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -_DT_Fixed_Wrong = 値㯠''{0}'' ã§ã™ãŒã€ ''{1}'' ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = ã™ã¹ã¦ã®Observationã«ã¯effectiveDateTimeã¾ãŸã¯effectivePeriodãŒå¿…è¦ã§ã™ -All_observations_should_have_a_performer = ã™ã¹ã¦ã®Observationã«ã¯performerãŒå¿…è¦ã§ã™ -All_observations_should_have_a_subject = ã™ã¹ã¦ã®Observationã«ã¯subjectãŒå¿…è¦ã§ã™ -Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = スライスマッãƒãƒ³ã‚°ã‚’解決ã§ãã¾ã›ã‚“ - 固定値ã¾ãŸã¯å¿…è¦ãªValueSetãŒã‚ã‚Šã¾ã›ã‚“ -Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = スライスマッãƒãƒ³ã‚°ã‚’解決ã§ãã¾ã›ã‚“ - ValueSetã«ã‚ˆã‚‹ã‚¹ãƒ©ã‚¤ã‚¹ãƒžãƒƒãƒãƒ³ã‚°ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ -Problem_processing_expression__in_profile__path__ = プロファイル ''{1}'' ã®ãƒ‘ス ''{2}'' ã§ã®å¼ ''{0}'' ã®å‡¦ç†ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ: {3} -Unable_to_find_element_with_id_ = id ''{0}''ã‚’æŒã¤è¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Slice_encountered_midway_through_set_path___id___ = セットã®é€”中ã§ã‚¹ãƒ©ã‚¤ã‚¹ãŒå‡ºç¾ã—ã¾ã—㟠(path = {0}, id = {1})ï¼›{2} -Unable_to_resolve_actual_type_ = 実際ã®ã‚¿ã‚¤ãƒ— {0} を解決ã§ãã¾ã›ã‚“ -Unsupported_version_R1 = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R1 -Unsupported_version_R2 = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R2 -Unsupported_version_R2B = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R2B -Unsupported_fixed_value_type_for_discriminator_for_slice__ = スライス{1}ã®discriminator ({0})ã«å¯¾ã™ã‚‹å›ºå®šå€¤ã‚¿ã‚¤ãƒ—ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“:{2} -Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - extensionã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ - スライス{1}ã®discriminator({0})用 -Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - å°‘ãªãã¨ã‚‚一ã¤ã®codingãŒå¿…è¦ - スライス{1}ã®discriminator({0})用 -Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - textã®ä½¿ç”¨ - スライス{1}ã®discriminator({0})用 -Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„Identifierパターン - extensionã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ - スライス{1}ã®discriminator({0})用 -Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = スライス{1}ã®discriminator({0})ã«å¯¾ã™ã‚‹å›ºå®šãƒ‘ターンタイプã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“:{2} -Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = プロファイル {0} パス {1} ã®è¦ç´ ã«å¯¾ã™ã‚‹ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°è¡¨ç¾ã®è©•ä¾¡ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—㟠(fhirPath = {2}): {3} -Could_not_match_discriminator_for_slice_in_profile_one = スライス {1} ã®discriminator ({0}) をプロファイル {2} ã«ä¸€è‡´ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠- discriminator {3} ã¯å›ºå®šå€¤ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã€å­˜åœ¨ã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ -Could_not_match_discriminator_for_slice_in_profile_other = スライス {2} ã®ã„ãšã‚Œã®discriminator ({1}) もプロファイル {3} ã«ä¸€è‡´ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠- {0} discriminator {4} ã®ã„ãšã‚Œã‚‚固定値ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã€å­˜åœ¨ã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ -Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = discriminator ({0}) ã¯è¦ç´ ã®å­˜åœ¨ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€ã‚¹ãƒ©ã‚¤ã‚¹ {1} 㯠min>=1 ã‚‚ max=0 も設定ã—ã¦ã„ã¾ã›ã‚“ -Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ãƒ—ロファイルをæŒã¤ã‚¿ã‚¤ãƒ—ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ—ロファイル {1} ã® {0}) -Profile_based_discriminators_must_have_only_one_type__in_profile_one = -Profile_based_discriminators_must_have_only_one_type__in_profile_other = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ä¸€ã¤ã®ã‚¿ã‚¤ãƒ—ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“(プロファイル {2} ã® {1})ã§ã™ãŒã€{0} ã®ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Profile_based_discriminators_must_have_a_type__in_profile_ = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ã‚¿ã‚¤ãƒ—ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ—ロファイル {1} ã® {0}) -Discriminator__is_based_on_type_but_slice__in__has_no_types = discriminator ({0}) ã¯ã‚¿ã‚¤ãƒ—ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€{2} ã®ã‚¹ãƒ©ã‚¤ã‚¹ {1} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one = -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = discriminator ({1}) ã¯ã‚¿ã‚¤ãƒ—ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€{3} ã®ã‚¹ãƒ©ã‚¤ã‚¹ {2} ã«ã¯ {0} ã®ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã™: {4} -Found__items_for__resolving_discriminator__from_ = {3}ã‹ã‚‰discriminator{2}を解決ã—ã¦{1}ã®ãŸã‚ã«{0}ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’見ã¤ã‘ã¾ã—㟠-Unable_to_find__resolving_discriminator__from_ = {2}ã‹ã‚‰discriminator{1}を解決ã—ã¦{0}を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Unable_to_find_resource__at__resolving_discriminator__from_ = {3}ã‹ã‚‰discriminator{2}を解決ã—ã¦ãƒªã‚½ãƒ¼ã‚¹{0}ã‚’{1}ã§è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -No_reference_resolving_discriminator__from_ = {1}ã«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ {0}を解決ã™ã‚‹å‚ç…§ãŒã‚ã‚Šã¾ã›ã‚“ -Unable_to_resolve_element__in_profile_ = プロファイル{1}ã®ä¸­ã§è¦ç´ {0}を解決ã§ãã¾ã›ã‚“ -Unable_to_resolve_profile_ = プロファイル{0}を解決ã§ãã¾ã›ã‚“ -Resource_resolution_services_not_provided = リソース解決サービスãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Unrecognised_extension_context_ = èªè­˜ã§ããªã„extensionコンテキスト{0} -Unable_to_locate_the_profile__in_order_to_validate_against_it = 検証ã™ã‚‹ãŸã‚ã®ãƒ—ロファイル ''{0}'' を特定ã§ãã¾ã›ã‚“ -Reference__refers_to_a__not_a_ValueSet = å‚ç…§ {0} ã¯ValueSetã§ã¯ãªãã€{1} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ -Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = アイテムãŒè¦ç´ ã§ãªã„å ´åˆã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.conformsToProfile) -Not_supported_yet = ã¾ã ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ -Unable_to_resolve_ = å‚ç…§ {0} を解決ã§ãã¾ã›ã‚“ -Not_done_yet__resolve__locally_2 = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ - {0} をローカルã§è§£æ±ºã—ã¾ã™ (2) -Not_done_yet_ValidatorHostServicesexecuteFunction = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.executeFunction) -Not_done_yet_ValidatorHostServicescheckFunction = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.checkFunction) -Not_done_yet_ValidatorHostServicesresolveFunction_ = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.resolveFunction): {0} -Unable_to_find_base_definition_for_logical_model__from_ = è«–ç†ãƒ¢ãƒ‡ãƒ«ã®åŸºæœ¬å®šç¾©ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: {0}ã‹ã‚‰{1} -Same_id_on_multiple_elements__in_ = {3} ã®ä¸­ã§åŒã˜id ''{0}'' ã‚’æŒã¤è¤‡æ•°ã®è¦ç´  {1}/{2} ãŒã‚ã‚Šã¾ã™ -No_path_on_element_Definition__in_ = {1}ã®element Definition {0}ã«ãƒ‘スãŒã‚ã‚Šã¾ã›ã‚“ -needs_a_snapshot = snapshotãŒå¿…è¦ã§ã™ -not_the_right_kind_of_structure_to_generate_schematrons_for = schematronsを生æˆã™ã‚‹ãŸã‚ã®é©åˆ‡ãªç¨®é¡žã®æ§‹é€ ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Not_handled_yet_sortElements_ = ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ (sortElements: {0}:{1}) -Unable_to_resolve_profile__in_element_ = è¦ç´ {1}内ã®ãƒ—ロファイル{0}を解決ã§ãã¾ã›ã‚“ -Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = ãƒãƒªãƒ¢ãƒ¼ãƒ•ã‚£ãƒƒã‚¯ã‚¿ã‚¤ãƒ—ã‚’æŒã¤è¦ç´ ã«ã¯å­ä¾›ã‚’æŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“ - ã¾ãšã‚¿ã‚¤ãƒ—をスライスã—ã¦åˆ¶ç´„を付ã‘ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆsortElements: {0}:{1}) -Unable_to_find_profile__at_ = プロファイル ''{0}''ãŒ{1}ã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = 処ç†ã§ããªã„状æ³ï¼šãƒªã‚½ãƒ¼ã‚¹ãŒè¤‡æ•°ã®ã‚ªãƒ—ションã«ãƒ—ロファイル化ã•ã‚Œã¦ã„ã‚‹ - プロファイルを並ã¹æ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_ = 内部å†å¸°æ¤œå‡º: find() ループパスå†å¸° > {0} - パスãŒæœ‰åŠ¹ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„ (パス {1}/{2}ã«ã¤ã„ã¦) -Internal_error___type_not_known_ = 内部エラー - タイプãŒæœªçŸ¥ {0} -Unable_to_find_element_ = è¦ç´  {0} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Error_generating_table_for_profile__ = プロファイル {0} ã®ãƒ†ãƒ¼ãƒ–ル生æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {1} -StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} at {1}: タイプ {2} 㯠{4}ã®ã‚¿ã‚¤ãƒ— {3} ã¨ã—ã¦ä¸æ­£ã§ã™ -Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = {0}#{1} ã§ã®ã‚¨ãƒ©ãƒ¼: ターゲットプロファイル {2} ã¯åŸºæœ¬ ({3}) ã«å¯¾ã™ã‚‹æœ‰åŠ¹ãªåˆ¶ç´„ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Error_in_profile__at__Base_isSummary___derived_isSummary__ = プロファイル {0} ã® {1} ã§ã‚¨ãƒ©ãƒ¼: Base isSummary = {2}, derived isSummary = {3} -StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_ = StructureDefinition {0} at {1}: {2}ã‹ã‚‰{3}ã«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’変更ã—よã†ã¨ã™ã‚‹ä¸æ­£ãªè©¦ã¿ -Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = differentialã«ãŠã‘る予期ã—ãªã„状æ³ï¼š{0}/{1}ã§ä¸æ­£ãªåž‹ -Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = differentialã«ãŠã‘る予期ã—ãªã„状æ³ï¼šæš—黙的ãªã‚¹ãƒ©ã‚¤ã‚¹åãŒæœ‰åŠ¹ãªåž‹ã‚’å«ã¾ãªã„(''{0}''?) {1}/{2}㧠-Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = プロファイル ''{0}'' ã®snapshotを生æˆã™ã‚‹å‰ã« {1} ã¨ã—ã¦ä½¿ç”¨ã—よã†ã¨ã—ã¾ã—㟠-null_min = minãŒnullã§ã™ -_has_children__for_type__in_profile__but_cant_find_type = プロファイル{3}ã§ã¯{0}ã¯children({1})ã‚’æŒã¡ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -_has_children__and_multiple_types__in_profile_ = プロファイル {3}ã§{0}ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—({2})ã®children({1})ã‚’æŒã¡ã¾ã™ -Adding_wrong_path = 誤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™ -Named_items_are_out_of_order_in_the_slice = スライス内ã®åå‰ä»˜ãé …ç›®ãŒé †åºã‚’æŒã£ã¦ã„ã¾ã›ã‚“ -The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = ベースsnapshotã¯ã‚¹ãƒ©ã‚¤ã‚¹ã‚’closedã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¦ã„ã¾ã™ãŒã€differentialã¯{0}ã®{1}ã§ãれを拡張ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼ˆ{2}) -Not_done_yet = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ -Unknown_type__at_ = {1}ã§æœªçŸ¥ã®åž‹{0} -Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = differential㯠''{0} (@ {1})'' を定義ã—ã¦ã„ã¾ã™ãŒã€baseã¯ãã†ã§ã¯ãªãã€å˜ä¸€ã®å›ºå®šã‚¿ã‚¤ãƒ—ã‚‚ã‚ã‚Šã¾ã›ã‚“。タイプ㯠{2} ã§ã™ã€‚ã“ã‚Œã¯ã¾ã å–り扱ã‚ã‚Œã¦ã„ã¾ã›ã‚“ -Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - rule @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - discriminator @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___order___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - order @ {2} ({3}) -not_done_yet__slicing__types__ = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ - @ {0} ã§ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚° / åž‹ -Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist = 無効ãªã‚¹ãƒ©ã‚¤ã‚¹: {0}ã§ä¸€ã¤ä»¥ä¸Šã®ã‚¿ã‚¤ãƒ—スライスãŒå­˜åœ¨ã—ã¾ã™ãŒã€ãã®ã†ã¡ã®ä¸€ã¤({1})ã¯min = 1ãªã®ã§ã€ä»–ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¯å­˜åœ¨ã§ãã¾ã›ã‚“ -Did_not_find_type_root_ = タイプã®ãƒ«ãƒ¼ãƒˆã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ: {0} -Error_at_path__Slice_for_type__has_wrong_type_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: タイプ ''{1}'' ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— ''{2}'' ã‚’æŒã£ã¦ã„ã¾ã™ -Error_at_path__Slice_for_type__has_more_than_one_type_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: タイプ ''{1}'' ã®ã‚¹ãƒ©ã‚¤ã‚¹ã«ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ— ''{2}'' ãŒã‚ã‚Šã¾ã™ -Error_at_path__Slice_name_must_be__but_is_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: スライスå㯠''{1}'' ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ ''{2}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.path != ''$this'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.type != ''type'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.count() > 1 -Error_at_path__in__Type_slicing_with_slicingordered__true = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.ordered = true -Adding_wrong_path_in_profile___vs_ = プロファイル {0} ã§èª¤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™: {1} vs {2} -_has_no_children__and_no_types_in_profile_ = {0} ã«ã¯childrenãŒãªã({1})ã€ãƒ—ロファイル {2} ã«ã‚‚タイプãŒã‚ã‚Šã¾ã›ã‚“ -Did_not_find_single_slice_ = å˜ä¸€ã®ã‚¹ãƒ©ã‚¤ã‚¹ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ: {0} -Differential_does_not_have_a_slice__b_of_____in_profile_ = プロファイル {5} ã®differantialã«ã¯ {6} ã®ã‚¹ãƒ©ã‚¤ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ ( {0} 上ã€ä½ç½® {1} ã® {2} / {3} / {4}) -Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = ç¹°ã‚Šè¿”ã—ã®ãªã„è¦ç´ ã‚’スライスã—よã†ã¨ã—ã¾ã—ãŸ: {0}/{1} ã‹ã‚‰ {2} ã‚’ {3} ã§ã€è¦ç´  {4} 㧠(スライス = {5}) -Unable_to_resolve_reference_to_ = å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ -Unable_to_find_element__in_ = {1}内ã«è¦ç´ {0}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Unable_to_find_base__for_ = {1}ã®åŸºåº•{0}を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Adding_wrong_path__outcomegetPath___resultPathBase__ = 誤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™ - outcome.getPath() = {0}ã€resultPathBase = {1} -Illegal_path__in_differential_in__illegal_characters_ = {1}内ã®differentialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': 無効ãªæ–‡å­—列 [] -Illegal_path__in_differential_in__illegal_character_ = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': 無効ãªæ–‡å­— ''{2}'' -Illegal_path__in_differential_in__no_unicode_whitespace = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': unicodeã®ç©ºç™½ãŒã‚ã‚Šã¾ã›ã‚“ -Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': åå‰éƒ¨åˆ†ãŒ64文字を超ãˆã¦ã„ã¾ã™ -Illegal_path__in_differential_in__name_portion_mising_ = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': åå‰éƒ¨åˆ†ãŒã‚ã‚Šã¾ã›ã‚“ (''..'') -Illegal_path__in_differential_in__must_start_with_ = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': {2}.{3}ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -No_path_value_on_element_in_differential_in_ = {0}ã§ã®differentialã®è¦ç´ ã«ãƒ‘スã®å€¤ãŒã‚ã‚Šã¾ã›ã‚“ -No_path_on_element_in_differential_in_ = {0}ã§ã®differentialã®è¦ç´ ã«ãƒ‘スãŒã‚ã‚Šã¾ã›ã‚“ -Unxpected_internal_condition__no_source_on_diff_element = 予期ã—ãªã„内部状態 - differantialè¦ç´ ã«ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ -type_on_first_snapshot_element_for__in__from_ = {1}ã‹ã‚‰{0}ã®æœ€åˆã®snapshotè¦ç´ ã®ã‚¿ã‚¤ãƒ— -type_on_first_differential_element = 最åˆã®differantialè¦ç´ ã®ã‚¿ã‚¤ãƒ—ï¼ -Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = 循環ã™ã‚‹snapshotå‚ç…§ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚snapshotを生æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“(スタック = {0}) -Base__Derived_profiles_have_different_types____vs___ = ベースã¨æ´¾ç”Ÿã®ãƒ—ロファイルãŒç•°ãªã‚‹ã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({0} = {1} vs {2} = {3}) -Derived_profile__has_no_derivation_value_and_so_cant_be_processed = 派生プロファイル {0} ã¯å°Žå‡ºå€¤ã‚’æŒãŸãšã€ã—ãŸãŒã£ã¦å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Derived_profile__has_no_type = 派生プロファイル {0} ã¯ã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ -Base_profile__has_no_type = ベースã®ãƒ—ロファイル {0} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ -no_derived_structure_provided = 派生ã—ãŸæ§‹é€ ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -no_base_profile_provided = ベースプロファイルãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -element_id__null__on_ = è¦ç´ id = null: {0} on {1} -element__null_ = è¦ç´  = null: {0} -getSliceList_should_only_be_called_when_the_element_has_slicing = è¦ç´ ãŒã‚¹ãƒ©ã‚¤ã‚¹ã‚’æŒã¤ã¨ãã ã‘ã€getSliceListを呼ã³å‡ºã™ã¹ãã§ã™ -Unable_to_resolve_name_reference__at_path_ = パス{1}ã§åå‰å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ -Details_for__matching_against_Profile_ = {0} ã®è©³ç´°ã¯ãƒ—ロファイル {1} ã«ä¸€è‡´ã—ã¾ã™ -Does_not_match_slice_ = スライス ''{0}''ã¨ä¸€è‡´ã—ã¾ã›ã‚“ (discriminator: {1}) -Profile__does_not_match_for__because_of_the_following_profile_issues__ = プロファイル {0} ã¯ä»¥ä¸‹ã®å•é¡Œã®ãŸã‚ {1} ã¨ä¸€è‡´ã—ã¾ã›ã‚“: {2} -This_element_does_not_match_any_known_slice_ = ã“ã®è¦ç´ ã¯ã©ã®æ—¢çŸ¥ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¨ã‚‚一致ã—ã¾ã›ã‚“ {0} -defined_in_the_profile = プロファイルã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ -This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = ã“ã‚Œã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰''{0}'') -This_cannot_be_parsed_as_a_FHIR_object_no_name = ã“ã‚Œã¯FHIRオブジェクトã¨ã—ã¦è§£æžã§ãã¾ã›ã‚“(åå‰ãŒã‚ã‚Šã¾ã›ã‚“) -This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = ã“ã‚Œã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰ç©ºé–“/åå‰''{0}::{1}'') -This__cannot_be_parsed_as_a_FHIR_object_no_namespace = ã“ã‚Œã¯FHIRオブジェクトã¨ã—ã¦è§£æžã§ãã¾ã›ã‚“(åå‰ç©ºé–“ãŒã‚ã‚Šã¾ã›ã‚“) -Unable_to_find_resourceType_property = resourceTypeプロパティãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Error_parsing_JSON_the_primitive_value_must_be_a_string = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯æ–‡å­—列ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Error_parsing_JSON_the_primitive_value_must_be_a_number = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯æ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Error_parsing_JSON_the_primitive_value_must_be_a_boolean = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯çœŸå½å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -Error_parsing_XHTML_ = XHTMLã®è§£æžã‚¨ãƒ©ãƒ¼: {0} -This_property_must_be_an_object_not_ = ã“ã®ãƒ—ロパティã¯ã‚ªãƒ–ジェクトã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({1}ã¯{2}ã§ï¼‰ -This_property_must_be_an_simple_value_not_ = ã“ã®ãƒ—ロパティã¯å˜ç´”ãªå€¤ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({1}ã¯{2}ã§ï¼‰ -This_property_must_be__not_ = プロパティ{2}ã¯{0}ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{1}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({3}ã§ï¼‰ -This_property_must_be_an_Array_not_ = プロパティ{1}ã¯JSONé…列ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({2}ã§ï¼‰ -OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = ã“ã®ã‚ªãƒ–ジェクトã¯ã€å®šç¾©å†…ã®å­ä¾›ãŒ2ã¤ã§ãªã„ãŸã‚ã€Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(å­ä¾› = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©ã¯æœ€åˆã®å­è¦ç´ ã‚’キーã¨ã—ã¦åå‰ä»˜ã‘ã—ã¦ã„ã¾ã›ã‚“(å­ä¾› = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸã‚­ãƒ¼ãƒ—ロパティã¯ãƒ—リミティブ型ã§ã¯ã‚ã‚Šã¾ã›ã‚“(å­ä¾› = {0}ã€ã‚¿ã‚¤ãƒ— = {1}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸå€¤ãƒ—ロパティã¯é¸æŠžè‚¢ã§ã€ã“ã‚Œã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“(値プロパティ = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸå€¤ãƒ—ロパティã¯ãƒªã‚¹ãƒˆã§ã€ã“ã‚Œã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“(値プロパティ = {0}) -Unrecognised_property_ = èªè­˜ã§ããªã„プロパティ''{0}'' -Object_must_have_some_content = オブジェクトã«ã¯ä½•ã‚‰ã‹ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå¿…è¦ã§ã™ -Error_parsing_JSON_ = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: {0} -Node_type__is_not_allowed = ノードタイプ {0} ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -CDATA_is_not_allowed = CDATAã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Undefined_element_ = {1}ã§æœªå®šç¾©ã®è¦ç´ ''{0}'' -Undefined_attribute__on__for_type__properties__ = åž‹{2}ã®{1}ã«æœªå®šç¾©ã®å±žæ€§''@{0}''ãŒã‚ã‚Šã¾ã™ -Text_should_not_be_present = テキストã¯å­˜åœ¨ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“(''{0}'') -Wrong_namespace__expected_ = é–“é•ã£ãŸãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ - ''{0}''ãŒå¿…è¦ã§ã™ -Element_must_have_some_content = è¦ç´ ã«ã¯ä½•ã‚‰ã‹ã®å†…容ãŒå¿…è¦ã§ã™ -No_processing_instructions_allowed_in_resources = リソースã«ã¯å‡¦ç†æŒ‡ç¤ºã‚’許å¯ã—ã¦ã„ã¾ã›ã‚“ -Unknown_resource_type_missing_rdfstype = 未知ã®ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—(rdfs:typeãŒæ¬ è½ã—ã¦ã„る) -reference_to__cannot_be_resolved = {0} ã¸ã®å‚ç…§ã¯è§£æ±ºã§ãã¾ã›ã‚“ -This_property_must_be_a_URI_or_bnode_not_ = ã“ã®ãƒ—ロパティã¯URIã¾ãŸã¯bnodeã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -This_property_must_be_a_Literal_not_ = ã“ã®ãƒ—ロパティã¯Literalã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -Unrecognised_predicate_ = èªè­˜ã§ããªã„述語''{0}'' -Error_parsing_Turtle_ = Turtleã®è§£æžã‚¨ãƒ©ãƒ¼: {0} -Unexpected_datatype_for_rdfstype = rdfs:typeã®äºˆæœŸã—ãªã„データ型 +# InstanceValidator = one,other +ALL_OK = ã™ã¹ã¦OK +ARRAY_CANNOT_BE_EMPTY = é…列ã¯ç©ºã«ã§ãã¾ã›ã‚“ - 値ãŒãªã„å ´åˆã€ãƒ—ロパティã¯å­˜åœ¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ +ATTEMPT_TO_CHANGE_SLICING = è¦ç´  {0} ã§ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚° {1} を定義ã—ã¦ã„ã¾ã™ãŒã€ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚° {2} ã®è¦ç´ ã§ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ã‚’ {3} ã«å†å®šç¾©ã—よã†ã¨ã—ã¦ã„ã¾ã™ +Adding_wrong_path = 誤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™ +Adding_wrong_path__outcomegetPath___resultPathBase__ = 誤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™ - outcome.getPath() = {0}ã€resultPathBase = {1} +Adding_wrong_path_in_profile___vs_ = プロファイル {0} ã§èª¤ã£ãŸãƒ‘スを追加ã—ã¦ã„ã¾ã™: {1} vs {2} +All_observations_should_have_a_performer = !!ã™ã¹ã¦ã®Observationã«ã¯performerãŒå¿…è¦ã§ã™ +All_observations_should_have_a_subject = !!ã™ã¹ã¦ã®Observationã«ã¯subjectãŒå¿…è¦ã§ã™ +All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = !!ã™ã¹ã¦ã®Observationã«ã¯effectiveDateTimeã¾ãŸã¯effectivePeriodãŒå¿…è¦ã§ã™ +Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = ç¹°ã‚Šè¿”ã—ã®ãªã„è¦ç´ ã‚’スライスã—よã†ã¨ã—ã¾ã—ãŸ: {0}/{1} ã‹ã‚‰ {2} ã‚’ {3} ã§ã€è¦ç´  {4} 㧠(スライス = {5}) Attempt_to_replace_element_name_for_a_nonchoice_type = é¸æŠžå¯èƒ½ãªåž‹ã§ã¯ãªã„è¦ç´ åã‚’ç½®ãæ›ãˆã‚ˆã†ã¨ã—ã¾ã—㟠-Wrong_type_for_resource = リソースã®åž‹ãŒé–“é•ã£ã¦ã„ã¾ã™ -Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = å«ã¾ã‚Œã¦ã„るリソースã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰ ''{0}'') -Unknown_Date_format_ = 未知ã®æ—¥ä»˜å½¢å¼''{0}'' -Unknown_Data_format_ = 未知ã®ãƒ‡ãƒ¼ã‚¿å½¢å¼''{0}'' -No_type_found_on_ = ''{0}''ã«åž‹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -error_writing_number__to_JSON = 数値 ''{0}'' ã‚’JSONã«æ›¸ã込むエラー -Unable_to_process_request_for_resource_for___ = リソースã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“ {0} / {1} -Resource_type_mismatch_for___ = リソースタイプã®ä¸ä¸€è‡´ {0} / {1} -not_done_yet_cant_fetch_ = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“: {0} ã‚’å–å¾—ã§ãã¾ã›ã‚“ -Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = 利用å¯èƒ½ãªTerminologyサーãƒãŒãªã„ã¨ãã«Terminologyサーãƒã‚’使用ã—よã†ã¨ã—ã¾ã—㟠-No_ExpansionProfile_provided = ExpansionProfileãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Can_only_specify_profile_in_the_context = コンテキスト内ã§ã®ã¿ãƒ—ロファイルを指定ã§ãã¾ã™ -no_url_in_expand_value_set_2 = expand value set 2ã«urlãŒã‚ã‚Šã¾ã›ã‚“ -no_url_in_expand_value_set = expand value setã«urlãŒã‚ã‚Šã¾ã›ã‚“ -no_value_set = ValueSetã«ã¯urlプロパティãŒã‚ã‚Šã¾ã›ã‚“ -No_Parameters_provided_to_expandVS = expandVSã«ParametersãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -No_Expansion_Parameters_provided = Expansion ParametersãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Unable_to_resolve_value_Set_ = ValueSet{0}を解決ã§ãã¾ã›ã‚“ -Delimited_versions_have_exact_match_for_delimiter____vs_ = デリミタ ''{0}'' ã®å®Œå…¨ä¸€è‡´ç‰ˆã¯å­˜åœ¨ã—ã¾ã™ : {1} 対 {2} -Duplicate_Resource_ = é‡è¤‡ã—ãŸãƒªã‚½ãƒ¼ã‚¹ {0} ã®ã‚¿ã‚¤ãƒ— {3} (既存ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {2}, æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {1}) -DUPLICATE_RESOURCE_VERSION = é‡è¤‡ã—ãŸãƒªã‚½ãƒ¼ã‚¹ {0} ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {1} ã®ã‚¿ã‚¤ãƒ— {2} -Error_expanding_ValueSet_running_without_terminology_services = ValueSetã®æ‹¡å¼µæ™‚ã«ã‚¨ãƒ©ãƒ¼: 用語サービス無ã—ã§å®Ÿè¡Œä¸­ -Error_validating_code_running_without_terminology_services = コードã®æ¤œè¨¼ã‚¨ãƒ©ãƒ¼: 用語サービス無ã—ã§å®Ÿè¡Œä¸­ -Unable_to_validate_code_without_using_server = サーãƒãƒ¼ã‚’使用ã›ãšã«ã‚³ãƒ¼ãƒ‰ã‚’検証ã§ãã¾ã›ã‚“。ç†ç”±: {0} -UNABLE_TO_VALIDATE_LOCALLY = ローカルã§ã‚³ãƒ¼ãƒ‰ã‚’検証ã§ãã¾ã›ã‚“: {0} -Profile___Error_generating_snapshot = プロファイル {0} ({1}). snapshot生æˆã‚¨ãƒ©ãƒ¼ -Profile___element__Error_generating_snapshot_ = プロファイル {0} ({1})ã€è¦ç´  {2}. snapshot生æˆã‚¨ãƒ©ãƒ¼: {3} -Profile___base__could_not_be_resolved = プロファイル {0} ({1}) ã®ãƒ™ãƒ¼ã‚¹ {2} を解決ã§ãã¾ã›ã‚“ã§ã—㟠-Profile___has_no_base_and_no_snapshot = プロファイル {0} ({1}) ã¯ãƒ™ãƒ¼ã‚¹ã‚‚snapshotã‚‚ã‚ã‚Šã¾ã›ã‚“ -No_validator_configured = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ -Parser_Type__not_supported = Parser Type {0} ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ã¾ã›ã‚“。コンテキストã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³{0}ãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ãŠã‚Šã€æ–°ã—ãロードã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³{1}ã§ã™ -Error_reading__from_package__ = パッケージ {1}#{2} ã‹ã‚‰ {0} ã®èª­ã¿å–りエラー: {3} -Error_parsing_ = {0} ã®è§£æžã‚¨ãƒ©ãƒ¼: {1} -Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = 用語サーãƒãƒ¼ ({1}) ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。LOINCã€SNOMEDã€ICD-Xãªã©ã‚’検証ã™ã‚‹ãŸã‚ã®ç”¨èªžã‚µãƒ¼ãƒ“スを使用ã›ãšã«å®Ÿè¡Œã™ã‚‹ã«ã¯ã€ãƒ‘ラメータ ''-tx n/a'' を使用ã—ã¦ãã ã•ã„。エラー = {0} -Display_Name_for__should_be_one_of__instead_of_one = {1}#{2} ã®èª¤ã£ãŸdisplay ''{4}'' - {3} ã§ã‚ã‚‹ã¹ãã§ã™ (言語 ''{5}'' ã®ãŸã‚) -Display_Name_for__should_be_one_of__instead_of_other = {1}#{2} ã®èª¤ã£ãŸdisplay ''{4}'' - {0} ã®é¸æŠžè‚¢ã®ã†ã¡ã®ä¸€ã¤ã§ã‚ã‚‹ã¹ãã§ã™: {3} (言語 ''{5}'' ã®ãŸã‚) -Unknown_Code_in = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' -Unknown_Code_in_Version = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' -UNKNOWN_CODE_IN_FRAGMENT = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' - CodeSystemã¯æ–­ç‰‡ã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãã®ã‚³ãƒ¼ãƒ‰ã¯ä»–ã®æ–­ç‰‡ã§ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -Code_found_in_expansion_however_ = 拡張中ã«ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã—ã‹ã—ãªãŒã‚‰: {0} -None_of_the_provided_codes_are_in_the_value_set_one = æä¾›ã•ã‚ŒãŸcode {2} ã¯ã€ValueSet ''{1}''ã«ã‚ã‚Šã¾ã›ã‚“ -None_of_the_provided_codes_are_in_the_value_set_other = æä¾›ã•ã‚ŒãŸcode [{2}] ã®ã†ã¡ã©ã‚Œã‚‚ã€ValueSet ''{1}''ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ -Coding_has_no_system__cannot_validate = Codingã«ã¯systemãŒãªã„ - 検証ã§ãã¾ã›ã‚“ -Unable_to_handle_system__concept_filter_with_op__ = system {0}ã®ã‚³ãƒ³ã‚»ãƒ—トフィルターをop = {1}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = system {0}ã®ãƒ—ロパティフィルターをop = {1}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Unable_to_handle_system__filter_with_property__ = system {0}ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’property = {1}ã€op = {2}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -Unable_to_resolve_system__value_set_has_include_with_no_system = systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«systemãŒã‚ã‚Šã¾ã›ã‚“ -UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = ValueSet{0}ã‹ã‚‰å‚ç…§ã•ã‚ŒãŸCodeSystem {1}ã«ã¯æ–‡æ³•ãŒã‚ã‚Šã€ãã®ã‚³ãƒ¼ãƒ‰ã¯ãã‚Œã§æœ‰åŠ¹ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -Unable_to_resolve_system__value_set_has_include_with_unknown_system = systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«ã¯æœªçŸ¥ã®system{2}ãŒã‚ã‚Šã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚¨ãƒ©ãƒ¼{3}ã‚’è¿”ã—ã¾ã—㟠-Unable_to_resolve_system__value_set_has_include_with_filter = systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«system {2}ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãŒã‚ã‚Šã¾ã™ -Unable_to_resolve_system__value_set_has_imports = systemを解決ã§ãã¾ã›ã‚“ - ValueSetã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆãŒã‚ã‚Šã¾ã™ -Unable_to_resolve_system__value_set_has_multiple_matches = systemを解決ã§ãã¾ã›ã‚“ - ValueSetã®expansionã«è¤‡æ•°ã®ä¸€è‡´ãŒã‚ã‚Šã¾ã™: {0} -Unable_to_resolve_system__value_set_expansion_has_multiple_systems = systemを解決ã§ãã¾ã›ã‚“ - ValueSetã®expansionã«è¤‡æ•°ã®systemãŒã‚ã‚Šã¾ã™ -Unable_to_resolve_system__value_set_has_no_includes_or_expansion = systemを解決ã§ãã¾ã›ã‚“ - ValueSet{0}ã«ã¯ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã¾ãŸã¯å±•é–‹ãŒã‚ã‚Šã¾ã›ã‚“ -Unable_to_resolve_system__no_value_set = systemを解決ã§ãã¾ã›ã‚“ - ValueSetãŒã‚ã‚Šã¾ã›ã‚“ -This_base_property_must_be_an_Array_not_ = ã“ã®ãƒ™ãƒ¼ã‚¹ãƒ—ロパティã¯é…列ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -documentmsg = (ドキュメント) -xml_attr_value_invalid = XML属性{0}ã«ç„¡åŠ¹ãªæ–‡å­—ãŒã‚ã‚Šã¾ã™ -xml_encoding_invalid = XMLエンコーディングãŒç„¡åŠ¹ã§ã™ï¼ˆUTF-8ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -xml_stated_encoding_invalid = ヘッダーã§æŒ‡å®šã•ã‚ŒãŸXMLエンコーディングãŒç„¡åŠ¹ã§ã™ï¼ˆæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯''UTF-8''ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -XHTML_URL_INVALID = URLã¯''({1})''ã®ãŸã‚有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“:{0} -EASURE_MR_GRP_NO_CODE = グループã¯ã€Measureã®ã‚°ãƒ«ãƒ¼ãƒ—定義ã¨ä¸€è‡´ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_MR_GRP_UNK_CODE = ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚³ãƒ¼ãƒ‰ã¯ã€measure定義ã¨ä¸€è‡´ã—ãªã„ã‚‚ã®ãŒã‚ã‚Šã¾ã™ -EASURE_MR_GRP_DUPL_CODE = ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚³ãƒ¼ãƒ‰ã¯ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨é‡è¤‡ã—ã¦ã„ã¾ã™ -EASURE_MR_GRP_MISSING_BY_CODE = MeasureReportã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ— ''{0}''ã®ãŸã‚ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ -EASURE_MR_GRP_NO_USABLE_CODE = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã®ä¸­ã«ã¯æ¯”較ã«ä½¿ç”¨å¯èƒ½ãªã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“ - å°‘ãªãã¨ã‚‚1ã¤ã®ã‚³ãƒ¼ãƒ‰ã§systemã¨codeã®ä¸¡æ–¹ãŒå¿…è¦ã§ã™ -EASURE_MR_GRP_NO_WRONG_CODE = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ ({0}) ã¯ã€Measureレãƒãƒ¼ãƒˆã§æŒ‡å®šã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ ({1}) ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -DUPLICATE_ID = é‡è¤‡ã—ãŸid値 ''{0}'' -TERMINOLOGY_TX_SYSTEM_NO_CODE = systemãŒæä¾›ã•ã‚Œã¦ã„ãªã„コードã¯å®šç¾©ã•ã‚ŒãŸæ„味ãŒã‚ã‚Šã¾ã›ã‚“。systemã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -EASURE_MR_GRP_POP_NO_CODE = グループã¯ã€Measureã®ã‚°ãƒ«ãƒ¼ãƒ—population定義ã¨ä¸€è‡´ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_MR_GRP_POP_UNK_CODE = ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—populationã®ã‚³ãƒ¼ãƒ‰ã¯ã€measure定義ã¨ä¸€è‡´ã—ãªã„ã‚‚ã®ãŒã‚ã‚Šã¾ã™ -EASURE_MR_GRPST_POP_UNK_CODE = ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—stratifierã®ã‚³ãƒ¼ãƒ‰ã¯ã€measure定義ã¨ä¸€è‡´ã—ãªã„ã‚‚ã®ãŒã‚ã‚Šã¾ã™ -EASURE_MR_GRP_POP_DUPL_CODE = ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—populationã®ã‚³ãƒ¼ãƒ‰ã¯ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨é‡è¤‡ã—ã¦ã„ã¾ã™ -EASURE_MR_GRP_POP_MISSING_BY_CODE = MeasureReportã«ã¯ã€populationグループ {0}ã®ãŸã‚ã®populationグループãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ -EASURE_MR_GRP_POP_COUNT_MISMATCH = count {0}ã¨subjectæ•° {1}ã¨ã®ä¸ä¸€è‡´ -EASURE_MR_GRP_POP_NO_SUBJECTS = タイプãŒ''subject-list''ã§ãªã„レãƒãƒ¼ãƒˆã«ã¯ã€subjectãŒãƒªã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -EASURE_MR_GRP_POP_NO_COUNT = タイプãŒ''subject-list''ã§ãªã„レãƒãƒ¼ãƒˆã§ã¯ã€countãŒå­˜åœ¨ã™ã‚‹ã¹ãã§ã™ -EASURE_M_NO_GROUPS = Measureã¯å°‘ãªãã¨ã‚‚一ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’å«ã‚€ã¹ãã§ã™ -EASURE_M_GROUP_CODE = グループã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãŒè¤‡æ•°å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_GROUP_POP = Measureグループã¯å°‘ãªãã¨ã‚‚一ã¤ã®populationã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_GROUP_STRATA = Measureグループã¯å°‘ãªãã¨ã‚‚一ã¤ã®stratifierã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_GROUP_POP_NO_CODE = measure groupã®populationã¯ã€populationãŒè¤‡æ•°å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_GROUP_STRATA_NO_CODE = measure groupã®stratifierã¯ã€populationãŒè¤‡æ•°å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_GROUP_STRATA_COMP_NO_CODE = measure groupã®stratifierコンãƒãƒ¼ãƒãƒ³ãƒˆã¯ã€populationãŒè¤‡æ•°å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã¹ãã§ã™ -EASURE_M_LIB_UNKNOWN = ライブラリ {0} を解決ã§ãã¾ã›ã‚“ã§ã—ãŸã®ã€‚å¼ã®æ¤œè¨¼ãŒæ­£ã—ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = フラグメントå‚ç…§ã§ãªã„å ´åˆã€Canonical URLã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“({0}) -TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = å«ã¾ã‚Œã‚‹ãƒªã‚½ãƒ¼ã‚¹ã®Canonical URLã¯ã€å­˜åœ¨ã™ã‚‹å ´åˆã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“({0}) -EASURE_MR_SCORE_PROHIBITED_RT = レãƒãƒ¼ãƒˆã®ã‚¿ã‚¤ãƒ—㌠''data-collection''ã®ã¨ãã«measureScoreãŒã‚ã‚Šã¾ã›ã‚“ -EASURE_MR_SCORE_PROHIBITED_MS = メッセージã®ã‚¹ã‚³ã‚¢ãƒªãƒ³ã‚°ãŒ ''cohort''ã®ã¨ãã«measureScoreãŒã‚ã‚Šã¾ã›ã‚“ -EASURE_MR_SCORE_REQUIRED = Measure.scoring={0}ã®ã¨ãã«ã¯measureScoreãŒå¿…è¦ã§ã™ -EASURE_MR_M_SCORING_UNK = ã“ã®Measureã®ã‚¹ã‚³ã‚¢ãƒªãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯æœªçŸ¥ã§ã‚ã‚‹ãŸã‚ã€measureScore値をãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -EASURE_MR_SCORE_UNIT_PROHIBITED = ã“ã®Measure Scoring ({0})ã®measureScoreã«ã¯å˜ä½ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -EASURE_MR_SCORE_VALUE_REQUIRED = Measure.scoring = {0} ã®ã¨ãã«ã¯å€¤ãŒå¿…è¦ã§ã™ -EASURE_MR_SCORE_VALUE_INVALID_01 = 値ãŒç„¡åŠ¹ã§ã™ã€‚0ã‹ã‚‰1ã®é–“ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -EASURE_MR_SCORE_FIXED = ã“ã®å€¤ã¯Measureã«ã‚ˆã£ã¦ ''{0}''ã«å›ºå®šã•ã‚Œã¦ã„ã¾ã™ -EASURE_MR_SCORE_UNIT_REQUIRED = スコアリングタイプ㌠{0} ã®ã¨ãã«ã¯å˜ä½ãŒå­˜åœ¨ã™ã‚‹ã¹ãã§ã™ -EASURE_M_CRITERIA_UNKNOWN = å¼è¨€èªž {0} ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ¤œè¨¼ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -EASURE_M_CQL_NOT_FOUND = インクルードã•ã‚Œã¦ã„ã‚‹CQLライブラリã®ä¸­ã«é–¢æ•° {0} を定義ã—ã¦ã„ã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_NO_LIB = ã“ã®Measureã«ã¯CQLライブラリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = CQLå¼ã«ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ãŒå«ã¾ã‚Œã¦ã„ãªã„å ´åˆã€Measureã®ãƒ©ã‚¤ãƒ–ラリã¯1ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ {0} ã«ä¸€è‡´ã™ã‚‹ãƒ©ã‚¤ãƒ–ラリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_LIB_DUPL = ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ {0} ã®è¤‡æ•°ã®ä¸€è‡´ã™ã‚‹ãƒ©ã‚¤ãƒ–ラリãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-EASURE_M_CRITERIA_CQL_ERROR = {0}ã®ã‚¨ãƒ©ãƒ¼: ''{1}'' -EASURE_M_CRITERIA_CQL_NO_ELM = {0}ã®ã‚¨ãƒ©ãƒ¼: コンパイルã•ã‚ŒãŸCQLãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = {0}ã®ã‚¨ãƒ©ãƒ¼: コンパイルã•ã‚ŒãŸCQLã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -EASURE_M_CRITERIA_CQL_NOT_FOUND = 関数 {1} ãŒãƒ©ã‚¤ãƒ–ラリ {0} ã«å­˜åœ¨ã—ã¾ã›ã‚“ -XHTML_URL_EMPTY = URLãŒç©ºã§ã™ -XHTML_URL_INVALID_CHARS_one = URLã«ç„¡åŠ¹ãªæ–‡å­—({1})ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ -XHTML_URL_INVALID_CHARS_other = URLã«{0}個ã®ç„¡åŠ¹ãªæ–‡å­—({1})ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ -TERMINOLOGY_TX_SYSTEM_HTTPS = システムURL ''{0}''ãŒèª¤ã£ã¦https:ã§å§‹ã¾ã£ã¦ã„ã¾ã™ã€‚http:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -CODESYSTEM_CS_NO_VS_NOTCOMPLETE = valueSetを確èªã—ã¦ãã ã•ã„ - 一般的ã«ã¯ã€ä¸å®Œå…¨ãªCodeSystemã¯valueSetを指定ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = identifier.system ㌠''urn:ietf:rfc:3986'' ã®å ´åˆã€identifier.value ã¯å®Œå…¨ãªURIã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(例ãˆã°ã‚¹ã‚­ãƒ¼ãƒ ã‹ã‚‰å§‹ã¾ã‚‹ï¼‰ã€''{0}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = 指定ã•ã‚ŒãŸæ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{0}ã¯ç„¡åŠ¹ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = 指定ã•ã‚ŒãŸæ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{0}ã¯ã€å®Ÿéš›ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{1}ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“(url = {0}) -TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ãŒ{0}ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ–¹æ³•ã‚’ç†è§£ã—ã¦ã„ãªã„ãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = {0}ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“: {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = 添付ファイルã®ã‚µã‚¤ã‚ºã¯{0}ãƒã‚¤ãƒˆã§ã€æŒ‡å®šã•ã‚ŒãŸåˆ¶é™ã®{1}ãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = 添付ファイルã«ã¯ãƒ‡ãƒ¼ã‚¿ãŠã‚ˆã³/ã¾ãŸã¯URLãŒã‚ã‚Šã€ã¾ãŸã¯contentTypeãŠã‚ˆã³/ã¾ãŸã¯languageã®ã„ãšã‚Œã‹ãŒã‚ã‚‹ã¹ãã§ã™ -TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64サイズã¯{0}ãƒã‚¤ãƒˆã§ã€æŒ‡å®šã•ã‚ŒãŸåˆ¶é™ã®{1}ãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ -TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = {0} ã®å°æ•°ç‚¹ä»¥ä¸‹ã®æ¡æ•°ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã“ã‚Œã¯ã€{1} æ¡ã®ä¸Šé™ã‚’超ãˆã¦ã„ã¾ã™ -Validation_VAL_Profile_WrongType = 指定ã•ã‚ŒãŸãƒ—ロファイルã®ã‚¿ã‚¤ãƒ—ã¯''{0}''ã§ã€ãƒ—ロファイル''{2}''ã®ä¸­ã«ã‚ã‚Šã¾ã—ãŸãŒã€''{1}''ã®ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-Validation_VAL_Profile_WrongType2 = プロファイル{0}ã®ãƒ‘ス{1}ã§ã®åž‹ã®ä¸ä¸€è‡´ï¼šè¦ç´ ã®åž‹ã¯{4}ã§ã™ãŒã€ãƒ—ロファイル{3}ã¯ç•°ãªã‚‹åž‹{2}ã®ãŸã‚ã§ã™ -VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = プロファイル{0}ã®ãƒ‘ス{1}ã§ã®ç„¡åŠ¹ãªåˆ¶ç´„ - ベースタイプ{3}ã‹ã‚‰åž‹{2}ã«åˆ¶ç´„ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -EXTENSION_EXTP_CONTEXT_WRONG_XVER = FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ {3} ã®æ‹¡å¼µ {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ [{2}; ã“ã‚Œã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒFHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å称変更ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã®è­¦å‘Šã§ã™) -EXTENSION_EXTM_CONTEXT_WRONG_XVER = FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ {3} ã®modifier extension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ [{2}; ã“ã‚Œã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒFHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å称変更ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã®è­¦å‘Šã§ã™) -SECURITY_STRING_CONTENT_ERROR = 文字列値ã«ã¯ã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šè¨±å¯ã•ã‚Œã¦ã„ãªã„HTMLã‚¿ã‚°ãŒå«ã¾ã‚Œã¦ã„るよã†ã«è¦‹ãˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒå«ã¾ã‚Œã¦ã„ã¾ã™ -SECURITY_STRING_CONTENT_WARNING = 文字列値ã«ã¯ã€HTMLã‚¿ã‚°ãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„るよã†ã«è¦‹ãˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®å†…容ãŒé©åˆ‡ãªãƒã‚¹ãƒˆãƒ—ロセッシングãªã—ã«HTMLã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹ã¨ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒªã‚¹ã‚¯ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -ALL_OK = ã™ã¹ã¦OK -SEARCHPARAMETER_NOTFOUND = ベースã®Search Parameter {0} を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ããªã„ãŸã‚ã€ã“ã®SearchParameterãŒãã‚Œã‹ã‚‰é©åˆ‡ã«æ´¾ç”Ÿã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -SEARCHPARAMETER_BASE_WRONG = リソースタイプ {1} ã¯ã€ã“ã‚ŒãŒæ´¾ç”Ÿã—ã¦ã„ã‚‹SearchParameter ({0}) ã®ãƒ™ãƒ¼ã‚¹ã¨ã—ã¦ãƒªã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -SEARCHPARAMETER_TYPE_WRONG = タイプ {1} ã¯ã€æ´¾ç”Ÿå…ƒã®SearchParameter内ã®ã‚¿ã‚¤ãƒ— {0} ã¨ç•°ãªã‚Šã¾ã™ -SEARCHPARAMETER_EXP_WRONG = å¼ ''{2}'' ã¯ã€æ´¾ç”Ÿå…ƒã®SearchParameter {0} ã®å¼ ''{1}'' ã¨äº’æ›æ€§ãŒãªãã€ã“ã‚Œã¯æ´¾ç”Ÿé–¢ä¿‚ãŒæœ‰åŠ¹ã§ãªã„ã“ã¨ã‚’示ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -VALUESET_NO_SYSTEM_WARNING = systemãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ -VALUESET_INCLUDE_INVALID_CONCEPT_CODE = code''{1}''ã¯system{0}ã§ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = code''{2}''ã¯system {0}ã®version {1}ã§ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -VALUESET_EXAMPLE_SYSTEM_HINT = 例システム''{0}''ãŒæŒ‡å®šã•ã‚ŒãŸã®ã§ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ -VALUESET_EXAMPLE_SYSTEM_ERROR = 例システム''{0}''ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€ã“ã‚Œã¯é•æ³•ã§ã™ã€‚conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ -VALUESET_UNC_SYSTEM_WARNING = 未知ã®system''{0}''ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“(詳細: {1}) -VALUESET_UNC_SYSTEM_WARNING_VER = 未知ã®system/version''{0}''ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€onceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“(詳細: {1}) -Extension_PROF_Type = プロファイル ''{0}'' ã®å®šç¾©ã§ã¯ã€ã‚¿ã‚¤ãƒ— {1} を許å¯ã—ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {2} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-TYPE_CHECKS_PATTERN_CC = プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€ãŠã‚ˆã³display ''{2}'']ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} -TYPE_CHECKS_PATTERN_CC_US = プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€display ''{2}''ãŠã‚ˆã³userSelected {5}]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} -TYPE_CHECKS_FIXED_CC = プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€ãŠã‚ˆã³display ''{2}'']ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} -TYPE_CHECKS_FIXED_CC_US = プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€display ''{2}''ãŠã‚ˆã³userSelected {5}]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} -VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = IG {1}ã‹ã‚‰ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ãƒ—ロファイルå‚ç…§''{0}''ã¯è§£æ±ºã§ããªã‹ã£ãŸãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“ -VALIDATION_VAL_PROFILE_SIGNPOST_BASE = リソースをプロファイルã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ -VALIDATION_VAL_PROFILE_SIGNPOST = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ -VALIDATION_VAL_PROFILE_SIGNPOST_META = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ï¼ˆãƒ¡ã‚¿ã«ã‚ˆã‚‹ï¼‰ -VALIDATION_VAL_PROFILE_SIGNPOST_DEP = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ï¼ˆ{1}ã®ä¸­ã®http://hl7.org/fhir/StructureDefinition/structuredefinition-dependenciesã«ã‚ˆã‚‹ï¼‰ -VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ - ãƒãƒ³ãƒ‰ãƒ«ãƒ‘ラメータã¨ã—ã¦æä¾›ã•ã‚Œã¾ã™ -VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = リソースを{1}ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ãƒ—ロファイルã§ã‚るプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ -ERROR_GENERATING_SNAPSHOT = snapshotã®ç”Ÿæˆã‚¨ãƒ©ãƒ¼: {0} (ã“ã‚Œã¯é€šå¸¸ã€differantialã«å•é¡ŒãŒã‚ã‚‹å ´åˆã«ç™ºç”Ÿã—ã¾ã™) -SNAPSHOT_EXISTING_PROBLEM = 生æˆã•ã‚ŒãŸsnapshotã«ã¯ã€å…ƒã®æä¾›ã•ã‚ŒãŸsnapshot{0}ã¨è¦ç´ æ•°ãŒç•°ãªã‚Šã¾ã™{1} -FHIRPATH_LOCATION = (at {0}) -FHIRPATH_UNKNOWN_CONTEXT = FHIRPathå¼ã‚’評価ã™ã‚‹ä¸Šã§æœªçŸ¥ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ: {0} -FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = FHIRPathå¼ã‚’評価ã™ã‚‹ä¸Šã§æœªçŸ¥ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆè¦ç´ : {0} -FHIRPATH_ALIAS_COLLECTION = FHIRPathå¼ã‚’評価ã™ã‚‹éš›ã«ã€ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ãªãシングルトンã«å¯¾ã™ã‚‹ã‚¨ã‚¤ãƒªã‚¢ã‚¹ã®è©¦ã¿ãŒã‚ã‚Šã¾ã—㟠-FHIRPATH_UNKNOWN_NAME = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: åå‰ ''{0}'' ã¯å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ã„ãšã‚Œã«ã‚‚有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“: {1} -FHIRPATH_UNKNOWN_CONSTANT = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 無効ãªFHIR定数 {0} -FHIRPATH_CANNOT_USE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ {0} を使用ã§ãã¾ã›ã‚“。ãªãœãªã‚‰ã€ {1} -FHIRPATH_CANT_COMPARE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: タイプ {0} 㨠{1} ã®å€¤ã‚’比較ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -FHIRPATH_LEFT_VALUE_one = -FHIRPATH_LEFT_VALUE_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã¸ã®å·¦ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯1ã¤ã®å€¤ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ -FHIRPATH_LEFT_VALUE_WRONG_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã¸ã®å·¦ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— {1} ã‚’æŒã£ã¦ã„ã¾ã™ -FHIRPATH_RIGHT_VALUE_one = -FHIRPATH_RIGHT_VALUE_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã¸ã®å³ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯1ã¤ã®å€¤ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ -FHIRPATH_RIGHT_VALUE_WRONG_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã¸ã®å³ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— {1} ã‚’æŒã£ã¦ã„ã¾ã™ -FHIRPATH_OP_INCOMPATIBLE = FHIRPathå¼ {0} ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: å·¦ã¨å³ã®ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯äº’æ›æ€§ã®ãªã„ã¾ãŸã¯ç„¡åŠ¹ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}, {2}) -FHIRPATH_HO_HOST_SERVICES = FHIRPathå¼ã‚’評価ã™ã‚‹éš›ã®å†…部エラー: ホストサービスãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ ({0}) -FHIRPATH_WRONG_PARAM_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: パラメータタイプ {2} 㯠{0} パラメータ {1} ã«å¯¾ã—ã¦åˆæ³•ã§ã¯ã‚ã‚Šã¾ã›ã‚“。{3}を期待ã—ã¾ã™ -FHIRPATH_ORDERED_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ -FHIRPATH_PRIMITIVE_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ãƒ—リミティブã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ -FHIRPATH_REFERENCE_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸæ–‡å­—列ã€URIã€canonicalã€Referenceã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠-FHIRPATH_CODED_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€é †åºä»˜ã文字列ã€ã‚³ãƒ¼ãƒ‰ã€URIã€Codingã€CodeableConceptã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-FHIRPATH_STRING_ORD_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸæ–‡å­—列ã€URIã€codeã€idã®ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠-FHIRPATH_STRING_SING_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯æ–‡å­—列ã€URIã€codeã€idã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠-FHIRPATH_NO_COLLECTION = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã‚·ãƒ³ã‚°ãƒ«ãƒˆãƒ³å€¤ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠-FHIRPATH_NOT_IMPLEMENTED = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“ -FHIRPATH_PARAM_WRONG = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: å¼ã‚¿ã‚¤ãƒ— {0} ã¯é–¢æ•° {2} ã®ãƒ‘ラメータ {1} ã«å¯¾ã—ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -FHIRPATH_CHECK_FAILED = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: ãƒã‚§ãƒƒã‚¯ {0} ãŒå¤±æ•—ã—ã¾ã—㟠-FHIRPATH_NO_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã§ã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ -FHIRPATH_UNKNOWN_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: タイプ ''{0}'' 㯠{1}ã§æœªçŸ¥ã¾ãŸã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = discriminatorã®ã‚¨ãƒ©ãƒ¼ {0}: 一ã¤ã®ã‚¹ãƒ©ã‚¤ã‚¹ã®å›ºå®šå€¤ã‚’解決ã™ã‚‹ä¸­ã§ã‚¹ãƒ©ã‚¤ã‚¹ã•ã‚ŒãŸè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = resolve()ã®ä½¿ç”¨ã«å•é¡Œ - {1}上ã®ãƒ—ロファイル{0}を解決ã§ãã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - è¦ç´  {0} ã«ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {0} å¯èƒ½ãªã‚¿ã‚¤ãƒ—㌠{1} ã«è¤‡æ•°å­˜åœ¨ã—ã¾ã™ (一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„) -FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {0}ã®ã‚¿ã‚¤ãƒ—ã¯Reference {1}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_one = -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {1}ã«{0}ã®å¯èƒ½ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¿ã‚¤ãƒ—プロファイルãŒè¤‡æ•°å­˜åœ¨ã—ã¾ã™ (一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„) -FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = resolve()ã®ä½¿ç”¨ã«å•é¡Œ - {1}上ã®ãƒ—ロファイル{0}を解決ã§ãã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_TYPE_NONE = discriminatorã§ã®ofType()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - è¦ç´  {0} ã«ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = discriminatorã§ã®ofType()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {0} ã«è¤‡æ•°ã®å¯èƒ½ãªã‚¿ã‚¤ãƒ—ãŒå­˜åœ¨ã—ã¾ã™ -FHIRPATH_DISCRIMINATOR_NO_CODE = discriminatorã§ã®ofType()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - タイプã«ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã¾ã›ã‚“ {0} -FHIRPATH_DISCRIMINATOR_BAD_NAME = discriminatorã§ç„¡åŠ¹ãªé–¢æ•°å {0}() -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = discriminatorã§ç„¡åŠ¹ãªå¼æ§‹æ–‡ (グループ ''{0}'') -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = discriminatorã§ç„¡åŠ¹ãªå¼æ§‹æ–‡ (const) -FHIRPATH_DISCRIMINATOR_CANT_FIND = 定義内ã§discriminatorを解決ã§ãã¾ã›ã‚“: プロファイル {1} ã®è¦ç´  {2} ã«å¯¾ã™ã‚‹{0}ã€ãƒ—ロファイル {3} を確èªä¸­ã« -FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = 定義内ã§discriminator {0} ã‚’ {2} 上ã§è¦‹ã¤ã‘ãŸãŒã€extension {1} ãŒãƒ—ロファイル {3} ã«è¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸãŸã‚解決ã§ãã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_NOTYPE = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {0}: å­ãŒãªãã€ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {1}: å­ãŒãªãã€{0} タイプ -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {1}: å­ãŒãªãã€{0} タイプã®ãƒ—ロファイル -FHIRPATH_UNABLE_BOOLEAN = booleanã¨ã—ã¦è©•ä¾¡ã§ãã¾ã›ã‚“: {0} -XHTML_XHTML_DOCTYPE_ILLEGAL = å½¢å¼ãŒæ­£ã—ããªã„XHTML: DocType宣言ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã“ã‚Œã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(XXEセキュリティ脆弱性ä¿è­·ï¼‰ -PACKAGE_VERSION_MISMATCH = パッケージ {0} ã§ã®FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´: ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ {2} ã§ã™ãŒ {1} ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ (パス: {3}) -VALUESET_REFERENCE_UNKNOWN = ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ{0}ãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ç¢ºèªã§ãã¾ã›ã‚“ -VALUESET_REFERENCE_INVALID_TYPE = ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ{0}ã¯ã€ç„¡åŠ¹ãªåž‹{1}ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’指ã—ã¦ã„ã¾ã™ -SD_MUST_HAVE_DERIVATION = StructureDefinition {0} ã¯ã€baseDefinitionã‚’æŒã£ã¦ã„ã‚‹ã®ã§ã€derivationã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ -VALIDATION_VAL_PROFILE_OTHER_VERSION = プロファイルã¯FHIRã®åˆ¥ãƒãƒ¼ã‚¸ãƒ§ãƒ³({0})ã®ãŸã‚ã€ç„¡è¦–ã•ã‚Œã¾ã—㟠-VALIDATION_VAL_PROFILE_THIS_VERSION_OK = ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®FHIRã®ãƒ—ロファイル - ã™ã¹ã¦OK -VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = プロファイルã¯ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®FHIRã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ç„¡åŠ¹ãªåž‹{0}ã§ã™ -BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_one = -BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_other = {0}個ã®ãƒ—ロファイルãŒ{1}リソースã«å¯¾ã—ã¦è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ç¾æ™‚点ã§ã¯ä¸€ã¤ä»¥ä¸Šã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。(タイプ{2}: {3}) -RENDER_BUNDLE_HEADER_ROOT = タイプ {1} ã®ãƒãƒ³ãƒ‰ãƒ« {0} -RENDER_BUNDLE_HEADER_ENTRY = エントリ {0} -RENDER_BUNDLE_HEADER_ENTRY_URL = エントリ {0} - fullUrl = {1} -RENDER_BUNDLE_RESOURCE = Resource {0}: -RENDER_BUNDLE_SEARCH = Search: -RENDER_BUNDLE_SEARCH_MODE = Mode = {0} -RENDER_BUNDLE_SEARCH_SCORE = Score = {0} -RENDER_BUNDLE_RESPONSE = Response: -RENDER_BUNDLE_LOCATION = Location = {0} -RENDER_BUNDLE_ETAG = ETag = {0} -RENDER_BUNDLE_LAST_MOD = LastModified = {0} -RENDER_BUNDLE_REQUEST = Request: -RENDER_BUNDLE_IF_NON_MATCH = If-None-Match = {0} -RENDER_BUNDLE_IF_MOD = If-Modified-Since = {0} -RENDER_BUNDLE_IF_MATCH = If-Match = {0} -RENDER_BUNDLE_IF_NONE = If-None-Exist = {0} -BUNDLE_RULE_NONE = No Rule -BUNDLE_RULE_UNKNOWN = Bundle Ruleã¯ç„¡åŠ¹ãªãƒªã‚½ãƒ¼ã‚¹ {0} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ -BUNDLE_RULE_INVALID_INDEX = Bundle Rulesã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã§ã™ ({0}) -BUNDLE_RULE_PROFILE_UNKNOWN = Bundle Rulesã®ãƒ—ロファイル {1} 㯠{0} ã«å¯¾ã—ã¦ä¸æ˜Žã§ã™ -RENDER_BUNDLE_DOCUMENT_CONTENT = 追加ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆå†…容 -RENDER_BUNDLE_HEADER_DOC_ENTRY_URD = {0}. {1} ({2}/{3}) -RENDER_BUNDLE_HEADER_DOC_ENTRY_U = {0}. {1} -RENDER_BUNDLE_HEADER_DOC_ENTRY_RD = {0}. {2}/{3} -UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = ValueSet {0} 内ã®ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TERMINOLOGY_TX_SYSTEM_WRONG_HTML = コードシステムå‚ç…§{0}ãŒé–“é•ã£ã¦ã„ã¾ã™ - コードシステムå‚ç…§ã¯HTMLページã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ­£ã—ã„å‚ç…§ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼š{1} -TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = コードシステムå‚ç…§{0}ãŒé–“é•ã£ã¦ã„ã¾ã™ - コードシステムå‚ç…§ã¯build.fhir.orgã¸ã®å‚ç…§ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ­£ã—ã„å‚ç…§ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼š{1} -FHIRPATH_BAD_DATE = 日付 {0} を解æžã§ãã¾ã›ã‚“ -FHIRPATH_NUMERICAL_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯integer, decimal, Quantityã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠-FHIRPATH_DECIMAL_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€decimalã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-FHIRPATH_CONTINUOUS_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€decimalã¾ãŸã¯dateåž‹ã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-FHIRPATH_FOCUS_one = -FHIRPATH_FOCUS_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã®ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã¯1ã¤ã®å€¤ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ -REFERENCE_REF_SUSPICIOUS = å‚ç…§ ''{0}'' ã®æ–‡æ³•ãŒä¸æ­£ç¢ºã«è¦‹ãˆã¾ã™ã€ç¢ºèªã—ã¦ãã ã•ã„ -TYPE_SPECIFIC_CHECKS_DT_QTY_NO_ANNOTATIONS = 人間ãŒèª­ã‚る注釈ãŒå«ã¾ã‚ŒãŸUCUMコード{0}ã¯èª¤è§£ã‚’æ‹›ãå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ベストプラクティスã¯UCUMコードã«æ³¨é‡ˆã‚’使用ã—ãªã„ã“ã¨ã€ãã—ã¦Quantity.unitãŒé©åˆ‡ã«äººé–“ãŒèª­ã‚ã‚‹å½¢ã§ã‚ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ã§ã™ -XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = 段è½å†…ã®XHTMLã®è¦ç´ åãŒç„¡åŠ¹ã§ã™(''{0}'') -UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = åž‹{2}ã§ãƒ‘ターンã®discriminator({0})ã®ã‚¹ãƒ©ã‚¤ã‚¹{1}ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„プロパティ{3}ãŒã‚ã‚Šã¾ã™ -UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„:型{2}ã§ãƒ‘ターンã®discriminator({0})ã®ã‚¹ãƒ©ã‚¤ã‚¹{1}ã«å€¤ãŒã‚るプロパティãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -SD_NESTED_MUST_SUPPORT_DIFF = è¦ç´  {0} ã¯ã€must supportã¨ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸtypes/profiles/targetsã‚’æŒã£ã¦ã„ã¾ã™ãŒã€è¦ç´ è‡ªä½“ã¯must-supportã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。内部ã®must-supportsã¯ã€è¦ç´ ãŒmust-support = trueを継承ã—ãªã„é™ã‚Šã€ç„¡è¦–ã•ã‚Œã¾ã™ -SD_NESTED_MUST_SUPPORT_SNAPSHOT = è¦ç´  {0} ã¯ã€must supportã¨ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸtypes/profiles/targetsã‚’æŒã£ã¦ã„ã¾ã™ãŒã€è¦ç´ è‡ªä½“ã¯must-supportã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -Unable_to_connect_to_terminology_server = 用語サーãƒãƒ¼ ({1}) ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。エラー = {0} -SD_ED_TYPE_PROFILE_UNKNOWN = プロファイル {0} を解決ã§ãã¾ã›ã‚“ -SD_ED_TYPE_PROFILE_NOTYPE = プロファイル {0} を見ã¤ã‘ã¾ã—ãŸãŒã€ãã‚ŒãŒé©ç”¨ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ—を特定ã§ãã¾ã›ã‚“ -SD_ED_TYPE_PROFILE_WRONG = プロファイル {0} ã¯ã‚¿ã‚¤ãƒ— {1} ã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ {3} è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {2} ã§ã™ -SD_ED_TYPE_PROFILE_IS_MODIFIER = プロファイル {0} ã¯modifier extensionã®ãŸã‚ã®ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ {3} è¦ç´ ã¯extensionã§ã™ -SD_ED_TYPE_PROFILE_NOT_MODIFIER = プロファイル {0} ã¯modifier extensionã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ {3} è¦ç´ ã¯modifierã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SD_ED_TYPE_PROFILE_WRONG_TARGET = プロファイル {0} ã¯ã‚¿ã‚¤ãƒ— {1} ã®ãŸã‚ã®ã‚‚ã®ã§ã€ã“れ㯠{4} ã§ã¯ã‚ã‚Šã¾ã›ã‚“(ã“ã‚Œã¯å¿…è¦ã§ã™ã€ãªãœãªã‚‰ {3} è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {2} ã ã‹ã‚‰ã§ã™ï¼‰ -SD_ED_TYPE_NO_TARGET_PROFILE = タイプ {0} ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ—ロファイルを許å¯ã—ã¦ã„ã¾ã›ã‚“ -TERMINOLOGY_TX_NOSVC_BOUND_REQ = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ãªValueSet {0}ã‹ã‚‰ã§ã‚ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚用語サービスãŒãªã„ãŸã‚ã§ã™ -TERMINOLOGY_TX_NOSVC_BOUND_EXT = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ãŒæ‹¡å¼µå¯èƒ½ãªValueSet {0}ã‹ã‚‰ã§ã‚ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚用語サービスãŒãªã„ãŸã‚ã§ã™ -ARRAY_CANNOT_BE_EMPTY = é…列ã¯ç©ºã«ã§ãã¾ã›ã‚“ - 値ãŒãªã„å ´åˆã€ãƒ—ロパティã¯å­˜åœ¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ -XHTML_URL_DATA_NO_DATA = dataã«dataãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: URL -XHTML_URL_DATA_DATA_INVALID_COMMA = data URLã®data部分ã«ã‚«ãƒ³ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼š{0} -XHTML_URL_DATA_DATA_INVALID = dataã®dataã¯æœ‰åŠ¹ãªbase64コンテンツã§ã‚ã‚‹ã¹ãã§ã™URL:{0} -XHTML_URL_DATA_MIMETYPE = data: URLã®mimetype部分ãŒç„¡åŠ¹ã§ã™ï¼ˆ{1})URL: {0} -SD_ED_SHOULD_BIND = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒå¿…è¦ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}) ãŒã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯å­˜åœ¨ã—ã¾ã›ã‚“ -SD_ED_SHOULD_BIND_WITH_VS = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒå¿…è¦ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}) ãŒã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã¯value setãŒã‚ã‚Šã¾ã›ã‚“ -SD_ED_BIND_UNKNOWN_VS = è¦ç´  {0} ã«ãŠã‘ã‚‹valueSetå‚ç…§ {1} ã¯è§£æ±ºã§ãã¾ã›ã‚“ã§ã—㟠-SD_ED_BIND_NOT_VS = è¦ç´  {0} ã«ãŠã‘ã‚‹valueSetå‚ç…§ {1} ã¯ã€value setã§ã¯ãªã„何ã‹ï¼ˆ{2})を指ã—ã¦ã„ã¾ã™ -SD_ED_BIND_NO_BINDABLE = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãƒã‚¤ãƒ³ãƒ‰å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã¯å­˜åœ¨ã—ã¾ã›ã‚“ {1} -SD_ED_BIND_MULTIPLE_TYPES = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã¡ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°å¯¾è±¡ã®è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—ãŒå­˜åœ¨ã—ã¾ã™ ({1})。ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ã™ã¹ã¦ã®ã‚¿ã‚¤ãƒ—ã«é©ç”¨ã•ã‚Œã¾ã™ -DISCRIMINATOR_BAD_PATH = discriminatorã®ãƒ‘ス表ç¾ã®å‡¦ç†ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {0} (src = ''{1}'') -SLICING_CANNOT_BE_EVALUATED = スライシングã¯è©•ä¾¡ã§ãã¾ã›ã‚“:{0} -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' ã¯è§£æ±ºã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ­ãƒ¼ãƒ‰ã§ããªã„ãŸã‚ã€ãã®å¦¥å½“性をãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' ã¯èª¤ã£ãŸã‚¿ã‚¤ãƒ—ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ã€‚見ã¤ã‹ã£ãŸã‚‚ã® {1} 予期ã—ã¦ã„ã‚‹ã‚‚ã® {2} -CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0}ã¯supplementã§ã‚ã‚‹ãŸã‚ã€Coding.systemã®å€¤ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“ -CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0}ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã®ã§ã€conceptãŒæœ‰åŠ¹ã‹ã©ã†ã‹ã‚’確èªã§ãã¾ã›ã‚“ -CODESYSTEM_CS_SUPP_INVALID_CODE = 基本ã®CodeSystem {0}ã«ã¯code ''{1}''ãŒå®£è¨€ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€supplementã®ä¸­ã§ã¯ç„¡åŠ¹ã§ã™ -SD_VALUE_TYPE_IILEGAL = è¦ç´  {0} ã¯ã€è¨±å¯ã•ã‚ŒãŸã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆ ({3}) ã«ãªã„タイプ {2} ã® {1} ã‚’æŒã£ã¦ã„ã¾ã™ -SD_VALUE_TYPE_REPEAT_HINT = ç¹°ã‚Šè¿”ã—è¦ç´ ã«ã¯ {1} ãŒã‚ã‚Šã¾ã™ã€‚ {1} ã¯ã™ã¹ã¦ã®ç¹°ã‚Šè¿”ã—ã«é©ç”¨ã•ã‚Œã¾ã™ï¼ˆã“ã‚Œã¯ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯æ˜Žç¢ºã§ãªã„) -SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = ç¹°ã‚Šè¿”ã—è¦ç´ ã«ã¯ãƒ—リミティブ型㮠{1} 値ãŒã‚ã‚Šã¾ã™ã€‚DotNetãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ã“れをã™ã¹ã¦ã®ç¹°ã‚Šè¿”ã—ã«é©ç”¨ã—ãªã„ - ã“ã‚Œã¯ã‚¨ãƒ©ãƒ¼ã§ã™ -SD_NO_TYPES_OR_CONTENTREF = è¦ç´  {0} ã¯å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚¿ã‚¤ãƒ—ãŒãªãã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„å‚照もã‚ã‚Šã¾ã›ã‚“ -CODESYSTEM_CS_UNK_EXPANSION = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ï¼ˆ{2})ã¯ã€ValueSet {0}ã®expansionã«ã¯å«ã¾ã‚Œã¦ãŠã‚‰ãšã€ã“ã®ValueSetã‹ã‚‰ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚system {1}ã¯æœªçŸ¥ã§ã™ã€‚ -BUNDLE_SEARCH_NOSELF = SearchSet Bundlesã¯æ¤œç´¢å†…容を指定ã™ã‚‹self linkã‚’æŒã£ã¦ã„ã‚‹ã¹ãã§ã™ -BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = 検索文字列ã‹ã‚‰ã‚¿ã‚¤ãƒ—を特定ã§ããªã„ãŸã‚ã€ã‚¿ã‚¤ãƒ—を確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entriesã¯ãƒªã‚½ãƒ¼ã‚¹ã‚’æŒã£ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = ã“ã®ãƒªã‚½ãƒ¼ã‚¹ãŒã“ã®æ¤œç´¢ã®ãŸã‚ã®æœ‰åŠ¹ãªãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’判断ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = 検索çµæžœã«ã¯idãŒå¿…è¦ã§ã™ -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = ã“ã‚Œã¯æŒ‡å®šã•ã‚ŒãŸæ¤œç´¢ã«å¯¾ã™ã‚‹ä¸€è‡´ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ( {1}を期待ã—ã¦ã„る㌠{0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = ã“ã‚Œã¯OperationOutcomeã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = ã“ã‚Œã¯æŒ‡å®šã•ã‚ŒãŸæ¤œç´¢ã«å¯¾ã™ã‚‹ä¸€è‡´ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã¯ã‚ã‚Šã¾ã›ã‚“(検索モードãŒå¿…è¦ï¼Ÿï¼‰ ({0} ㌠{1} を期待ã—ã¦ã„ã¾ã™) -BUNDLE_SEARCH_NO_MODE = SearchSet bundlesã¯ã‚¨ãƒ³ãƒˆãƒªã«æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã‚’æŒã£ã¦ã„ã‚‹ã¹ãã§ã™ -INV_FAILED = ルール {0} ãŒå¤±æ•—ã—ã¾ã—㟠-PATTERN_CHECK_STRING = プロファイル {1} ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン [{0}] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {2} -TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã®Example URLã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ ({0}) -UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„制御文字をå«ã‚€Unicodeシーケンス: {0} -UNICODE_BIDI_CONTROLS_CHARS_MATCH = 終端ã•ã‚Œã¦ã„ãªã„制御文字をå«ã‚€Unicodeシーケンス(CVE-2021-42574å‚照): {0} -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7 Defined CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7 Defined CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ -CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystemsãŒsupplementã§ã‚ã‚‹å ´åˆã¯{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = CodeSystem Supplementsã¯ã€contentè¦ç´ ã®å€¤ãŒ'supplement'ã§ã‚ã‚‹ã¹ãã§ã™ -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = CodeSystem Supplementsã¯ã€ontentè¦ç´ ã®å€¤ãŒ'supplement'ã§ã‚ã‚‹å ´åˆã€ã©ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ãŒè£œè¶³ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’指定ã™ã‚‹supplementsè¦ç´ ã‚’æŒã¤ã¹ãã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_QTY = プロファイルã§Quantityを検証ã™ã‚‹ä¸­ã§ã‚¿ã‚¤ãƒ—{2}ã®{0}を見ã¤ã‘ã¾ã—ãŸï¼ˆQuantityã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = プロファイルã®minValueã®systemãŒ{0}ã§ã€å€¤{1}ã®systemã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = プロファイルã®minValueã«ã¯code {0}ãŒã‚ã‚Šã€å€¤{1}ã®codeã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = プロファイルã®minValueã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = æ•°é‡ã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = プロファイルã®minValueã«systemãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = 値ã«systemãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = プロファイルã®minValueã«codeãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = 値ã«codeãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = UCUMサービスãŒãªãã€UCUMコードãŒåŒä¸€ã§ãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = UCUM定義ã«åŸºã¥ã„ã¦å€¤{0}ã‚’å˜ä½{1}ã‹ã‚‰minValueå˜ä½{2}ã«å¤‰æ›ã§ããªã„ãŸã‚ã€æœ€å°å€¤ã¯ç„¡åŠ¹ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = インスタンスã®å€¤({2})ã¯æŒ‡å®šã•ã‚ŒãŸæœ€å°å€¤({3})よりå°ã•ã„ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = UCUM変æ›å¾Œã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å€¤({0} {1})ã¯æŒ‡å®šã•ã‚ŒãŸminValue({2} {3})よりå°ã•ã„ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_QTY = プロファイルã§Quantityを検証ã™ã‚‹ä¸­ã§ã‚¿ã‚¤ãƒ—{2}ã®{0}を見ã¤ã‘ã¾ã—ãŸï¼ˆQuantityã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = プロファイルã®maxValueã®systemãŒ{0}ã§ã€å€¤{1}ã®systemã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = プロファイルã®maxValueã«ã¯code {0}ãŒã‚ã‚Šã€å€¤{1}ã®codeã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = プロファイルã®maxValueã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = æ•°é‡ã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = プロファイルã®maxValueã«systemãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = 値ã«systemãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = プロファイルã®maxValueã«codeãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = 値ã«codeãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = UCUMサービスãŒãªãã€UCUMコードãŒåŒä¸€ã§ãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = UCUM定義ã«åŸºã¥ã„ã¦å€¤{0}ã‚’å˜ä½{1}ã‹ã‚‰maxValueå˜ä½{2}ã«å¤‰æ›ã§ããªã„ãŸã‚ã€æœ€å¤§å€¤ã¯ç„¡åŠ¹ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = インスタンスã®å€¤({2})ã¯æŒ‡å®šã•ã‚ŒãŸæœ€å¤§å€¤({3})より大ãã„ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = UCUM変æ›å¾Œã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å€¤({0} {1})ã¯æŒ‡å®šã•ã‚ŒãŸmaxValue({2} {3})より大ãã„ã§ã™ -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64エンコードã•ã‚ŒãŸå€¤ã«ã¯ã€ç©ºç™½ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(RFC 4648ã«ã‚ˆã‚‹ï¼‰ã€‚ãŸã ã—ã€éžæ¤œè¨¼ãƒªãƒ¼ãƒ€ãƒ¼ã¯ã€ç©ºç™½ã‚’å—ã‘入れるã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64エンコードã•ã‚ŒãŸå€¤ã¯ã€ç©ºç™½ã‚’å«ã‚ãªã„よã†ã«ã™ã‚‹ã¹ãã§ã™ï¼ˆRFC 4648ã«ã‚ˆã‚‹ï¼‰ã€‚ãŸã ã—ã€éžæ¤œè¨¼ãƒªãƒ¼ãƒ€ãƒ¼ã¯ã€ç©ºç™½ã‚’å—ã‘入れるã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ -SD_DERIVATION_KIND_MISMATCH = 構造定義㯠{0} ã®ç¨®é¡žã‚’制約ã—ã¦ã„ã¾ã™ãŒã€ç•°ãªã‚‹ç¨®é¡ž ({1}) ã‚’æŒã£ã¦ã„ã¾ã™ -VALUESET_IMPORT_UNION_INTERSECTION = ã“ã®ValueSetã«ã¯ã€è¤‡æ•°ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸValueSetã‚’æŒã¤å˜ä¸€ã®å«æœ‰ç‰©ãŒã‚ã‚Šã¾ã™ã€‚å•é¡Œhttps://jira.hl7.org/browse/FHIR-25179ã«ã‚ˆã‚‹ã¨ã€ã“れらã®ValueSetãŒçµåˆã•ã‚Œã¦ã„ã‚‹ã®ã‹äº¤å·®ã—ã¦ã„ã‚‹ã®ã‹ã«ã¤ã„ã¦éŽåŽ»ã«æ··ä¹±ãŒã‚ã‚Šã¾ã—ãŸã€‚ã“ã®ValueSetãŒ2022å¹´3月31日以å‰ã«å…¬é–‹ã•ã‚ŒãŸãƒ‘ッケージã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€ãã‚Œã¯çµåˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ãれ以外ã®å ´åˆã¯äº¤å·®ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚çµåˆã‚’希望ã™ã‚‹å ´åˆã¯ã€ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’複数ã®å«æœ‰ç‰©ã«åˆ†ã‘ã¦ãã ã•ã„ -TX_SERVER_NO_BATCH_RESPONSE = サーãƒãƒ¼ã¯ãƒãƒƒãƒæ¤œè¨¼ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‹ã‚‰nullã‚’è¿”ã—ã¾ã—㟠-BUNDLE_POSSSIBLE_MATCHES = ãƒãƒ³ãƒ‰ãƒ«ã«ã¯ã€Bundleå‚照解決ã®ãƒ«ãƒ¼ãƒ«ã«ã‚ˆã‚Š {1} ã®ä¸€è‡´ãŒãªã„ãŒã€ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã¨IDã«ã‚ˆã‚Š {0} ã«ä¸€è‡´ã™ã‚‹è¤‡æ•°ã®ãƒªã‚½ãƒ¼ã‚¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ -BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = エントリ{0}ã¯ã‚¿ã‚¤ãƒ—ã¨IDã§reference {1}ã¨ä¸€è‡´ã—ã¾ã™ãŒã€Bundle解決ルールã«ã‚ˆã‚Šfull target URL {2}ã¨ã¯ä¸€è‡´ã—ã¾ã›ã‚“ -BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = エントリ{0}ã¯ã‚¿ã‚¤ãƒ—ã¨IDã§reference {1}ã¨ä¸€è‡´ã—ã¾ã™ãŒã€ãã®fullUrl {2}ã¯Bundle解決ルールã«ã‚ˆã‚Šfull target URL {3}ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -SD_ILLEGAL_CHARACTERISTICS = ã“ã®è¦ç´ ã¯ {0} ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {1} ã¯ã“ã®ç¨®é¡žã®åˆ¶ç´„を関連性ã‚ã‚‹ã‚‚ã®ã«ã—ã¾ã›ã‚“ -SD_VALUE_COMPLEX_FIXED = 複åˆã‚¿ã‚¤ãƒ— {0} ã®å ´åˆã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’éŽå‰°ã«åˆ¶ç´„ã™ã‚‹ã“ã¨ã‚’é¿ã‘ã‚‹ãŸã‚ã«ã€å›ºå®šå€¤ã§ã¯ãªãパターンを使用ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„ -VALUESET_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -VALUESET_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -VALUESET_SHAREABLE_MISSING_HL7 = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CODESYSTEM_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CODESYSTEM_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CODESYSTEM_SHAREABLE_MISSING_HL7 = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CONCEPTMAP_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CONCEPTMAP_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CONCEPTMAP_SHAREABLE_MISSING_HL7 = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -EASURE_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸmeasuresã¯Measure.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableMeasureプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -EASURE_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸmeasuresã¯Measure.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableMeasureプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -EASURE_SHAREABLE_MISSING_HL7 = 公開ã•ã‚ŒãŸmeasuresã¯Measure.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableMeasureプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -EASURE_SHAREABLE_EXTRA_MISSING_HL7 = 公開ã•ã‚ŒãŸmeasuresã¯Measure.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableMeasureプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 -TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = markdownã«ã¯ã€''{0}'' ã§å§‹ã¾ã‚‹çµ„ã¿è¾¼ã¿HTMLã‚¿ã‚°ã®ã‚ˆã†ãªå†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯è¡¨ç¤ºå±¤ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã•ã‚Œã‚‹ï¼ˆã¾ãŸã¯ã•ã‚Œã‚‹ã¹ã(SHOULD)ã§ã™ï¼‰ã€‚ã“ã®æŒ¯ã‚‹èˆžã„ãŒæœ›ã¾ã—ã„ã‚‚ã®ã‹ã©ã†ã‹ã‚’確èªã™ã‚‹ãŸã‚ã«ã€å†…容をãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -TYPE_SPECIFIER_ILLEGAL_TYPE = Type specifier {1} ã¯ç„¡åŠ¹ãªåž‹ {0} を指定ã—ã¾ã—㟠-TYPE_SPECIFIER_ABSTRACT_TYPE = Type specifier {1} ã¯æŠ½è±¡åž‹ {0} を指定ã—ã¾ã—㟠-TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Type specifierã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã¯ãªãã€åŸºåº•åž‹ {0} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Type specifierã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã¯ãªãã€åŸºåº•åž‹ {0} ã¯æŠ½è±¡çš„ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -ELEMENT_CANNOT_BE_NULL = è¦ç´ ãŒ ''null'' ã§ã‚ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -ULTIPLE_LOGICAL_MODELS_one = -ULTIPLE_LOGICAL_MODELS_other = æä¾›ã•ã‚ŒãŸãƒ—ロファイル㫠{0} 個ã®è«–ç†ãƒ¢ãƒ‡ãƒ«ãŒè¦‹ã¤ã‹ã£ãŸãŸã‚ã€è«–ç†ãƒ¢ãƒ‡ãƒ«ã‚’解æžã§ãã¾ã›ã‚“(一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{1}個見ã¤ã‹ã‚Šã¾ã—ãŸï¼‰ -UNRECOGNISED_PROPERTY_TYPE = è¦ç´ {1}ã®ç„¡åŠ¹ãªJSONåž‹{0};有効ãªåž‹ = {2} -UNRECOGNISED_PROPERTY_TYPE_WRONG = è¦ç´ {1}ã®ç„¡åŠ¹ãªåž‹{2};有効ãªåž‹ = {3}ã€JSONåž‹ = {0} -SD_TYPE_MISSING = タイプãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -SD_TYPE_NOT_MATCH_NS = タイプã®åå‰ç©ºé–“ {0} ã¯ã€ã‚¿ã‚¤ãƒ—ã®å®šç¾©ã®ãŸã‚ã®urlåå‰ç©ºé–“ {1} ã¨ä¸€è‡´ã™ã¹ãã§ã™ -SD_TYPE_NOT_DERIVED = タイプ {0} ã¯ã€ã‚¿ã‚¤ãƒ—ã®åŸºæœ¬å®šç¾©ã‚’制約ã™ã‚‹ã¨ãã«ã®ã¿ã‚¿ã‚¤ãƒ—ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ -SD_TYPE_NOT_LOCAL = タイプ {0} ã¯ã€FHIR仕様ã§å®šç¾©ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€åˆæ³•çš„ã§ã¯ã‚ã‚Šã¾ã›ã‚“。他ã®ã‚¿ã‚¤ãƒ—ã«ã¯åå‰ç©ºé–“ãŒå¿…è¦ã§ã™ -SD_TYPE_NOT_LOGICAL = タイプ {0} ã¯ã€ç¨®é¡žãŒ 'logical' ã§ãªã„ {1} ã®å ´åˆã«ã®ã¿å®šç¾©ã§ãã¾ã™ -SD_CONSTRAINED_TYPE_NO_MATCH = タイプ {0} ã¯ã€åˆ¶ç´„対象ã®åŸºæœ¬æ§‹é€  {1} ã®ã‚¿ã‚¤ãƒ—ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -SD_SPECIALIZED_TYPE_MATCHES = タイプ {0} ã¯ã€ç‰¹æ®ŠåŒ–ã•ã‚Œã¦ã„る基本構造 {1} ã®ã‚¿ã‚¤ãƒ—ã¨åŒã˜ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“ -SD_CONSTRAINED_KIND_NO_MATCH = 種類 {0} ã¯åŸºæœ¬æ§‹é€  {3} ã®ç¨®é¡ž {1} ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(基本タイプ = {2}) -SD_PATH_TYPE_MISMATCH = パス {1} ã¯ã€æ§‹é€  {0} ã®ã‚¿ã‚¤ãƒ—ã§å§‹ã¾ã‚‰ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -UNABLE_TO_RESOLVE_CONTENT_REFERENCE = è¦ç´ {1}(パス = {2})ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ -UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§è¦ç´ {1}(パス = {2})ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ -RESOURCETYPE_PROPERTY_WRONG_TYPE = JSONè¦ç´  ''resourceType'' ã¯é–“é•ã£ãŸJSONタイプをæŒã£ã¦ã„ã¾ã™: {0} -DUPLICATE_JSON_PROPERTY = JSONプロパティ ''{0}'' ã¯é‡è¤‡ã—ã¦ã„ã‚‹ãŸã‚無視ã•ã‚Œã¾ã™ -DUPLICATE_JSON_PROPERTY_KEY = JSONプロパティ ''{0}'' ã¯é‡è¤‡ã—ã¦ã„ã‚‹ãŸã‚無視ã•ã‚Œã¾ã™ -JSON_PROPERTY_NO_QUOTES = JSONプロパティ ''{0}'' ã®ãƒ—ロパティåã®å‘¨ã‚Šã«å¼•ç”¨ç¬¦ãŒã‚ã‚Šã¾ã›ã‚“ -JSON_PROPERTY_VALUE_NO_QUOTES = JSONプロパティ ''{0}'' ã®ãƒ—ロパティ値 ''{1}'' ã®å‘¨ã‚Šã«å¼•ç”¨ç¬¦ãŒã‚ã‚Šã¾ã›ã‚“ -JSON_COMMA_MISSING = JSONã«ã‚«ãƒ³ãƒžãŒè¶³ã‚Šã¾ã›ã‚“ -JSON_COMMA_EXTRA = JSON内㮠{0} ã®æœ«å°¾ã«ä½™åˆ†ãªã‚«ãƒ³ãƒžãŒã‚ã‚Šã¾ã™ -JSON_COMMENTS_NOT_ALLOWED = JSONã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -BUNDLE_LINK_UNKNOWN = リンク関係タイプ ''{0}'' ã¯æœªçŸ¥ã§ã‚ã‚Šã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -BUNDLE_LINK_SEARCH_PROHIBITED = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ã€æ¤œç´¢ã‚»ãƒƒãƒˆã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒªãƒ³ã‚¯é–¢ä¿‚タイプ ''{0}'' ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ -BUNDLE_LINK_SEARCH_NO_DUPLICATES = リンク関係タイプ ''{0}'' ã¯ä¸€åº¦ã ã‘発生ã§ãã¾ã™ -BUNDLE_LINK_STYELSHEET_EXTERNAL = https://hl7.org/fhir/fhir.css 以外ã®å¤–部スタイルシートã¯ä½¿ç”¨ã—ãªã„ã»ã†ãŒè‰¯ã„ã§ã™ -BUNDLE_LINK_STYELSHEET_INSECURE = スタイルシートã®å‚ç…§ã¯å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -BUNDLE_LINK_STYELSHEET_LINKABLE = スタイルシートã®å‚ç…§ã¯è§£æ±ºå¯èƒ½ãªãƒªãƒ³ã‚¯ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -BUNDLE_LINK_STYELSHEET_NOT_FOUND = ã“ã®ãƒãƒ³ãƒ‰ãƒ«ã§ã¯ã‚¹ã‚¿ã‚¤ãƒ«ã‚·ãƒ¼ãƒˆã®å‚照を解決ã§ãã¾ã›ã‚“ -EXT_VER_URL_NO_MATCH = æ‹¡å¼µURLã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«åŸºã¥ã解決を使用ã—ã¦ã‚‚ã“ã®URLを解決ã§ãã¾ã›ã‚“ã§ã—㟠-EXT_VER_URL_IGNORE = æ‹¡å¼µURLã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’無視ã—ã¦æ‹¡å¼µã‚’処ç†ã—ã¾ã—㟠-EXT_VER_URL_MISLEADING = æ‹¡å¼µURLã« ''|'' ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ãã®URLã®ã‚ˆã†ã«è¦‹ãˆã¾ã™ãŒã€ãã†ã§ã¯ãªãã€ã“ã‚Œã¯å®Ÿè£…者ã«ã¨ã£ã¦æ··ä¹±ã®å…ƒã§ã™ -EXT_VER_URL_NOT_ALLOWED = æ‹¡å¼µURLã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã¦ã¯ãªã‚Šã¾ã›ã‚“ -EXT_VER_URL_REVERSION = æ‹¡å¼µURLã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã¦ã¯ãªã‚Šã¾ã›ã‚“。拡張ã¯æ‹¡å¼µã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {0} ã«å¯¾ã—ã¦æ¤œè¨¼ã•ã‚Œã¾ã—㟠-ILLEGAL_COMMENT_TYPE = fhir_commentsプロパティã¯æ–‡å­—列ã®é…列ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„ -SD_NO_SLICING_ON_ROOT = プロファイルã®ãƒ«ãƒ¼ãƒˆã§ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -REFERENCE_REF_QUERY_INVALID = æ¡ä»¶ä»˜ãå‚ç…§ã®ã‚¯ã‚¨ãƒªéƒ¨åˆ†ã¯æœ‰åŠ¹ãªã‚¯ã‚¨ãƒªæ–‡å­—列ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) -SM_RULEGROUP_NOT_FOUND = グループ {0} を解決ã§ãã¾ã›ã‚“ã§ã—㟠-SM_RULEGROUP_PARAM_COUNT_MISMATCH = グループ {0} 㯠{1} 個ã®ãƒ‘ラメータを使ã£ã¦å‘¼ã³å‡ºã•ã‚Œã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã«ã¯ {2} 個をå–ã‚Šã¾ã™ -SM_NAME_INVALID = åå‰ {0} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SM_GROUP_NAME_DUPLICATE = グループå ''{0}'' ã¯ã™ã§ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ -SM_GROUP_INPUT_DUPLICATE = åå‰ {0} ã¯ã™ã§ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ -SM_GROUP_INPUT_MODE_INVALID = グループパラメータ {0} モード {1} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SM_GROUP_INPUT_NO_TYPE = グループ {1} パラメータ {0} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒãªã„ãŸã‚ã€ãƒ‘スを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SM_GROUP_INPUT_TYPE_NOT_DECLARED = タイプ {0} ã¯å®£è¨€ã•ã‚Œã¦ãŠã‚‰ãšã€æœªçŸ¥ã§ã™ -SM_GROUP_INPUT_MODE_MISMATCH = タイプ ''{0}'' ã¯mode ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯structure definitionã®mode ''{2}'' ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = canonical URL {1} ã«ãƒžãƒƒãƒ—ã™ã‚‹ã‚¿ã‚¤ãƒ— {0} ã¯æœªçŸ¥ã§ã™ã€‚パスを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = タイプ {0} ã¯æœªçŸ¥ãªã®ã§ã€ãƒ‘スを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SM_SOURCE_CONTEXT_UNKNOWN = ソースコンテキスト {0} ã¯ã“ã®æ™‚点ã§ã¯æœªçŸ¥ã§ã™ -SM_SOURCE_PATH_INVALID = ソースパス {0}.{1} ã¯æœªçŸ¥ã®ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ -SM_RULE_SOURCE_MIN_REDUNDANT = 最å°å€¤ {0} ã¯å†—é•·ã§ã™ã€ãªãœãªã‚‰æœ‰åŠ¹ãªæœ€å°å€¤ã¯ {0} ã ã‹ã‚‰ã§ã™ -SM_RULE_SOURCE_MAX_REDUNDANT = 最大値 {0} ã¯å†—é•·ã§ã™ã€ãªãœãªã‚‰æœ‰åŠ¹ãªæœ€å¤§å€¤ã¯ {0} ã ã‹ã‚‰ã§ã™ -SM_RULE_SOURCE_LISTMODE_REDUNDANT = listModeã®å€¤ {0} ã¯å†—é•·ã§ã™ã€ãªãœãªã‚‰æœ‰åŠ¹ãªæœ€å¤§å€¤ã¯ {0} ã ã‹ã‚‰ã§ã™ -SM_TARGET_CONTEXT_UNKNOWN = ターゲットコンテキスト ''{0}'' ã¯ã“ã®æ™‚点ã§ã¯æœªçŸ¥ã§ã™ -SM_TARGET_PATH_INVALID = ターゲットパス {0}.{1} ã¯æœªçŸ¥ã®ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ -SM_NO_LIST_MODE_NEEDED = listModeã¯ã€ä¸€åº¦ã ã‘実行ã§ãるルールã§ã‚ã‚‹ãŸã‚ã€æä¾›ã•ã‚Œã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SM_NO_LIST_RULE_ID_NEEDED = listRuleIdã¯ã€ä¸€åº¦ã ã‘実行ã§ãるルールã§ã‚ã‚‹ãŸã‚ã€æä¾›ã•ã‚Œã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SM_LIST_RULE_ID_ONLY_WHEN_SHARE = ruleIdã¯ã€listMode㌠''share'' ã®å ´åˆã«ã®ã¿æä¾›ã•ã‚Œã‚‹ã¹ãã§ã™ -SM_RULE_SOURCE_UNASSIGNED = ソースステートメントã¯ã‚½ãƒ¼ã‚¹ã«å¤‰æ•°ã‚’割り当ã¦ã¾ã›ã‚“ - ã“ã‚ŒãŒæ„図ã—ãŸã‚‚ã®ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„ -SM_TARGET_PATH_MULTIPLE_MATCHES = ターゲットパス {0}.{1} ã¯ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯è¤‡æ•°ã®è¦ç´  ({3}) ã‚’å‚ç…§ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“れ以上ã®ãƒã‚§ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“ -SM_SOURCE_TYPE_INVALID = タイプ {0} ã¯ã‚½ãƒ¼ã‚¹ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½ãªã‚¿ã‚¤ãƒ—㯠[{2}] ã§ã™ -SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = transform {0}ã¯{1}〜{2}ã®ãƒ‘ラメータをå–ã‚Šã¾ã™ãŒã€{3}ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = transform {0}ã¯{1}個ã®ãƒ‘ラメータをå–ã‚Šã¾ã™ãŒã€{2}ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠-SM_TARGET_TRANSFORM_NOT_CHECKED = transform {0} ã¯ã¾ã ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -SM_TARGET_NO_TRANSFORM_NO_CHECKED = transformãŒãªã„å ´åˆã€ãƒ‘ラメータã¯æä¾›ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = {0}ã®ã‚¿ã‚¤ãƒ—パラメータã®å€¤ã‚’処ç†ã§ãã¾ã›ã‚“ã§ã—㟠-SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = インデックス{0}ã®ãƒ‘ラメータを処ç†ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆã‚¿ã‚¤ãƒ—= {1}) -SM_TARGET_TRANSFORM_EXPRESSION_ERROR = 評価パラメータã¨ã—ã¦æ¸¡ã•ã‚ŒãŸFHIRPathå¼ãŒç„¡åŠ¹ã§ã™ï¼š{0} -SM_IMPORT_NOT_FOUND = {0} ã«ä¸€è‡´ã™ã‚‹ãƒžãƒƒãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- 検証ãŒé–“é•ã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -SM_TARGET_TYPE_MULTIPLE_POSSIBLE = ã“ã“ã§ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—ãŒå¯èƒ½ã§ã™ï¼ˆ{0})。ã—ãŸãŒã£ã¦ã€ã•ã‚‰ãªã‚‹ã‚¿ã‚¤ãƒ—ãƒã‚§ãƒƒã‚¯ã¯ä¸å¯èƒ½ã§ã™ -SM_TARGET_TRANSFORM_TYPE_UNKNOWN = タイプ''{0}''ã¯æœªçŸ¥ã§ã™ -SM_DEPENDENT_PARAM_MODE_MISMATCH = パラメータ {0} ã¯å¤‰æ•° {1} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ãã®ãƒ¢ãƒ¼ãƒ‰ã¯ {2} ã§ã‚ã‚Šã€ã“ã‚Œã¯ã‚°ãƒ«ãƒ¼ãƒ— {3} ã§å¿…è¦ã¨ã•ã‚Œã‚‹ãƒ¢ãƒ¼ãƒ‰ã¨åŒã˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SM_DEPENDENT_PARAM_NOT_FOUND = {1} パラメータ ''{0}'' ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠-SM_DEPENDENT_PARAM_TYPE_MISMATCH = パラメータ ''{0}'' ã¯å¤‰æ•° ''{1}'' ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ãã®ã‚¿ã‚¤ãƒ—㯠''{2}'' ã§ã‚ã‚Šã€ã“ã‚Œã¯ã‚°ãƒ«ãƒ¼ãƒ— ''{3}'' ã§å¿…è¦ã¨ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ—ã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。必è¦ãªã‚¿ã‚¤ãƒ—㯠''{4}'' (マップ ''{5}'' ã‹ã‚‰ï¼‰ -SM_ORPHAN_GROUP = グループ {0} ã¯ã“ã®ãƒžãƒƒãƒ”ングスクリプト内ã‹ã‚‰æ­£å¸¸ã«å‘¼ã³å‡ºã•ã‚Œã¦ãŠã‚‰ãšã€ãã‚Œã®å…¥åŠ›ã«ã‚¿ã‚¤ãƒ—ãŒãªã„ãŸã‚ã€ã‚¿ã‚¤ãƒ—ã®ç¢ºèªã¯ã§ãã¾ã›ã‚“ -SM_SOURCE_TYPE_NOT_FOUND = ソースタイプãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã®ã§ã€ã“ã®æš—示的ãªä¾å­˜ãƒ«ãƒ¼ãƒ«ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を決定ã§ãã¾ã›ã‚“ã§ã—㟠-SM_TARGET_TYPE_NOT_FOUND = ターゲットタイプãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸãŸã‚ã€ã“ã®æš—é»™ã®ä¾å­˜ãƒ«ãƒ¼ãƒ«ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を決定ã§ãã¾ã›ã‚“ã§ã—㟠-SM_MATCHING_RULEGROUP_NOT_FOUND = ソース={0} ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ={1} ã®ã‚¿ã‚¤ãƒ—ペアã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ«ãƒ¼ãƒ«ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -SM_TARGET_TRANSFORM_MISSING_PARAMS = translateæ“作ã®1ã¤ä»¥ä¸Šã®ãƒ‘ラメータãŒæ¬ è½ã—ã¦ã„ã¾ã™ï¼ˆ3ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€{0}ã§ã—ãŸï¼‰ -SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = {0}パラメータã®å€¤ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = ソース変数{0}ã¯ä¸æ˜Žã§ã™ -SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = 変æ›{0}ã«ã¯{2}ã®{1}変数ãŒã‚ã‚Šã¾ã›ã‚“ -SM_TARGET_TRANSFORM_OP_INVALID_TYPE = {1}変数{0}ã®ã‚¿ã‚¤ãƒ—{2}ãŒç„¡åŠ¹ã§ã™ - プリミティブã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = map_uri ''{0}''ãŒè§£æ±ºã§ããªã‹ã£ãŸãŸã‚ã€ãƒžãƒƒãƒ—ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = 出力パラメータã®å€¤''{0}''ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ -SM_TARGET_TRANSLATE_BINDING_SOURCE = ソース変数ã«å¿…è¦ãªãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = ソース変数ãŒä¸æ˜ŽãªValueSet''{0}''ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = ソースValueSetã®å±•é–‹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š''{0}'' -SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = ソースValueSetã«ã¯ã€ãƒžãƒƒãƒ—ãŒç¿»è¨³ã—ãªã„1ã¤ä»¥ä¸Šã®ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ï¼š{0} -SM_TARGET_TRANSLATE_BINDING_TARGET = ターゲット変数ã«å¿…è¦ãªãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSLATE_BINDING_VS_TARGET = ターゲット変数ãŒä¸æ˜ŽãªValueSet''{0}''ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = ターゲットValueSetã®å±•é–‹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š''{0}'' -SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = マップãŒç”Ÿæˆã™ã‚‹1ã¤ä»¥ä¸Šã®ã‚³ãƒ¼ãƒ‰ãŒã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆValueSetã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:{0} -CONCEPTMAP_GROUP_SOURCE_MISSING = ソースコードシステムãŒãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -CONCEPTMAP_GROUP_SOURCE_UNKNOWN = Source Code System {0}ã¯å®Œå…¨ã«å®šç¾©ã•ã‚Œã¦ãŠã‚‰ãšãƒ‡ãƒ¼ã‚¿ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ã¾ãŸã€sourceScopeも指定ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€source codeã®ãƒã‚§ãƒƒã‚¯ã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。 -CONCEPTMAP_GROUP_TARGET_MISSING = Target Code SystemãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€target codeã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -CONCEPTMAP_GROUP_TARGET_UNKNOWN = Target Code System {0}ã¯å®Œå…¨ã«å®šç¾©ã•ã‚Œã¦ãŠã‚‰ãšãƒ‡ãƒ¼ã‚¿ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ã¾ãŸã€targetScopeも指定ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®ãƒã‚§ãƒƒã‚¯ã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。 -CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = source code ''{0}'' ã¯Code System {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = 利用å¯èƒ½ãªTerminologyサーãƒãŒãªã„ã¨ãã«Terminologyサーãƒã‚’使用ã—よã†ã¨ã—ã¾ã—㟠+Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = プロファイル ''{0}'' ã®snapshotを生æˆã™ã‚‹å‰ã« {1} ã¨ã—ã¦ä½¿ç”¨ã—よã†ã¨ã—ã¾ã—㟠+BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = トランザクションã¨ãƒãƒƒãƒã‚’除ãã€Bundleã®å„エントリã«ã¯ã€ã‚¨ãƒ³ãƒˆãƒªå†…ã®ãƒªã‚½ãƒ¼ã‚¹ã®è­˜åˆ¥å­ã§ã‚ã‚‹fullUrlãŒå¿…è¦ã§ã™ +BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = エントリ{0}ã¯MessageHeaderã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ„図ã—ã¦å«ã¾ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‹ç¢ºèªã—ã¦ãã ã•ã„(メッセージã®å‡¦ç†ã«å¿…è¦ã§ã™ï¼‰ +BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = エントリ{0}ã¯Compositionã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã®ã‚ˆã†ãªä½¿ç”¨æ³•ãŒæ‰¿èªã•ã‚Œã¦ã„ã‚‹ã®ã¯Provenanceã®ã¿ã§ã™ï¼ˆR4セクション3.3.1) +BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = エントリ{0}ã¯Compositionã‹ã‚‰å‰æ–¹ã«ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒnarrative contentã®ã‚½ãƒ¼ã‚¹ã§ã‚ã‚‹å ´åˆã€compositionã‹ã‚‰ç›´æŽ¥ãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ã¹ãã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„ +BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = エントリ{0}ã¯ã‚¿ã‚¤ãƒ—ã¨IDã§reference {1}ã¨ä¸€è‡´ã—ã¾ã™ãŒã€Bundle解決ルールã«ã‚ˆã‚Šfull target URL {2}ã¨ã¯ä¸€è‡´ã—ã¾ã›ã‚“ +BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = エントリ{0}ã¯ã‚¿ã‚¤ãƒ—ã¨IDã§reference {1}ã¨ä¸€è‡´ã—ã¾ã™ãŒã€ãã®fullUrl {2}ã¯Bundle解決ルールã«ã‚ˆã‚Šfull target URL {3}ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +BUNDLE_LINK_SEARCH_NO_DUPLICATES = リンク関係タイプ ''{0}'' ã¯ä¸€åº¦ã ã‘発生ã§ãã¾ã™ +BUNDLE_LINK_SEARCH_PROHIBITED = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ã€æ¤œç´¢ã‚»ãƒƒãƒˆã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒªãƒ³ã‚¯é–¢ä¿‚タイプ ''{0}'' ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ +BUNDLE_LINK_STYELSHEET_EXTERNAL = https://hl7.org/fhir/fhir.css 以外ã®å¤–部スタイルシートã¯ä½¿ç”¨ã—ãªã„ã»ã†ãŒè‰¯ã„ã§ã™ +BUNDLE_LINK_STYELSHEET_INSECURE = スタイルシートã®å‚ç…§ã¯å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +BUNDLE_LINK_STYELSHEET_LINKABLE = スタイルシートã®å‚ç…§ã¯è§£æ±ºå¯èƒ½ãªãƒªãƒ³ã‚¯ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +BUNDLE_LINK_STYELSHEET_NOT_FOUND = ã“ã®ãƒãƒ³ãƒ‰ãƒ«ã§ã¯ã‚¹ã‚¿ã‚¤ãƒ«ã‚·ãƒ¼ãƒˆã®å‚照を解決ã§ãã¾ã›ã‚“ +BUNDLE_LINK_UNKNOWN = リンク関係タイプ ''{0}'' ã¯æœªçŸ¥ã§ã‚ã‚Šã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +BUNDLE_POSSSIBLE_MATCHES = ãƒãƒ³ãƒ‰ãƒ«ã«ã¯ã€Bundleå‚照解決ã®ãƒ«ãƒ¼ãƒ«ã«ã‚ˆã‚Š {1} ã®ä¸€è‡´ãŒãªã„ãŒã€ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã¨IDã«ã‚ˆã‚Š {0} ã«ä¸€è‡´ã™ã‚‹è¤‡æ•°ã®ãƒªã‚½ãƒ¼ã‚¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ +BUNDLE_RULE_INVALID_INDEX = Bundle Rulesã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã§ã™ ({0}) +BUNDLE_RULE_NONE = No Rule +BUNDLE_RULE_PROFILE_UNKNOWN = Bundle Rulesã®ãƒ—ロファイル {1} 㯠{0} ã«å¯¾ã—ã¦ä¸æ˜Žã§ã™ +BUNDLE_RULE_UNKNOWN = Bundle Ruleã¯ç„¡åŠ¹ãªãƒªã‚½ãƒ¼ã‚¹ {0} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ +BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entriesã¯ãƒªã‚½ãƒ¼ã‚¹ã‚’æŒã£ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = 検索çµæžœã«ã¯idãŒå¿…è¦ã§ã™ +BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = ã“ã®ãƒªã‚½ãƒ¼ã‚¹ãŒã“ã®æ¤œç´¢ã®ãŸã‚ã®æœ‰åŠ¹ãªãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’判断ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = ã“ã‚Œã¯æŒ‡å®šã•ã‚ŒãŸæ¤œç´¢ã«å¯¾ã™ã‚‹ä¸€è‡´ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ( {1}を期待ã—ã¦ã„る㌠{0}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = ã“ã‚Œã¯æŒ‡å®šã•ã‚ŒãŸæ¤œç´¢ã«å¯¾ã™ã‚‹ä¸€è‡´ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã§ã¯ã‚ã‚Šã¾ã›ã‚“(検索モードãŒå¿…è¦ï¼Ÿï¼‰ ({0} ㌠{1} を期待ã—ã¦ã„ã¾ã™) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = ã“ã‚Œã¯OperationOutcomeã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +BUNDLE_SEARCH_NOSELF = SearchSet Bundlesã¯æ¤œç´¢å†…容を指定ã™ã‚‹self linkã‚’æŒã£ã¦ã„ã‚‹ã¹ãã§ã™ +BUNDLE_SEARCH_NO_MODE = SearchSet bundlesã¯ã‚¨ãƒ³ãƒˆãƒªã«æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã‚’æŒã£ã¦ã„ã‚‹ã¹ãã§ã™ +BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = 検索文字列ã‹ã‚‰ã‚¿ã‚¤ãƒ—を特定ã§ããªã„ãŸã‚ã€ã‚¿ã‚¤ãƒ—を確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Bad_file_path_error = !!\n********************\n* ã‚ãªãŸãŒæŒ‡å®šã—ãŸãƒ•ã‚¡ã‚¤ãƒ«å〠''{0}'' ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«å­˜åœ¨ã—ã¾ã›ã‚“。\n* ã“ã‚ŒãŒæœ‰åŠ¹ãªãƒ•ã‚¡ã‚¤ãƒ«ã®å ´æ‰€ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。\n********************\n\n +Base__Derived_profiles_have_different_types____vs___ = ベースã¨æ´¾ç”Ÿã®ãƒ—ロファイルãŒç•°ãªã‚‹ã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({0} = {1} vs {2} = {3}) +Base_profile__has_no_type = ベースã®ãƒ—ロファイル {0} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_Canonical = æ­£è¦URL({0})ã¯ã€æ­£è¦ã‚µãƒ¼ãƒä¸Šã§ãªã‘ã‚Œã°ã€fullUrl({1})ã¨ä¸€è‡´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Bundle_BUNDLE_Entry_Document = 文書ã®æœ€åˆã®ã‚¨ãƒ³ãƒˆãƒªã¯compositionã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_IdUrlMismatch = リソースIDã¯ã‚¨ãƒ³ãƒˆãƒªã®fullUrl内ã®ID(''{0}'' vs ''{1}'')ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +Bundle_BUNDLE_Entry_MismatchIdUrl = æ­£è¦URL({0})ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ID({2})も一致ã™ã‚‹å ´åˆã«é™ã‚Šã€fullUrl({1})ã¨ä¸€è‡´ã§ãã¾ã™ +Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = リソース''Binary/{0}''ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸè«–ç†ãƒ¢ãƒ‡ãƒ«{1}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_NoFirst = ドキュメントã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å°‘ãªãã¨ã‚‚一ã¤ã®ã‚¨ãƒ³ãƒˆãƒªã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Bundle_BUNDLE_Entry_NoFirstResource = 最åˆã®ã‚¨ãƒ³ãƒˆãƒªã«ãƒªã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_NoFullUrl = BundleエントリãŒfullUrlを欠ã„ã¦ã„ã¾ã™ +Bundle_BUNDLE_Entry_NoProfile_EXPL = {0}リソースã®ã‚¿ã‚¤ãƒ—''{0}''ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸãƒ—ロファイル{2}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_NoProfile_TYPE = タイプ''{1}''ã®{0}リソースã«å¯¾ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_Orphan_DOCUMENT = エントリ{0}ã¯Compositionã‹ã‚‰ã®ãƒªãƒ³ã‚¯ï¼ˆå‰æ–¹ã¾ãŸã¯å¾Œæ–¹ï¼‰ã‚’ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ãã¾ã›ã‚“ +Bundle_BUNDLE_Entry_Orphan_MESSAGE = エントリ{0}ã¯MessageHeaderã‹ã‚‰ã®ãƒªãƒ³ã‚¯ï¼ˆå‰æ–¹ã¾ãŸã¯å¾Œæ–¹ï¼‰ã‚’ãŸã©ã‚‹ã“ã¨ã§åˆ°é”ã§ããªã„ãŸã‚ã€ãã®å­˜åœ¨ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡¦ç†ã«å¿…è¦ï¼Ÿï¼‰ +Bundle_BUNDLE_Entry_Type = タイプ''{0}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - ã“ã“ã§ã¯ãƒªã‚½ãƒ¼ã‚¹ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(allowed = {1}) +Bundle_BUNDLE_Entry_Type2 = タイプ''{0}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - {1}ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(allowed = {2}) +Bundle_BUNDLE_Entry_Type3_one = タイプ''{1}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - タイプ{2}ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Bundle_BUNDLE_Entry_Type3_other = タイプ''{1}''ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ - {0}タイプã®ã†ã¡ã®ä¸€ã¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“: {2} +Bundle_BUNDLE_FullUrl_Missing = fullUrlを欠ã„ãŸBundle内ã«ã®ã‚¨ãƒ³ãƒˆãƒªã«ç›¸å¯¾ReferenceãŒå­˜åœ¨ã—ã¾ã™ +Bundle_BUNDLE_FullUrl_NeedVersion = fullURL {0}ã«ä¸€è‡´ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³å›ºæœ‰ã®å‚ç…§ãŒã‚ã‚‹ãŸã‚meta/versionIdを宣言ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Bundle_BUNDLE_MultipleMatches = reference {0}ã«å¯¾ã—ã¦ãƒãƒ³ãƒ‰ãƒ«å†…ã§è¤‡æ•°ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Bundle_BUNDLE_Not_Local = URN referenceã¯ãƒãƒ³ãƒ‰ãƒ«{0}内ã«ãƒ­ãƒ¼ã‚«ãƒ«ã§å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ +Bundle_Document_Date_Missing = ドキュメントã¯æ—¥ä»˜ã‚’æŒã£ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(Bundle.timestamp) +Bundle_Document_Date_Missing_html = [(type = ''document'') 㯠(meta.lastUpdated.hasValue()) ã‚’æ„味ã—ã¾ã™] +Bundle_MSG_Event_Count = {0} ãŒæœŸå¾…ã•ã‚Œã¾ã—ãŸãŒã€{1} ã®ã‚¤ãƒ™ãƒ³ãƒˆè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+CDATA_is_not_allowed = CDATAã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +CODESYSTEM_CS_COUNT_COMPLETE_WRONG = CodeSystem.contentãŒcompleteã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptã®æ•° ({0})ãŒCodeSystem.count ({1})ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +CODESYSTEM_CS_COUNT_FRAGMENT_WRONG = CodeSystem.contentãŒfragment/exampleã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptã®æ•° ({0})ãŒCodeSystem.count ({1})を超ãˆã¦ã„ã¾ã™ +CODESYSTEM_CS_COUNT_NOTPRESENT_ZERO = !!CodeSystem.contentãŒnot-presentã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€CodeSystem.countã«0より大ãã„値ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚ŒãŒconceptã‚’æŒãŸãªã„completeãªã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã§ã‚ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã‹ã€countã®å€¤ã‚’æ›´æ–°/削除ã—ã¦ãã ã•ã„。 +CODESYSTEM_CS_COUNT_NO_CONTENT_ALLOWED = CodeSystem.contentãŒnot-presentã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+CODESYSTEM_CS_COUNT_SUPPLEMENT_WRONG = ã“ã®supplementコードシステムã¯countã®å€¤ãŒ{1}ã§ã™ãŒã€é…下ã®codesysteã®countã®å€¤ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7 Defined CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7 Defined CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystemsãŒsupplementã§ã‚ã‚‹å ´åˆã¯{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = !!CodeSystem Supplementsã¯ã€ontentè¦ç´ ã®å€¤ãŒ'supplement'ã§ã‚ã‚‹å ´åˆã€ã©ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ãŒè£œè¶³ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’指定ã™ã‚‹supplementsè¦ç´ ã‚’æŒã¤ã¹ãã§ã™ +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = !!CodeSystem Supplementsã¯ã€contentè¦ç´ ã®å€¤ãŒ'supplement'ã§ã‚ã‚‹ã¹ãã§ã™ +CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystemsã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã®çŠ¶æ…‹ã¨æ„味を明確ã«ç†è§£ã§ãるよã†ã«ã€{0} è¦ç´ ã«å¯¾ã™ã‚‹æ˜Žç¢ºãªå€¤ã‚’æŒã¤ã¹ãã§ã™ +CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0}ã¯supplementã§ã‚ã‚‹ãŸã‚ã€Coding.systemã®å€¤ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“ +CODESYSTEM_CS_NO_VS_NOTCOMPLETE = valueSetを確èªã—ã¦ãã ã•ã„ - 一般的ã«ã¯ã€ä¸å®Œå…¨ãªCodeSystemã¯valueSetを指定ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ +CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0}ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã®ã§ã€conceptãŒæœ‰åŠ¹ã‹ã©ã†ã‹ã‚’確èªã§ãã¾ã›ã‚“ +CODESYSTEM_CS_SUPP_INVALID_CODE = 基本ã®CodeSystem {0}ã«ã¯code ''{1}''ãŒå®£è¨€ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€supplementã®ä¸­ã§ã¯ç„¡åŠ¹ã§ã™ +CODESYSTEM_CS_UNK_EXPANSION = !!æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ï¼ˆ{2})ã¯ã€ValueSet {0}ã®expansionã«ã¯å«ã¾ã‚Œã¦ãŠã‚‰ãšã€ã“ã®ValueSetã‹ã‚‰ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚system {1}ã¯æœªçŸ¥ã§ã™ã€‚ +CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãã‚Œã¯conceptã®æ•°ãŒç•°ãªã‚‹expansionã§ã™ï¼ˆæœŸå¾…ã—ãŸã®ã¯ {3} 件ã§ã™ãŒã€ {2} 件見ã¤ã‘ã¾ã—ãŸï¼‰ +CODESYSTEM_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = !!公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CODESYSTEM_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CODESYSTEM_SHAREABLE_MISSING_HL7 = !!公開ã•ã‚ŒãŸcode systemsã¯CodeSystem.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableCodeSystemプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = source code ''{0}'' ã¯Code System {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS = source code ''{0}'' ã¯Value Set {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = source display ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½æ€§ã®ã‚ã‚‹code {1} -CONCEPTMAP_GROUP_TARGET_CODE_INVALID = target code ''{0}''ã¯Code System {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = !!source display ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½æ€§ã®ã‚ã‚‹code {1} +CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Source Code System {0}ã«ã¯ã™ã¹ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„(コンテンツ = {1})ãŒãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_SOURCE_MISSING = ソースコードシステムãŒãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_SOURCE_UNKNOWN = Source Code System {0}ã¯å®Œå…¨ã«å®šç¾©ã•ã‚Œã¦ãŠã‚‰ãšãƒ‡ãƒ¼ã‚¿ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ã¾ãŸã€sourceScopeも指定ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€source codeã®ãƒã‚§ãƒƒã‚¯ã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。 +CONCEPTMAP_GROUP_TARGET_CODE_INVALID = target code ''{0}''ã¯Code System {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ CONCEPTMAP_GROUP_TARGET_CODE_INVALID_VS = target code ''{0}'' ã¯Value Set {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = target display ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½ãªdisplay㯠{1} ã§ã™ -CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = プロパティコード ''{0}'' ã¯æœªçŸ¥ã§ã™ -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = ã“ã®ãƒ—ロパティã®ã‚¿ã‚¤ãƒ—㯠{0} ã§ã¯ãªã {1} ã§ã‚ã‚‹ã¹ãã§ã™ -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = systemãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒ—レーンãªã‚³ãƒ¼ãƒ‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ -CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = code {0} ã¯system {1} 内ã§ç„¡åŠ¹ã§ã™ -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = system {0} ã¯æœªçŸ¥ãªã®ã§ã€ã‚³ãƒ¼ãƒ‰ã®å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = グループ {0} ã¯ã™ã§ã«ç•°ãªã‚‹ãƒ‘ラメータã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã‚¿ã‚¤ãƒ—ã®ãƒã‚§ãƒƒã‚¯ãŒæ­£ã—ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ (ä»– = [{1}]ï¼›ã“ã‚Œ = [{2}]) -CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Source Code System {0}ã«ã¯ã™ã¹ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„(コンテンツ = {1})ãŒãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -CONCEPTMAP_GROUP_TARGET_INCOMPLETE = ターゲットã®Code System {0} ã¯å…¨ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„(content = {1})をæŒã£ã¦ã„ãªã„ãŸã‚ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SD_NO_TYPE_CODE_ON_CODE = {1} è¦ç´  {0} ã®snapshotã«ã¯å€¤ã®ãªã„type.codeãŒã‚ã‚Šã¾ã™ -UNKNOWN_CODESYSTEM = CodeSystem {0}ã¯æœªçŸ¥ã§ã™ -UNKNOWN_CODESYSTEM_VERSION = CodeSystem {0}ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³{1}ã¯æœªçŸ¥ã§ã™ã€‚有効ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³: {2} -UNABLE_TO_INFER_CODESYSTEM = ValueSet {1}内ã®ã‚³ãƒ¼ãƒ‰{0}ã®ã‚·ã‚¹ãƒ†ãƒ URIを決定ã§ãã¾ã›ã‚“ã§ã—㟠-VALUESET_TOO_COSTLY = ValueSet {0}ã«ã¯å¤šã™ãŽã‚‹ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã€è¡¨ç¤ºã§ãã¾ã›ã‚“({1}) -VALUESET_TOO_COSTLY_TIME = ValueSet {0}ã®å‡¦ç†ã«æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™ (>{1}sec) -NO_VALID_DISPLAY_FOUND_one = 言語 {4} 㧠{1}#{2} ã®æœ‰åŠ¹ãªdisplayãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -NO_VALID_DISPLAY_FOUND_other = 言語 {4} 㧠{1}#{2} ã®æœ‰åŠ¹ãªdisplayãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -SD_NO_CONTEXT_WHEN_NOT_EXTENSION = タイプ㯠{0} ãªã®ã§ã€extensionã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’指定ã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = タイプ㯠{0} ãªã®ã§ã€extensionã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆä¸å¤‰æ€§ã‚’指定ã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = extensionタイプを確èªã—ã¦ãã ã•ã„:extensionã¯ãれらãŒæœ¬å½“ã«ã©ã“ã§ã‚‚使用ã§ãã‚‹ã“ã¨ã‚’æ„図ã—ãŸã‚‚ã®ã§ã¯ãªã„é™ã‚Šã€ {0} ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ -ED_PATH_WRONG_TYPE_MATCH = タイプリストãŒåˆ¶ç´„ã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‘ス㯠''{0}'' ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ ''{1}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -ATTEMPT_TO_CHANGE_SLICING = è¦ç´  {0} ã§ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚° {1} を定義ã—ã¦ã„ã¾ã™ãŒã€ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚° {2} ã®è¦ç´ ã§ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ã‚’ {3} ã«å†å®šç¾©ã—よã†ã¨ã—ã¦ã„ã¾ã™ -REPEAT_SLICING_IGNORED = {0} ã®è¦ç´ ã¯ã‚¹ãƒ©ã‚¤ã‚¹ã‚’定義ã—ã¦ã„ã¾ã™ãŒã€ã‚¹ãƒ©ã‚¤ã‚¹å†…ã®è¦ç´  {2} ã§å†å®šç¾©ã•ã‚Œã¦ãŠã‚Šã€ãã‚Œã¯ç„¡è¦–ã•ã‚Œã¾ã™ -SD_ELEMENT_NOT_IN_CONSTRAINT = {1} ã®è¦ç´ å®šç¾©ã«ã¯ã€ãƒ—ロファイルã§ã¯è¨±ã•ã‚Œãªã„プロパティ {0} ãŒã‚ã‚Šã¾ã™ -SD_OBGLIGATION_PROFILE_UKNOWN = プロファイルã¯obligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ãŒã€åŸºæœ¬ãƒ—ロファイル ''{0}'' ãŒä¸æ˜ŽãªãŸã‚ã€ãã®æ­£ç¢ºã•ã‚’確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -SD_OBGLIGATION_PROFILE_DERIVATION = ä»–ã®ãƒ—ロファイルを制約ã™ã‚‹ãƒ—ロファイルã ã‘ãŒobligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ -SD_OBGLIGATION_PROFILE_UNMATCHED = è¦ç´  ''{0}'' ã¯ã€ã“ã®obligationプロファイルãŒåŸºã¥ã„ã¦ã„るプロファイル ''{1}'' ã«åŒç­‰ã®ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“ -SD_OBGLIGATION_PROFILE_PATH_WRONG = è¦ç´  ''{0}'' ã®ãƒ‘ス値 ''{1}'' ã¯ã€åŸºæœ¬ãƒ‘ス ''{2}'' ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -SD_OBGLIGATION_PROFILE_ILLEGAL = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„プロパティ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ -SD_OBGLIGATION_PROFILE_ILLEGAL_ON_BINDING = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒ—ロパティ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ -SD_OBGLIGATION_PROFILE_ILLEGAL_BINDING = è¦ç´  ''{0}'' ã¯ã€åŸºæœ¬è¦ç´ ãŒæŒãŸãªã„ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã£ã¦ã„ã¦ã€ã“ã‚Œã¯obligationプロファイルã§ã¯è¨±ã•ã‚Œã¦ã„ãªã„ -SD_OBGLIGATION_PROFILE_INVALID_BINDING_CODE = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„追加ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ç›®çš„ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ -SD_OBGLIGATION_PROFILE_INVALID_BINDING_STRENGTH = è¦ç´  ''{0}'' ã¯ã€åŸºæœ¬ (''{2}'') ã¨ã¯ç•°ãªã‚‹ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°å¼·åº¦ (''{1}'') ã‚’æŒã£ã¦ã„ã¦ã€ã“ã‚Œã¯obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -SD_OBGLIGATION_INHERITS_PROFILE_NO_TARGET = ã“ã®extensionã‹ã‚‰å€¤ã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -SD_OBGLIGATION_INHERITS_PROFILE_TARGET_NOT_FOUND = プロファイル ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠-SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_TYPE = プロファイル ''{0}'' ã¯obligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_BASE = プロファイル ''{0}'' ã¯äºˆæœŸã•ã‚ŒãŸ ''{2}'' ã§ã¯ãªãã€ç•°ãªã‚‹ãƒ™ãƒ¼ã‚¹''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ -RND_CS_CONTENT_COMPLETE = ã“ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ  ã¯æ¬¡ã®ã‚³ãƒ¼ãƒ‰ãŸã¡ã‚’定義ã—ã¾ã™: -RND_CS_CONTENT_EXAMPLE = ã“ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ  ã¯ã„ãã¤ã‹ã®ä¾‹ã‚³ãƒ¼ãƒ‰ãŸã¡ã‚’æä¾›ã—ã¾ã™: -RND_CS_CONTENT_FRAGMENT = ã“ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ  ã¯ä»¥ä¸‹ã®ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆã‚’æä¾›ã—ã¾ã™: -RND_CS_CONTENT_NOTPRESENT = ã“ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ  ã¯ã‚³ãƒ¼ãƒ‰ã‚’定義ã—ã¾ã™ãŒã€ã“ã“ã§ã¯ã‚³ãƒ¼ãƒ‰ã¯è¡¨ç¾ã•ã‚Œã¦ã„ã¾ã›ã‚“ -RND_CS_CONTENT_SUPPLEMENT = ã“ã®ã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ  ã¯æ¬¡ã®ã‚³ãƒ¼ãƒ‰ã« {0} を定義ã—ã¾ã™: -QUESTIONNAIRE_Q_UNKNOWN_DERIVATION = 派生ã«å‚ç…§ã•ã‚Œã‚‹Questionnaire ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠-QUESTIONNAIRE_Q_NO_DERIVATION_TYPE = Questionnaire ''{0}'' 㯠''http://hl7.org/fhir/StructureDefinition/questionnaire-derivationType'' 拡張を使用ã—ã¦æ´¾ç”Ÿã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ´¾ç”ŸãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ -QUESTIONNAIRE_Q_NO_DERIVATION_TYPE_VALUE = 派生extensionã«ã¯å€¤ãŒã‚ã‚Šã¾ã›ã‚“ -QUESTIONNAIRE_Q_DERIVATION_TYPE_IGNORED = 派生タイプ ''{0}'' ã¯ã€ã“ã®Questionnaireã«å¯¾ã—ã¦æ´¾ç”Ÿãƒã‚§ãƒƒã‚¯ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ -QUESTIONNAIRE_Q_DERIVATION_TYPE_UNKNOWN = 派生タイプ ''{0}'' ã¯æœªçŸ¥ã§ã€ã“ã‚Œã¯ã“ã®Questionnaireã«å¯¾ã—ã¦æ´¾ç”Ÿãƒã‚§ãƒƒã‚¯ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ -QUESTIONNAIRE_Q_ITEM_NOT_DERIVED = Questionnaire ''{0}'' ã§linkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_TYPE = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚¿ã‚¤ãƒ— ''{2}'' ã‚’æŒã¡ã€ã“れを ''{3}'' ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REPEATS = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ç¹°ã‚Šè¿”ã—ã¾ã›ã‚“ã®ã§ã€ã“ã“ã§ã‚‚ç¹°ã‚Šè¿”ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REQUIRED = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å¿…é ˆãªã®ã§ã€ã“ã“ã§ã‚‚å¿…é ˆã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_DEFINITION = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ã“れを変更ã™ã‚‹ã¤ã‚‚ã‚Šã§ã™ã‹ï¼Ÿ -QUESTIONNAIRE_Q_ITEM_DERIVED_DEFINITION = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã‚Œã¯ã“ã“ã§ã‚‚ç¹°ã‚Šè¿”ã•ã‚Œã‚‹ã¹ãã§ã™ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_MAXLENGTH = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯maxLength ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€æœ€å¤§é•·ã¯ãれを超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_MAXLENGTH = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚‚ã¾ãŸæœ€å¤§é•·ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ -QUESTIONNAIRE_Q_ITEM_DERIVED_NC_ANSWER_TYPE = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯answer{2}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯answer{3}ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯æœ‰åŠ¹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ï¼ˆã¾ã ï¼Ÿï¼‰ãれを確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_NI_ANSWER_VS = ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ï¼ˆã¾ã ï¼Ÿï¼‰æ´¾ç”Ÿã‚¢ã‚¤ãƒ†ãƒ ValueSetã®æ•´åˆæ€§ã‚’確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ -QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯answerOptionsã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚‚åŒæ§˜ã«æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ -QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS_NEW = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã“ã®answerOptionã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ãã‚Œã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -PRIMITIVE_MUSTHAVEVALUE_MESSAGE = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€ã“ã®è¦ç´ ã«å€¤ãŒå­˜åœ¨ã™ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€å€¤ãŒå­˜åœ¨ã—ãªã„å ´åˆã€extension ''{2}'' ãŒå­˜åœ¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€å€¤ãŒå­˜åœ¨ã—ãªã„å ´åˆã€extension ''{2}'' ã®ã„ãšã‚Œã‹ãŒå­˜åœ¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ -ED_INVARIANT_NO_KEY = 制約ã«ã‚­ãƒ¼ãŒãªã„ãŸã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æ¤œè¨¼ã§ãã¾ã›ã‚“ -ED_INVARIANT_KEY_ALREADY_USED = 制約キー ''{0}'' ã¯æ—¢ã«åŸºæœ¬ãƒ—ロファイル ''{1}'' ã«å­˜åœ¨ã—ã¾ã™ -ED_INVARIANT_NO_EXPRESSION = 制約 ''{0}'' ã«ã¯è¨ˆç®—å¯èƒ½ãªå¼ãŒãªã„ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ã“れをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ -ED_INVARIANT_EXPRESSION_CONFLICT = 制約 ''{0}'' ã¯å¼ ''{1}'' ã‚’æŒã¡ã€ãã‚Œã¯ä»¥å‰ã«æä¾›ã•ã‚ŒãŸ ''{2}'' ã¨ç•°ãªã‚Šã¾ã™ (ä¸å¤‰ã¯ç¹°ã‚Šè¿”ã—å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“) -ED_INVARIANT_EXPRESSION_ERROR = 制約 ''{0}'' ã®å¼ ''{1}'' ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {2} -SNAPSHOT_IS_EMPTY = プロファイル''{0}''ã®snapshotãŒç©ºã§ã™ï¼ˆã“ã‚Œã¯èµ·ã“ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“) -TERMINOLOGY_TX_HINT = {1} -TERMINOLOGY_TX_WARNING = {1} -SD_ED_TYPE_WRONG_TYPE_one = è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {0} ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯åŸºæœ¬ãƒ—ロファイル {2} ã®ã‚¿ã‚¤ãƒ— {1} ã¨ç•°ãªã‚Šã¾ã™ -SD_ED_TYPE_WRONG_TYPE_other = è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {0} ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯åŸºæœ¬ãƒ—ロファイル {2} ã®ã‚¿ã‚¤ãƒ— {1} ã«ã¯ã‚ã‚Šã¾ã›ã‚“ -VALUESET_CONCEPT_DISPLAY_PRESENCE_MIXED = ã“ã®å«æœ‰ç‰©ã«ã¯è¡¨ç¤ºã‚ã‚Šã®conceptã¨è¡¨ç¤ºãªã—ã®conceptãŒæ··åœ¨ã—ã¦ã„ã¾ã™ - æ„図ã—ãŸé€šã‚Šã‹ç¢ºèªã—ã¦ãã ã•ã„ -VALUESET_CONCEPT_DISPLAY_SCT_TAG_MIXED = ã“ã®SNOMED-CTベースã®å«æœ‰ç‰©ã«ã¯ã€ã‚»ãƒžãƒ³ãƒ†ã‚£ãƒƒã‚¯ã‚¿ã‚°ï¼ˆFSN用語)付ãã®conceptã¨ãれ無ã—(優先用語)ã®conceptãŒæ··åœ¨ã—ã¦ã„ã¾ã™ - æ„図ã—ãŸé€šã‚Šã‹ç¢ºèªã—ã¦ãã ã•ã„ -CS_SCT_IPS_NOT_IPS = Snomed CT コード {0} ({1}) 㯠IPS free set ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -UNICODE_XML_BAD_CHARS_one = ã“ã®å†…容ã«ã¯æ–‡å­—{1}(16進数値)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®æ–‡å­—ã¯FHIRã®XMLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä¸é©åˆã§ã€é€šå¸¸ã€ãã®ã‚ˆã†ãªæ–‡å­—を有効ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ -UNICODE_XML_BAD_CHARS_other = ã“ã®å†…容ã«ã¯æ–‡å­—{1}(16進数値)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“れらã®æ–‡å­—ã¯FHIRã®XMLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä¸é©åˆã§ã€é€šå¸¸ã€ãã®ã‚ˆã†ãªæ–‡å­—を有効ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ -LIQUID_UNKNOWN_FILTER = 未知ã®Liquidフィルター '''{0}''' -LIQUID_UNKNOWN_SYNTAX = Liquidステートメントã®è§£æžä¸­ã«äºˆæœŸã—ãªã„構文ãŒã‚ã‚Šã¾ã—㟠-LIQUID_SYNTAX_EXPECTING = スクリプト {0}: '{1}'を見ã¤ã‘ã¾ã—ãŸãŒã€è§£æžã‚µã‚¤ã‚¯ãƒ«ã§'{2}'を期待ã—ã¦ã„ã¾ã—㟠-LIQUID_SYNTAX_UNTERMINATED = スクリプト {0}: 解æžã‚µã‚¤ã‚¯ãƒ«ã§çµ‚了ã—ã¦ã„ãªã„文字列を見ã¤ã‘ã¾ã—㟠-LIQUID_UNKNOWN_FLOW_STMT = スクリプト {0}: 未知ã®ãƒ•ãƒ­ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆ ''{1}'' -LIQUID_UNKNOWN_NOEND = スクリプト {0}: {1}を探ã—ã¦ã„ã‚‹ã¨ãã«ã‚¹ã‚¯ãƒªãƒ—トã®çµ‚了を見ã¤ã‘ã¾ã—㟠-LIQUID_SYNTAX_INCLUDE = スクリプト {0}: インクルードã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: {1} -LIQUID_SYNTAX_LOOP = スクリプト {0}: ループã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: {1} -LIQUID_SYNTAX_NOTERM = スクリプト {0}: 終了ã—ã¦ã„ãªã„Liquidステートメント {1} -LIQUID_UNKNOWN_NOTERM = スクリプト {0}: 終了ã—ã¦ã„ãªã„Liquidステートメント {1} -LIQUID_SYNTAX_COLON = {0}ã®è©•ä¾¡ä¾‹å¤–: limitã®å¾Œã«':'ãŒç¶šãã¾ã›ã‚“ -LIQUID_SYNTAX_NUMBER = {0}ã®è©•ä¾¡ä¾‹å¤–: limitã®å¾Œã«æ•°å­—ãŒç¶šã„ã¦ã„ã¾ã›ã‚“ -LIQUID_SYNTAX_UNEXPECTED = {0}ã®è©•ä¾¡ä¾‹å¤–: {1}ã§äºˆæœŸã—ãªã„内容ãŒã‚ã‚Šã¾ã™ -LIQUID_VARIABLE_ALREADY_ASSIGNED = Liquid例外: 変数 ''{0}'' ã¯ã™ã§ã«å€¤ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ -LIQUID_VARIABLE_ILLEGAL = Liquid例外: 変数å ''{0}'' ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ -ED_INVARIANT_DIFF_NO_SOURCE = differantialã§å®šç¾©ã•ã‚ŒãŸä¸å¤‰ {0} ã¯ã‚½ãƒ¼ã‚¹ã‚’æŒãŸãªã„ã‹ã€ã‚½ãƒ¼ã‚¹ã¯ãƒ—ロファイルã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ -FHIRPATH_COLLECTION_STATUS_OPERATION_LEFT = å·¦å´ã¯æœ¬è³ªçš„ã«ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã§ã‚ã‚‹ãŸã‚ã€è©•ä¾¡ã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã€å¼ ''{0}'' ãŒå¤±æ•—ã—ãŸã‚Šã€falseã‚’è¿”ã—ãŸã‚Šã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ -FHIRPATH_COLLECTION_STATUS_OPERATION_RIGHT = å³å´ã¯æœ¬è³ªçš„ã«ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã§ã‚ã‚‹ãŸã‚ã€è©•ä¾¡ã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã€å¼ ''{0}'' ãŒå¤±æ•—ã—ãŸã‚Šã€falseã‚’è¿”ã—ãŸã‚Šã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = !!target display ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½ãªdisplay㯠{1} ã§ã™ +CONCEPTMAP_GROUP_TARGET_INCOMPLETE = ターゲットã®Code System {0} ã¯å…¨ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„(content = {1})をæŒã£ã¦ã„ãªã„ãŸã‚ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ã‚³ãƒ¼ãƒ‰ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_TARGET_MISSING = Target Code SystemãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€target codeã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = code {0} ã¯system {1} 内ã§ç„¡åŠ¹ã§ã™ +CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = プロパティコード ''{0}'' ã¯æœªçŸ¥ã§ã™ +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = ã“ã®ãƒ—ロパティã®ã‚¿ã‚¤ãƒ—㯠{0} ã§ã¯ãªã {1} ã§ã‚ã‚‹ã¹ãã§ã™ +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = systemãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒ—レーンãªã‚³ãƒ¼ãƒ‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = !!system {0} ã¯æœªçŸ¥ãªã®ã§ã€ã‚³ãƒ¼ãƒ‰ã®å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +CONCEPTMAP_GROUP_TARGET_UNKNOWN = Target Code System {0}ã¯å®Œå…¨ã«å®šç¾©ã•ã‚Œã¦ãŠã‚‰ãšãƒ‡ãƒ¼ã‚¿ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ã¾ãŸã€targetScopeも指定ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®ãƒã‚§ãƒƒã‚¯ã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。 +CONCEPTMAP_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = !!公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CONCEPTMAP_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CONCEPTMAP_SHAREABLE_MISSING_HL7 = !!公開ã•ã‚ŒãŸã‚³ãƒ³ã‚»ãƒ—トマップã¯ConceptMap.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableConceptMapプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +CONCEPTMAP_VS_INVALID_CONCEPT_CODE = システム {0}ã«ãŠã‘ã‚‹code "{1}"㯠value set "{2}"ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {1}ã®ã‚·ã‚¹ãƒ†ãƒ  {0}ã«ãŠã‘ã‚‹code "{2}"㯠value set "{3}"ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +CONCEPTMAP_VS_TOO_MANY_CODES = concept mapã«å¤§é‡ã®codeãŒå«ã¾ã‚Œã‚‹ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã¾ã›ã‚“: {0} +CS_SCT_IPS_NOT_IPS = Snomed CT コード {0} ({1}) 㯠IPS free set ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Can_only_specify_profile_in_the_context = コンテキスト内ã§ã®ã¿ãƒ—ロファイルを指定ã§ãã¾ã™ +Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = ãƒãƒªãƒ¢ãƒ¼ãƒ•ã‚£ãƒƒã‚¯ã‚¿ã‚¤ãƒ—ã‚’æŒã¤è¦ç´ ã«ã¯å­ä¾›ã‚’æŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“ - ã¾ãšã‚¿ã‚¤ãƒ—をスライスã—ã¦åˆ¶ç´„を付ã‘ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆsortElements: {0}:{1}) +CapabalityStatement_CS_SP_WrongType = タイプã®ä¸ä¸€è‡´ - SearchParameter ''{0}'' ã®ã‚¿ã‚¤ãƒ—㯠{1} ã§ã™ãŒã€ã“ã“ã§ã¯ã‚¿ã‚¤ãƒ—㯠{2} ã§ã™ +Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = 循環ã™ã‚‹snapshotå‚ç…§ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚snapshotを生æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“(スタック = {0}) +CodeSystem_CS_VS_IncludeDetails = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã«ä½™åˆ†ãªè©³ç´°ãŒã‚ã‚Šã¾ã™ +CodeSystem_CS_VS_Invalid = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ValueSetã«ã¯ä¸€ã¤ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã—ã‹ã‚ã‚Šã¾ã›ã‚“ +CodeSystem_CS_VS_WrongSystem = CodeSystem {0}ã¯''all system''ã®ValueSet {1}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ValueSetã«ã¯ä¸€è‡´ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ï¼ˆ{2})ãŒã‚ã‚Šã¾ã›ã‚“ +Code_found_in_expansion_however_ = 拡張中ã«ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã—ã‹ã—ãªãŒã‚‰: {0} +Coding_has_no_system__cannot_validate = !!Codingã«ã¯systemãŒãªã„ - 検証ã§ãã¾ã›ã‚“ +Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = å«ã¾ã‚Œã¦ã„るリソースã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰ ''{0}'') +Could_not_match_discriminator_for_slice_in_profile_one = スライス {1} ã®discriminator ({0}) をプロファイル {2} ã«ä¸€è‡´ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠- discriminator {3} ã¯å›ºå®šå€¤ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã€å­˜åœ¨ã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ +Could_not_match_discriminator_for_slice_in_profile_other = スライス {2} ã®ã„ãšã‚Œã®discriminator ({1}) もプロファイル {3} ã«ä¸€è‡´ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠- {0} discriminator {4} ã®ã„ãšã‚Œã‚‚固定値ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã€å­˜åœ¨ã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ +DISCRIMINATOR_BAD_PATH = discriminatorã®ãƒ‘ス表ç¾ã®å‡¦ç†ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {0} (src = ''{1}'') +DUPLICATE_ID = é‡è¤‡ã—ãŸid値 ''{0}'' +DUPLICATE_JSON_PROPERTY_KEY = JSONプロパティ ''{0}'' ã¯é‡è¤‡ã—ã¦ã„ã‚‹ãŸã‚無視ã•ã‚Œã¾ã™ +Delimited_versions_have_exact_match_for_delimiter____vs_ = デリミタ ''{0}'' ã®å®Œå…¨ä¸€è‡´ç‰ˆã¯å­˜åœ¨ã—ã¾ã™ : {1} 対 {2} +Derived_profile__has_no_derivation_value_and_so_cant_be_processed = 派生プロファイル {0} ã¯å°Žå‡ºå€¤ã‚’æŒãŸãšã€ã—ãŸãŒã£ã¦å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Derived_profile__has_no_type = 派生プロファイル {0} ã¯ã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã›ã‚“ +Details_for__matching_against_Profile_ = {0} ã®è©³ç´°ã¯ãƒ—ロファイル {1} ã«ä¸€è‡´ã—ã¾ã™ +Did_not_find_single_slice_ = å˜ä¸€ã®ã‚¹ãƒ©ã‚¤ã‚¹ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ: {0} +Did_not_find_type_root_ = タイプã®ãƒ«ãƒ¼ãƒˆã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ: {0} +Differential_does_not_have_a_slice__b_of_____in_profile_ = プロファイル {5} ã®differantialã«ã¯ {6} ã®ã‚¹ãƒ©ã‚¤ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ ( {0} 上ã€ä½ç½® {1} ã® {2} / {3} / {4}) +Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = differential㯠''{0} (@ {1})'' を定義ã—ã¦ã„ã¾ã™ãŒã€baseã¯ãã†ã§ã¯ãªãã€å˜ä¸€ã®å›ºå®šã‚¿ã‚¤ãƒ—ã‚‚ã‚ã‚Šã¾ã›ã‚“。タイプ㯠{2} ã§ã™ã€‚ã“ã‚Œã¯ã¾ã å–り扱ã‚ã‚Œã¦ã„ã¾ã›ã‚“ +Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = discriminator ({0}) ã¯è¦ç´ ã®å­˜åœ¨ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€ã‚¹ãƒ©ã‚¤ã‚¹ {1} 㯠min>=1 ã‚‚ max=0 も設定ã—ã¦ã„ã¾ã›ã‚“ +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = discriminator ({1}) ã¯ã‚¿ã‚¤ãƒ—ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€{3} ã®ã‚¹ãƒ©ã‚¤ã‚¹ {2} ã«ã¯ {0} ã®ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã™: {4} +Discriminator__is_based_on_type_but_slice__in__has_no_types = discriminator ({0}) ã¯ã‚¿ã‚¤ãƒ—ã«åŸºã¥ã„ã¦ã„ã¾ã™ãŒã€{2} ã®ã‚¹ãƒ©ã‚¤ã‚¹ {1} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ +Display_Name_for__should_be_one_of__instead_of_one = {1}#{2} ã®èª¤ã£ãŸdisplay ''{4}'' - {3} ã§ã‚ã‚‹ã¹ãã§ã™ (言語 ''{5}'' ã®ãŸã‚) +Display_Name_for__should_be_one_of__instead_of_other = {1}#{2} ã®èª¤ã£ãŸdisplay ''{4}'' - {0} ã®é¸æŠžè‚¢ã®ã†ã¡ã®ä¸€ã¤ã§ã‚ã‚‹ã¹ãã§ã™: {3} (言語 ''{5}'' ã®ãŸã‚) +Does_not_match_slice_ = スライス ''{0}''ã¨ä¸€è‡´ã—ã¾ã›ã‚“ (discriminator: {1}) +Duplicate_Resource_ = é‡è¤‡ã—ãŸãƒªã‚½ãƒ¼ã‚¹ {0} ã®ã‚¿ã‚¤ãƒ— {3} (既存ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {2}, æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {1}) +ED_INVARIANT_DIFF_NO_SOURCE = differantialã§å®šç¾©ã•ã‚ŒãŸä¸å¤‰ {0} ã¯ã‚½ãƒ¼ã‚¹ã‚’æŒãŸãªã„ã‹ã€ã‚½ãƒ¼ã‚¹ã¯ãƒ—ロファイルã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +ED_INVARIANT_EXPRESSION_CONFLICT = 制約 ''{0}'' ã¯å¼ ''{1}'' ã‚’æŒã¡ã€ãã‚Œã¯ä»¥å‰ã«æä¾›ã•ã‚ŒãŸ ''{2}'' ã¨ç•°ãªã‚Šã¾ã™ (ä¸å¤‰ã¯ç¹°ã‚Šè¿”ã—å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“) +ED_INVARIANT_EXPRESSION_ERROR = 制約 ''{0}'' ã®å¼ ''{1}'' ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {2} +ED_INVARIANT_KEY_ALREADY_USED = 制約キー ''{0}'' ã¯æ—¢ã«åŸºæœ¬ãƒ—ロファイル ''{1}'' ã«å­˜åœ¨ã—ã¾ã™ +ED_INVARIANT_NO_EXPRESSION = 制約 ''{0}'' ã«ã¯è¨ˆç®—å¯èƒ½ãªå¼ãŒãªã„ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ã“れをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +ED_INVARIANT_NO_KEY = 制約ã«ã‚­ãƒ¼ãŒãªã„ãŸã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æ¤œè¨¼ã§ãã¾ã›ã‚“ +ED_PATH_WRONG_TYPE_MATCH = タイプリストãŒåˆ¶ç´„ã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‘ス㯠''{0}'' ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ ''{1}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +ELEMENT_CANNOT_BE_NULL = è¦ç´ ãŒ ''null'' ã§ã‚ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +ERROR_GENERATING_SNAPSHOT = snapshotã®ç”Ÿæˆã‚¨ãƒ©ãƒ¼: {0} (ã“ã‚Œã¯é€šå¸¸ã€differantialã«å•é¡ŒãŒã‚ã‚‹å ´åˆã«ç™ºç”Ÿã—ã¾ã™) +EXTENSION_CONTEXT_UNABLE_TO_CHECK_PROFILE = extension {0} ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} を指定ã—ã¾ã™ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ç¾æ™‚点ã§ã¯ãƒ—ロファイルãŒæœ‰åŠ¹ã‹ã©ã†ã‹ã‚’確èªã§ãã¾ã›ã‚“ +EXTENSION_CONTEXT_UNABLE_TO_FIND_PROFILE = extension {0} ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} を指定ã—ã¾ã™ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãã®ãƒ—ロファイルを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +EXTENSION_EXTM_CONTEXT_WRONG_XVER = FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ {3} ã®modifier extension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ [{2}; ã“ã‚Œã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒFHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å称変更ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã®è­¦å‘Šã§ã™) +EXTENSION_EXTP_CONTEXT_WRONG_XVER = FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ {3} ã®æ‹¡å¼µ {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ [{2}; ã“ã‚Œã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒFHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å称変更ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã®è­¦å‘Šã§ã™) +EXT_VER_URL_IGNORE = æ‹¡å¼µURLã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’無視ã—ã¦æ‹¡å¼µã‚’処ç†ã—ã¾ã—㟠+EXT_VER_URL_MISLEADING = æ‹¡å¼µURLã« ''|'' ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ãã®URLã®ã‚ˆã†ã«è¦‹ãˆã¾ã™ãŒã€ãã†ã§ã¯ãªãã€ã“ã‚Œã¯å®Ÿè£…者ã«ã¨ã£ã¦æ··ä¹±ã®å…ƒã§ã™ +EXT_VER_URL_NOT_ALLOWED = æ‹¡å¼µURLã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã¦ã¯ãªã‚Šã¾ã›ã‚“ +EXT_VER_URL_NO_MATCH = æ‹¡å¼µURLã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’æŒã£ã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«åŸºã¥ã解決を使用ã—ã¦ã‚‚ã“ã®URLを解決ã§ãã¾ã›ã‚“ã§ã—㟠+EXT_VER_URL_REVERSION = æ‹¡å¼µURLã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã¦ã¯ãªã‚Šã¾ã›ã‚“。拡張ã¯æ‹¡å¼µã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {0} ã«å¯¾ã—ã¦æ¤œè¨¼ã•ã‚Œã¾ã—㟠+Element_must_have_some_content = è¦ç´ ã«ã¯ä½•ã‚‰ã‹ã®å†…容ãŒå¿…è¦ã§ã™ +Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = {0}#{1} ã§ã®ã‚¨ãƒ©ãƒ¼: ターゲットプロファイル {2} ã¯åŸºæœ¬ ({3}) ã«å¯¾ã™ã‚‹æœ‰åŠ¹ãªåˆ¶ç´„ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Error_at_path__Slice_for_type__has_more_than_one_type_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: タイプ ''{1}'' ã®ã‚¹ãƒ©ã‚¤ã‚¹ã«ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ— ''{2}'' ãŒã‚ã‚Šã¾ã™ +Error_at_path__Slice_for_type__has_wrong_type_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: タイプ ''{1}'' ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— ''{2}'' ã‚’æŒã£ã¦ã„ã¾ã™ +Error_at_path__Slice_name_must_be__but_is_ = パス {0} ã®ã‚¨ãƒ©ãƒ¼: スライスå㯠''{1}'' ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ ''{2}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.count() > 1 +Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.path != ''$this'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.discriminator.type != ''type'' +Error_at_path__in__Type_slicing_with_slicingordered__true = パス {0} ã§ã® {1} ã®ã‚¨ãƒ©ãƒ¼: Type slicing with slicing.ordered = true +Error_expanding_ValueSet_running_without_terminology_services = ValueSetã®æ‹¡å¼µæ™‚ã«ã‚¨ãƒ©ãƒ¼: 用語サービス無ã—ã§å®Ÿè¡Œä¸­ +Error_generating_table_for_profile__ = プロファイル {0} ã®ãƒ†ãƒ¼ãƒ–ル生æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: {1} +Error_in_profile__at__Base_isSummary___derived_isSummary__ = プロファイル {0} ã® {1} ã§ã‚¨ãƒ©ãƒ¼: Base isSummary = {2}, derived isSummary = {3} +Error_parsing_ = {0} ã®è§£æžã‚¨ãƒ©ãƒ¼: {1} +Error_parsing_JSON_ = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: {0} +Error_parsing_JSON_the_primitive_value_must_be_a_boolean = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯çœŸå½å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Error_parsing_JSON_the_primitive_value_must_be_a_number = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯æ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Error_parsing_JSON_the_primitive_value_must_be_a_string = JSONã®è§£æžã‚¨ãƒ©ãƒ¼: プリミティブ値ã¯æ–‡å­—列ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Error_parsing_Turtle_ = Turtleã®è§£æžã‚¨ãƒ©ãƒ¼: {0} +Error_parsing_XHTML_ = XHTMLã®è§£æžã‚¨ãƒ©ãƒ¼: {0} +Error_reading__from_package__ = パッケージ {1}#{2} ã‹ã‚‰ {0} ã®èª­ã¿å–りエラー: {3} +Error_validating_code_running_without_terminology_services = !!コードã®æ¤œè¨¼ã‚¨ãƒ©ãƒ¼: 用語サービス無ã—ã§å®Ÿè¡Œä¸­ +Extension_EXTM_Context_Wrong = modifierExtension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ {2}) +Extension_EXTP_Context_Wrong = extension {0} ã¯ã“ã®æ™‚点ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ (許å¯ã•ã‚Œã¦ã„ã‚‹ã‚‚ã® = {1}; ã“ã®è¦ç´ ã¯ {2}) +Extension_EXT_Count_Mismatch = extensionã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“: 期待ã—ãŸã®ã¯ {0} 件ã§ã™ãŒã€ {1} 件見ã¤ã‘ã¾ã—㟠+Extension_EXT_Count_NotFound = extensionã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“: extensionを見ã¤ã‘られã¾ã›ã‚“: {0} +Extension_EXT_Fixed_Banned = 指定ã•ã‚ŒãŸå›ºå®šå€¤ã«extensionãŒå«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€extensionã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“ +Extension_EXT_Modifier_MismatchN = Extension modifierã®ä¸ä¸€è‡´: extensionè¦ç´ ã¯modifierã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã¾ã›ã‚“ãŒã€åŸºç¤Žã¨ãªã‚‹extensionã¯modifierã§ã™ +Extension_EXT_Modifier_MismatchY = Extension modifierã®ä¸ä¸€è‡´: extensionè¦ç´ ã¯modifierã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã¾ã™ãŒã€åŸºç¤Žã¨ãªã‚‹extensionã¯modifierã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Extension_EXT_Modifier_N = extension ''{0}'' ã¯extensionã¨ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ (ãã‚Œã¯modifierExtensionã§ã™) +Extension_EXT_Modifier_Y = extension ''{0}'' ã¯modifierExtensionã¨ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“ (ãã‚Œã¯é€šå¸¸ã®extensionã§ã™) +Extension_EXT_Simple_ABSENT = extension ''{0}'' ã®å®šç¾©ã¯å˜ç´”ãªextensionã®ãŸã‚ã€å€¤ã‚’å«ã¾ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Extension_EXT_Simple_WRONG = extension ''{0}'' ã®å®šç¾©ã¯å˜ç´”ãªextensionã®ãŸã‚ã€extensionã§ã¯ãªã値をå«ã¾ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Extension_EXT_SubExtension_Invalid = サブextensionã®url ''{0}'' ã¯extension {1} ã«ã‚ˆã£ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Extension_EXT_Type = extension ''{0}'' ã®å®šç¾©ã¯ã‚¿ã‚¤ãƒ— {1} を許å¯ã—ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {2} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Extension_EXT_URL_Absolute = Extension.urlã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Extension_EXT_Unknown = 未知ã®extension {0} +Extension_EXT_Unknown_NotHere = !!extension {0} ã¯æœªçŸ¥ã§ã‚ã‚Šã€ã“ã“ã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Extension_EXT_Url_NotFound = !!Extension.urlã¯å¿…é ˆã§ã™ +Extension_EXT_Version_Internal = extensionã®url ''{0}'' ã®è©•ä¾¡çŠ¶æ…‹ãŒç„¡åŠ¹ã§ã™ +Extension_EXT_Version_Invalid = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (無効ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ ''{1}'') +Extension_EXT_Version_InvalidId = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (無効ãªElement id ''{1}'') +Extension_EXT_Version_NoChange = extensionã®url ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (Element id ''{1}'' ã¯æœ‰åŠ¹ã§ã™ãŒã€é–¢é€£ã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§å¤‰æ›´ãŒãªã„ãŸã‚ã€ã‚¯ãƒ­ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ‘ラダイムã§ä½¿ç”¨ã§ãã¾ã›ã‚“) +Extension_PROF_Type = プロファイル ''{0}'' ã®å®šç¾©ã§ã¯ã€ã‚¿ã‚¤ãƒ— {1} を許å¯ã—ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {2} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+FHIRPATH_CANNOT_USE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ {0} を使用ã§ãã¾ã›ã‚“。ãªãœãªã‚‰ã€ {1} +FHIRPATH_CANT_COMPARE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: タイプ {0} 㨠{1} ã®å€¤ã‚’比較ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +FHIRPATH_CHECK_FAILED = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: ãƒã‚§ãƒƒã‚¯ {0} ãŒå¤±æ•—ã—ã¾ã—㟠+FHIRPATH_CODED_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€é †åºä»˜ã文字列ã€ã‚³ãƒ¼ãƒ‰ã€URIã€Codingã€CodeableConceptã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+FHIRPATH_COLLECTION_STATUS_OPERATION_LEFT = å·¦å´ã¯æœ¬è³ªçš„ã«ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã§ã‚ã‚‹ãŸã‚ã€è©•ä¾¡ã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã€å¼ ''{0}'' ãŒå¤±æ•—ã—ãŸã‚Šã€falseã‚’è¿”ã—ãŸã‚Šã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +FHIRPATH_COLLECTION_STATUS_OPERATION_RIGHT = å³å´ã¯æœ¬è³ªçš„ã«ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã§ã‚ã‚‹ãŸã‚ã€è©•ä¾¡ã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã€å¼ ''{0}'' ãŒå¤±æ•—ã—ãŸã‚Šã€falseã‚’è¿”ã—ãŸã‚Šã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +FHIRPATH_CONTINUOUS_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€decimalã¾ãŸã¯dateåž‹ã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+FHIRPATH_DECIMAL_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã€decimalã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+FHIRPATH_DISCRIMINATOR_BAD_NAME = discriminatorã§ç„¡åŠ¹ãªé–¢æ•°å {0}() +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = discriminatorã§ç„¡åŠ¹ãªå¼æ§‹æ–‡ (const) +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = discriminatorã§ç„¡åŠ¹ãªå¼æ§‹æ–‡ (グループ ''{0}'') +FHIRPATH_DISCRIMINATOR_CANT_FIND = 定義内ã§discriminatorを解決ã§ãã¾ã›ã‚“: プロファイル {1} ã®è¦ç´  {2} ã«å¯¾ã™ã‚‹{0}ã€ãƒ—ロファイル {3} を確èªä¸­ã« +FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = 定義内ã§discriminator {0} ã‚’ {2} 上ã§è¦‹ã¤ã‘ãŸãŒã€extension {1} ãŒãƒ—ロファイル {3} ã«è¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸãŸã‚解決ã§ãã¾ã›ã‚“ +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {1}: å­ãŒãªãã€{0} タイプã®ãƒ—ロファイル +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {1}: å­ãŒãªãã€{0} タイプ +FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = discriminatorã®ã‚¨ãƒ©ãƒ¼ {0}: 一ã¤ã®ã‚¹ãƒ©ã‚¤ã‚¹ã®å›ºå®šå€¤ã‚’解決ã™ã‚‹ä¸­ã§ã‚¹ãƒ©ã‚¤ã‚¹ã•ã‚ŒãŸè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+FHIRPATH_DISCRIMINATOR_NOTYPE = 識別å­ã®ã‚¨ãƒ©ãƒ¼ {0}: å­ãŒãªãã€ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ +FHIRPATH_DISCRIMINATOR_NO_CODE = discriminatorã§ã®ofType()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - タイプã«ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã¾ã›ã‚“ {0} +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {0} å¯èƒ½ãªã‚¿ã‚¤ãƒ—㌠{1} ã«è¤‡æ•°å­˜åœ¨ã—ã¾ã™ (一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„) +FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {0}ã®ã‚¿ã‚¤ãƒ—ã¯Reference {1}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - è¦ç´  {0} ã«ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ +FHIRPATH_DISCRIMINATOR_TYPE_NONE = discriminatorã§ã®ofType()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - è¦ç´  {0} ã«ã‚¿ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“ +FHIRPATH_FOCUS_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã®ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã¯1ã¤ã®å€¤ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ +FHIRPATH_HO_HOST_SERVICES = FHIRPathå¼ã‚’評価ã™ã‚‹éš›ã®å†…部エラー: ホストサービスãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ ({0}) +FHIRPATH_LEFT_VALUE_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã¸ã®å·¦ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯1ã¤ã®å€¤ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ +FHIRPATH_LEFT_VALUE_WRONG_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã¸ã®å·¦ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— {1} ã‚’æŒã£ã¦ã„ã¾ã™ +FHIRPATH_LOCATION = (at {0}) +FHIRPATH_NOT_IMPLEMENTED = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“ +FHIRPATH_NO_COLLECTION = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ã‚·ãƒ³ã‚°ãƒ«ãƒˆãƒ³å€¤ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠+FHIRPATH_NO_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã§ã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ +FHIRPATH_NUMERICAL_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯integer, decimal, Quantityã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠+FHIRPATH_OP_INCOMPATIBLE = FHIRPathå¼ {0} ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: å·¦ã¨å³ã®ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯äº’æ›æ€§ã®ãªã„ã¾ãŸã¯ç„¡åŠ¹ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}, {2}) +FHIRPATH_ORDERED_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ +FHIRPATH_PARAM_WRONG = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: å¼ã‚¿ã‚¤ãƒ— {0} ã¯é–¢æ•° {2} ã®ãƒ‘ラメータ {1} ã«å¯¾ã—ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ +FHIRPATH_PRIMITIVE_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯ãƒ—リミティブã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ +FHIRPATH_REFERENCE_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸæ–‡å­—列ã€URIã€canonicalã€Referenceã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠+FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = resolve()ã®ä½¿ç”¨ã«å•é¡Œ - {1}上ã®ãƒ—ロファイル{0}を解決ã§ãã¾ã›ã‚“ +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = discriminatorã§ã®resolve()ã®ä½¿ç”¨ãŒç„¡åŠ¹ - {1}ã«{0}ã®å¯èƒ½ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¿ã‚¤ãƒ—プロファイルãŒè¤‡æ•°å­˜åœ¨ã—ã¾ã™ (一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„) +FHIRPATH_RIGHT_VALUE_other = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {1}ã¸ã®å³ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯1ã¤ã®å€¤ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“ãŒã€{0}ã®å€¤ãŒã‚ã‚Šã¾ã™ +FHIRPATH_RIGHT_VALUE_WRONG_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: {0}ã¸ã®å³ã‚ªãƒšãƒ©ãƒ³ãƒ‰ã¯é–“é•ã£ãŸã‚¿ã‚¤ãƒ— {1} ã‚’æŒã£ã¦ã„ã¾ã™ +FHIRPATH_STRING_ORD_ONLY = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯é †åºä»˜ã‘ã•ã‚ŒãŸæ–‡å­—列ã€URIã€codeã€idã®ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠+FHIRPATH_STRING_SING_ONLY = !!FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 関数 {0} ã¯æ–‡å­—列ã€URIã€codeã€idã«å¯¾ã—ã¦ã®ã¿ä½¿ç”¨ã§ãã¾ã™ãŒã€{1} を見ã¤ã‘ã¾ã—㟠+FHIRPATH_UNABLE_BOOLEAN = booleanã¨ã—ã¦è©•ä¾¡ã§ãã¾ã›ã‚“: {0} +FHIRPATH_UNKNOWN_CONSTANT = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: 無効ãªFHIR定数 {0} +FHIRPATH_UNKNOWN_CONTEXT = FHIRPathå¼ã‚’評価ã™ã‚‹ä¸Šã§æœªçŸ¥ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ: {0} +FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = FHIRPathå¼ã‚’評価ã™ã‚‹ä¸Šã§æœªçŸ¥ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆè¦ç´ : {0} +FHIRPATH_UNKNOWN_NAME = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: åå‰ ''{0}'' ã¯å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ã„ãšã‚Œã«ã‚‚有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“: {1} +FHIRPATH_UNKNOWN_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: タイプ ''{0}'' 㯠{1}ã§æœªçŸ¥ã¾ãŸã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ +FHIRPATH_WRONG_PARAM_TYPE = FHIRPathå¼ã®è©•ä¾¡ã‚¨ãƒ©ãƒ¼: パラメータタイプ {2} 㯠{0} パラメータ {1} ã«å¯¾ã—ã¦åˆæ³•ã§ã¯ã‚ã‚Šã¾ã›ã‚“。{3}を期待ã—ã¾ã™ +Fixed_Type_Checks_DT_Address_Line = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®è¡Œè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠+Fixed_Type_Checks_DT_Name_Family = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®familyè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠+Fixed_Type_Checks_DT_Name_Given = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®givenè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠+Fixed_Type_Checks_DT_Name_Prefix = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®prefixè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠+Fixed_Type_Checks_DT_Name_Suffix = {0} を期待ã—ã¦ã„ã¾ã—ãŸãŒã€{1} ã®suffixè¦ç´ ã‚’見ã¤ã‘ã¾ã—㟠+Found__items_for__resolving_discriminator__from_ = {3}ã‹ã‚‰discriminator{2}を解決ã—ã¦{1}ã®ãŸã‚ã«{0}ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’見ã¤ã‘ã¾ã—㟠+ILLEGAL_COMMENT_TYPE = fhir_commentsプロパティã¯æ–‡å­—列ã®é…列ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„ +INV_FAILED = !!ルール {0} ãŒå¤±æ•—ã—ã¾ã—㟠+Illegal_path__in_differential_in__illegal_character_ = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': 無効ãªæ–‡å­— ''{2}'' +Illegal_path__in_differential_in__illegal_characters_ = {1}内ã®differentialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': 無効ãªæ–‡å­—列 [] +Illegal_path__in_differential_in__must_start_with_ = !!{1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': {2}.{3}ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': åå‰éƒ¨åˆ†ãŒ64文字を超ãˆã¦ã„ã¾ã™ +Illegal_path__in_differential_in__name_portion_mising_ = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': åå‰éƒ¨åˆ†ãŒã‚ã‚Šã¾ã›ã‚“ (''..'') +Illegal_path__in_differential_in__no_unicode_whitespace = {1}内ã®differantialã«ãŠã‘る無効ãªãƒ‘ス ''{0}'': unicodeã®ç©ºç™½ãŒã‚ã‚Šã¾ã›ã‚“ +Internal_INT_Bad_Type = 未処ç†ã®å›ºå®šå€¤ã‚¿ã‚¤ãƒ— {0} +Internal_error___type_not_known_ = 内部エラー - タイプãŒæœªçŸ¥ {0} +Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist = 無効ãªã‚¹ãƒ©ã‚¤ã‚¹: {0}ã§ä¸€ã¤ä»¥ä¸Šã®ã‚¿ã‚¤ãƒ—スライスãŒå­˜åœ¨ã—ã¾ã™ãŒã€ãã®ã†ã¡ã®ä¸€ã¤({1})ã¯min = 1ãªã®ã§ã€ä»–ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¯å­˜åœ¨ã§ãã¾ã›ã‚“ +JSON_COMMA_EXTRA = JSON内㮠{0} ã®æœ«å°¾ã«ä½™åˆ†ãªã‚«ãƒ³ãƒžãŒã‚ã‚Šã¾ã™ +JSON_COMMA_MISSING = JSONã«ã‚«ãƒ³ãƒžãŒè¶³ã‚Šã¾ã›ã‚“ +JSON_COMMENTS_NOT_ALLOWED = JSONã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +JSON_PROPERTY_NO_QUOTES = JSONプロパティ ''{0}'' ã®ãƒ—ロパティåã®å‘¨ã‚Šã«å¼•ç”¨ç¬¦ãŒã‚ã‚Šã¾ã›ã‚“ +JSON_PROPERTY_VALUE_NO_QUOTES = JSONプロパティ ''{0}'' ã®ãƒ—ロパティ値 ''{1}'' ã®å‘¨ã‚Šã«å¼•ç”¨ç¬¦ãŒã‚ã‚Šã¾ã›ã‚“ +LIQUID_SYNTAX_COLON = {0}ã®è©•ä¾¡ä¾‹å¤–: limitã®å¾Œã«':'ãŒç¶šãã¾ã›ã‚“ +LIQUID_SYNTAX_EXPECTING = スクリプト {0}: '{1}'を見ã¤ã‘ã¾ã—ãŸãŒã€è§£æžã‚µã‚¤ã‚¯ãƒ«ã§'{2}'を期待ã—ã¦ã„ã¾ã—㟠+LIQUID_SYNTAX_INCLUDE = スクリプト {0}: インクルードã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: {1} +LIQUID_SYNTAX_LOOP = スクリプト {0}: ループã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: {1} +LIQUID_SYNTAX_NOTERM = スクリプト {0}: 終了ã—ã¦ã„ãªã„Liquidステートメント {1} +LIQUID_SYNTAX_NUMBER = {0}ã®è©•ä¾¡ä¾‹å¤–: limitã®å¾Œã«æ•°å­—ãŒç¶šã„ã¦ã„ã¾ã›ã‚“ +LIQUID_SYNTAX_UNEXPECTED = {0}ã®è©•ä¾¡ä¾‹å¤–: {1}ã§äºˆæœŸã—ãªã„内容ãŒã‚ã‚Šã¾ã™ +LIQUID_SYNTAX_UNTERMINATED = スクリプト {0}: 解æžã‚µã‚¤ã‚¯ãƒ«ã§çµ‚了ã—ã¦ã„ãªã„文字列を見ã¤ã‘ã¾ã—㟠+LIQUID_UNKNOWN_FILTER = !!未知ã®Liquidフィルター '''{0}''' +LIQUID_UNKNOWN_FLOW_STMT = スクリプト {0}: 未知ã®ãƒ•ãƒ­ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆ ''{1}'' +LIQUID_UNKNOWN_NOEND = スクリプト {0}: {1}を探ã—ã¦ã„ã‚‹ã¨ãã«ã‚¹ã‚¯ãƒªãƒ—トã®çµ‚了を見ã¤ã‘ã¾ã—㟠+LIQUID_UNKNOWN_SYNTAX = Liquidステートメントã®è§£æžä¸­ã«äºˆæœŸã—ãªã„構文ãŒã‚ã‚Šã¾ã—㟠+LIQUID_VARIABLE_ALREADY_ASSIGNED = Liquid例外: 変数 ''{0}'' ã¯ã™ã§ã«å€¤ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ +LIQUID_VARIABLE_ILLEGAL = Liquid例外: 変数å ''{0}'' ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ +Language_XHTML_Lang_Different1 = リソースã¯language({0})ã‚’æŒã£ã¦ãŠã‚Šã€XHTMLã‚‚lang ({1})ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãれらã¯ç•°ãªã‚Šã¾ã™ +Language_XHTML_Lang_Different2 = リソースã¯language({0})ã‚’æŒã£ã¦ãŠã‚Šã€XHTMLã‚‚xml:lang ({1})ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãれらã¯ç•°ãªã‚Šã¾ã™ +Language_XHTML_Lang_Missing1 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯langã‚¿ã‚°ã¾ãŸã¯xml:langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (両方ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing2 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (langã¨xml:langã®ä¸¡æ–¹ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +Language_XHTML_Lang_Missing3 = リソースã«ã¯languageãŒã‚ã‚Šã¾ã™ãŒã€XHTMLã«ã¯xml:langã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ (langã¨xml:langã®ä¸¡æ–¹ãŒå¿…è¦ - å‚ç…§ https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +MULTIPLE_LOGICAL_MODELS_other = æä¾›ã•ã‚ŒãŸãƒ—ロファイル㫠{0} 個ã®è«–ç†ãƒ¢ãƒ‡ãƒ«ãŒè¦‹ã¤ã‹ã£ãŸãŸã‚ã€è«–ç†ãƒ¢ãƒ‡ãƒ«ã‚’解æžã§ãã¾ã›ã‚“(一ã¤ã ã‘ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{1}個見ã¤ã‹ã‚Šã¾ã—ãŸï¼‰ +NO_VALID_DISPLAY_FOUND_one = 言語 {4} 㧠{1}#{2} ã®æœ‰åŠ¹ãªdisplayãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +NO_VALID_DISPLAY_FOUND_other = 言語 {4} 㧠{1}#{2} ã®æœ‰åŠ¹ãªdisplayãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Named_items_are_out_of_order_in_the_slice = スライス内ã®åå‰ä»˜ãé …ç›®ãŒé †åºã‚’æŒã£ã¦ã„ã¾ã›ã‚“ +No_ExpansionProfile_provided = ExpansionProfileãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +No_Expansion_Parameters_provided = Expansion ParametersãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +No_Parameters_provided_to_expandVS = expandVSã«ParametersãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +No_path_on_element_Definition__in_ = {1}ã®element Definition {0}ã«ãƒ‘スãŒã‚ã‚Šã¾ã›ã‚“ +No_path_on_element_in_differential_in_ = {0}ã§ã®differentialã®è¦ç´ ã«ãƒ‘スãŒã‚ã‚Šã¾ã›ã‚“ +No_path_value_on_element_in_differential_in_ = {0}ã§ã®differentialã®è¦ç´ ã«ãƒ‘スã®å€¤ãŒã‚ã‚Šã¾ã›ã‚“ +No_processing_instructions_allowed_in_resources = リソースã«ã¯å‡¦ç†æŒ‡ç¤ºã‚’許å¯ã—ã¦ã„ã¾ã›ã‚“ +No_reference_resolving_discriminator__from_ = {1}ã«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ {0}を解決ã™ã‚‹å‚ç…§ãŒã‚ã‚Šã¾ã›ã‚“ +No_type_found_on_ = ''{0}''ã«åž‹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +No_validator_configured = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ +Node_type__is_not_allowed = ノードタイプ {0} ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +None_of_the_provided_codes_are_in_the_value_set_one = æä¾›ã•ã‚ŒãŸcode {2} ã¯ã€ValueSet ''{1}''ã«ã‚ã‚Šã¾ã›ã‚“ +None_of_the_provided_codes_are_in_the_value_set_other = æä¾›ã•ã‚ŒãŸcode [{2}] ã®ã†ã¡ã©ã‚Œã‚‚ã€ValueSet ''{1}''ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ +Not_done_yet = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ +Not_done_yet_ValidatorHostServicescheckFunction = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.checkFunction) +Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = アイテムãŒè¦ç´ ã§ãªã„å ´åˆã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.conformsToProfile) +Not_done_yet_ValidatorHostServicesexecuteFunction = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ (ValidatorHostServices.executeFunction) +Not_done_yet__resolve__locally_2 = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“ - {0} をローカルã§è§£æ±ºã—ã¾ã™ (2) +Not_handled_yet_sortElements_ = ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ (sortElements: {0}:{1}) +OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = ã“ã®ã‚ªãƒ–ジェクトã¯ã€å®šç¾©å†…ã®å­ä¾›ãŒ2ã¤ã§ãªã„ãŸã‚ã€Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(å­ä¾› = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸå€¤ãƒ—ロパティã¯é¸æŠžè‚¢ã§ã€ã“ã‚Œã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“(値プロパティ = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸå€¤ãƒ—ロパティã¯ãƒªã‚¹ãƒˆã§ã€ã“ã‚Œã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“(値プロパティ = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©ã¯æœ€åˆã®å­è¦ç´ ã‚’キーã¨ã—ã¦åå‰ä»˜ã‘ã—ã¦ã„ã¾ã›ã‚“(å­ä¾› = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = ã“ã®ã‚ªãƒ–ジェクトã¯Jsonã§ã‚­ãƒ¼ä»˜ãé…列ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€å®šç¾©å†…ã§åå‰ä»˜ã‘ã•ã‚ŒãŸã‚­ãƒ¼ãƒ—ロパティã¯ãƒ—リミティブ型ã§ã¯ã‚ã‚Šã¾ã›ã‚“(å­ä¾› = {0}ã€ã‚¿ã‚¤ãƒ— = {1}) +Object_must_have_some_content = オブジェクトã«ã¯ä½•ã‚‰ã‹ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå¿…è¦ã§ã™ +PACKAGE_VERSION_MISMATCH = パッケージ {0} ã§ã®FHIRãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´: ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ {2} ã§ã™ãŒ {1} ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ (パス: {3}) +PATTERN_CHECK_STRING = プロファイル {1} ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン [{0}] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {2} +PRIMITIVE_MUSTHAVEVALUE_MESSAGE = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€ã“ã®è¦ç´ ã«å€¤ãŒå­˜åœ¨ã™ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€å€¤ãŒå­˜åœ¨ã—ãªã„å ´åˆã€extension ''{2}'' ãŒå­˜åœ¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = プロファイル ''{1}'' ã®è¦ç´ å®šç¾© {0} ã§ã¯ã€å€¤ãŒå­˜åœ¨ã—ãªã„å ´åˆã€extension ''{2}'' ã®ã„ãšã‚Œã‹ãŒå­˜åœ¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Parser_Type__not_supported = Parser Type {0} ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ +Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = プロファイル {0} パス {1} ã®è¦ç´ ã«å¯¾ã™ã‚‹ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°è¡¨ç¾ã®è©•ä¾¡ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—㟠(fhirPath = {2}): {3} +Problem_processing_expression__in_profile__path__ = プロファイル ''{1}'' ã®ãƒ‘ス ''{2}'' ã§ã®å¼ ''{0}'' ã®å‡¦ç†ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ: {3} +Profile_EXT_Not_Here = extension {0} ã¯ã€ã“ã®ç‚¹ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯è¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“(コンテキストä¸å¤‰ ''{1}'' ã«åŸºã¥ã„ã¦ï¼‰ +Profile_VAL_MissingElement = è¦ç´  ''{0}'' ãŒæ¬ è½ã—ã¦ã„ã¾ã™ - プロファイル {1} ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå›ºå®šå€¤ã«ã‚ˆã‚Šå¿…è¦ã¨ã•ã‚Œã¾ã™ +Profile_VAL_NotAllowed = è¦ç´  {0} ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ—ロファイルã§æŒ‡å®šã•ã‚ŒãŸé©ç”¨å¯èƒ½ãª {1} ã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Profile___Error_generating_snapshot = プロファイル {0} ({1}). snapshot生æˆã‚¨ãƒ©ãƒ¼ +Profile___base__could_not_be_resolved = プロファイル {0} ({1}) ã®ãƒ™ãƒ¼ã‚¹ {2} を解決ã§ãã¾ã›ã‚“ã§ã—㟠+Profile___element__Error_generating_snapshot_ = プロファイル {0} ({1})ã€è¦ç´  {2}. snapshot生æˆã‚¨ãƒ©ãƒ¼: {3} +Profile___has_no_base_and_no_snapshot = プロファイル {0} ({1}) ã¯ãƒ™ãƒ¼ã‚¹ã‚‚snapshotã‚‚ã‚ã‚Šã¾ã›ã‚“ +Profile__does_not_match_for__because_of_the_following_profile_issues__ = プロファイル {0} ã¯ä»¥ä¸‹ã®å•é¡Œã®ãŸã‚ {1} ã¨ä¸€è‡´ã—ã¾ã›ã‚“: {2} +Profile_based_discriminators_must_have_a_type__in_profile_ = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ã‚¿ã‚¤ãƒ—ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ—ロファイル {1} ã® {0}) +Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ãƒ—ロファイルをæŒã¤ã‚¿ã‚¤ãƒ—ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆãƒ—ロファイル {1} ã® {0}) +Profile_based_discriminators_must_have_only_one_type__in_profile_other = プロファイルベースã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒŸãƒãƒ¼ã‚¿ã¯ä¸€ã¤ã®ã‚¿ã‚¤ãƒ—ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“(プロファイル {2} ã® {1})ã§ã™ãŒã€{0} ã®ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = !!æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ {1} ã¯Questionnaireã®ã‚ªãƒ—ションValueSet({2})ã§æ¤œè¨¼ã§ãã¾ã›ã‚“。システム {0} ã¯æœªçŸ¥ã§ã™ +QUESTIONNAIRE_Q_DERIVATION_TYPE_IGNORED = 派生タイプ ''{0}'' ã¯ã€ã“ã®Questionnaireã«å¯¾ã—ã¦æ´¾ç”Ÿãƒã‚§ãƒƒã‚¯ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ +QUESTIONNAIRE_Q_DERIVATION_TYPE_UNKNOWN = 派生タイプ ''{0}'' ã¯æœªçŸ¥ã§ã€ã“ã‚Œã¯ã“ã®Questionnaireã«å¯¾ã—ã¦æ´¾ç”Ÿãƒã‚§ãƒƒã‚¯ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯answerOptionsã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚‚åŒæ§˜ã«æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS_NEW = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã“ã®answerOptionã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ãã‚Œã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_DEFINITION = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã‚Œã¯ã“ã“ã§ã‚‚ç¹°ã‚Šè¿”ã•ã‚Œã‚‹ã¹ãã§ã™ +QUESTIONNAIRE_Q_ITEM_DERIVED_MAXLENGTH = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚‚ã¾ãŸæœ€å¤§é•·ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_ANSWER_TYPE = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯answer{2}ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯answer{3}ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯æœ‰åŠ¹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ï¼ˆã¾ã ï¼Ÿï¼‰ãれを確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_DEFINITION = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å®šç¾© ''{2}'' ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ã“れを変更ã™ã‚‹ã¤ã‚‚ã‚Šã§ã™ã‹ï¼Ÿ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_MAXLENGTH = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯maxLength ''{2}'' ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€æœ€å¤§é•·ã¯ãれを超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REPEATS = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ç¹°ã‚Šè¿”ã—ã¾ã›ã‚“ã®ã§ã€ã“ã“ã§ã‚‚ç¹°ã‚Šè¿”ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REQUIRED = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å¿…é ˆãªã®ã§ã€ã“ã“ã§ã‚‚å¿…é ˆã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_TYPE = Questionnaire ''{0}'' ã§è¦‹ã¤ã‹ã£ãŸlinkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚¿ã‚¤ãƒ— ''{2}'' ã‚’æŒã¡ã€ã“れを ''{3}'' ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_DERIVED_NI_ANSWER_VS = ãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ï¼ˆã¾ã ï¼Ÿï¼‰æ´¾ç”Ÿã‚¢ã‚¤ãƒ†ãƒ ValueSetã®æ•´åˆæ€§ã‚’確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +QUESTIONNAIRE_Q_ITEM_NOT_DERIVED = Questionnaire ''{0}'' ã§linkId ''{1}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE = Questionnaire ''{0}'' 㯠''http://hl7.org/fhir/StructureDefinition/questionnaire-derivationType'' 拡張を使用ã—ã¦æ´¾ç”Ÿã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ´¾ç”ŸãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE_VALUE = 派生extensionã«ã¯å€¤ãŒã‚ã‚Šã¾ã›ã‚“ +QUESTIONNAIRE_Q_UNKNOWN_DERIVATION = 派生ã«å‚ç…§ã•ã‚Œã‚‹Questionnaire ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+Questionnaire_QR_Item_BadOption = !!æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ {1}(システム {0})ã¯Questionnaireã®ã‚ªãƒ—ションValueSet({2})ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“: {3} +Questionnaire_QR_Item_Coding = エラー {0} ã¯Questionnaireオプションã«å¯¾ã™ã‚‹Codingを検証ã—ã¾ã™ +Questionnaire_QR_Item_CodingNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€Codingオプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_DateNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ—¥ä»˜ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_Display = DISPLAYタイプ以外ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ - linkId {0} +Questionnaire_QR_Item_Group = グループタイプã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å›žç­”ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_GroupAnswer = グループタイプ以外ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã€å›žç­”ã®å¤–å´ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“(.itemã§ã¯ãªãanswer.itemを使用ã—ã¾ã™ï¼‰ +Questionnaire_QR_Item_IntNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€integerã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_Missing = 必須アイテム ''{0}'' ã«å¯¾ã™ã‚‹å›žç­”ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoCoding = コード {0}::{1} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoDate = 日付 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoInteger = æ•´æ•° {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoLinkId = LinkIdãŒãªã„ãŸã‚ã€æ¤œè¨¼ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptions = オプションãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã‚ªãƒ—ションを検証ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptionsCoding = オプションリストã«ã¯codingåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptionsDate = オプションリストã«ã¯dateåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptionsInteger = オプションリストã«ã¯integeråž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptionsString = オプションリストã«ã¯stringåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoOptionsTime = オプションリストã«ã¯timeåž‹ã®ã‚ªãƒ—ション値ãŒã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoString = 文字列 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoTime = 時間 {0} ã¯æœ‰åŠ¹ãªã‚ªãƒ—ションã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_NoType = アイテム {0} ã®å®šç¾©ã«ã¯ã‚¿ã‚¤ãƒ—ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ +Questionnaire_QR_Item_NotEnabled = アイテムãŒæœ‰åŠ¹ã§ãªã„ã«ã‚‚ã‹ã‹ã‚らãšå›žç­”(2)をæŒã£ã¦ã„ã¾ã™ {0} +Questionnaire_QR_Item_NotEnabled2 = アイテムãŒæœ‰åŠ¹ã§ãªã„ã«ã‚‚ã‹ã‹ã‚らãšå›žç­”ã‚’æŒã£ã¦ã„ã¾ã™ï¼ˆitem id = ''{0}'') +Questionnaire_QR_Item_NotFound = Questionnaireã§LinkId ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_OnlyOneA = ã“ã®LinkIdã‚’æŒã¤å›žç­”アイテムã¯1ã¤ã ã‘許å¯ã•ã‚Œã¾ã™ +Questionnaire_QR_Item_OnlyOneI_one = LinkId {1} ã‚’æŒã¤å›žç­”アイテムã¯1ã¤ã ã‘許å¯ã•ã‚Œã¾ã™ - {0} 個ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Questionnaire_QR_Item_Order = 構造的エラー:アイテムã®é †åºãŒä¸é©åˆ‡ã§ã™ +Questionnaire_QR_Item_StringNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€stringåž‹ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_Text = テキストãŒå­˜åœ¨ã™ã‚‹å ´åˆã€ãã‚Œã¯LinkId {0} ã®Questionnaire定義ã¨ä¸€è‡´ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_TimeNoOptions = オプションリストãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ™‚é–“åž‹ã®å›žç­”オプションを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_QR_Item_WrongType_one = 回答値㯠{1}åž‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Questionnaire_QR_Item_WrongType_other = 回答値㯠{0} åž‹ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ ({1}) +Questionnaire_QR_Q_None = QuestionnaireãŒç‰¹å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒ™ãƒ¼ã‚¹Questionnaireã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯è¡Œãˆã¾ã›ã‚“ +Questionnaire_QR_Q_NotFound = Questionnaire ''{0}'' を解決ã§ããªã„ãŸã‚ã€ãƒ™ãƒ¼ã‚¹Questionnaireã«å¯¾ã™ã‚‹æ¤œè¨¼ã¯è¡Œãˆã¾ã›ã‚“ +Questionnaire_Q_EnableWhen_After = ã“ã®enableWhenルール ({0}) ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯ã€è³ªå•è‡ªä½“ã®å¾Œã«æ¥ã¾ã™ +Questionnaire_Q_EnableWhen_IsInner = enableWhenã‚’æŒã¤è³ªå•ã¯ã€ãã®enableWhenæ¡ä»¶ã«ã¤ã„ã¦å†…部質å•ã‚’å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Questionnaire_Q_EnableWhen_NoLink = enableWhenã‚’æŒã¤è³ªå•ã¯ã€è³ªå•ãƒªãƒ³ã‚¯ã«å€¤ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ +Questionnaire_Q_EnableWhen_NoTarget = enableWhenã«ã¦ ''{1}'' ã®å‚ç…§ãŒã‚ã‚‹linkId ''{0}'' ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Questionnaire_Q_EnableWhen_Self = ã“ã®è³ªå•ã®enableWhenã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯è‡ªèº«ã‚’å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +REFERENCE_REF_QUERY_INVALID = æ¡ä»¶ä»˜ãå‚ç…§ã®ã‚¯ã‚¨ãƒªéƒ¨åˆ†ã¯æœ‰åŠ¹ãªã‚¯ã‚¨ãƒªæ–‡å­—列ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +REFERENCE_REF_SUSPICIOUS = å‚ç…§ ''{0}'' ã®æ–‡æ³•ãŒä¸æ­£ç¢ºã«è¦‹ãˆã¾ã™ã€ç¢ºèªã—ã¦ãã ã•ã„ +REFERENCE_REF_WRONGTARGET_LOAD = タイプ ''{2}'' ã¯è¦ç´  {0} ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({1} ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) +RESOURCETYPE_PROPERTY_WRONG_TYPE = JSONè¦ç´  ''resourceType'' ã¯é–“é•ã£ãŸJSONタイプをæŒã£ã¦ã„ã¾ã™: {0} +Reference_REF_Aggregation = å‚照㯠{0} ã§ã‚ã‚Šã€å‚ç…§ã«å¯¾ã—ã¦æŒ‡å®šã•ã‚ŒãŸé›†ç´„モード({1})ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ +Reference_REF_BadTargetType = 無効ãªãƒªã‚½ãƒ¼ã‚¹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¿ã‚¤ãƒ—。{0} を見ã¤ã‘ã¾ã—ãŸãŒã€ ({1}) ã®ã„ãšã‚Œã‹ã‚’期待ã—ã¦ã„ã¾ã—㟠+Reference_REF_BadTargetType2 = å‚ç…§URL {1} ã«ã‚ˆã£ã¦ç¤ºã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ— ''{0}'' ã¯ã€ã“ã®è¦ç´ ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({2} ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) +Reference_REF_CantMatchChoice = é¸æŠžè‚¢ {1} ã®ä¸­ã‹ã‚‰profile {0} ã®ãƒžãƒƒãƒã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Reference_REF_CantMatchType = é¸æŠžè‚¢ {1} ã®ä¸­ã‹ã‚‰profile {0}(タイプ別)ã®ãƒžãƒƒãƒã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Reference_REF_CantResolve = å‚ç…§ ''{0}'' ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解決ã§ãã¾ã›ã‚“ +Reference_REF_CantResolveProfile = profileå‚ç…§ ''{0}'' を解決ã§ãã¾ã›ã‚“ +Reference_REF_Format1 = 相対URLã¯[ResourceName]/[id]ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ã¾ãŸã¯æ¤œç´¢URL([type]?parameters)ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚ {0} ã«é­é‡ã—ã¾ã—㟠+Reference_REF_Format2 = 相対URLã¯[ResourceName]/[id]ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。 {0} ã«é­é‡ã—ã¾ã—㟠+Reference_REF_MultipleMatches = é¸æŠžè‚¢ {1} ã®ä¸­ã§ {0} ã«å¯¾ã™ã‚‹è¤‡æ•°ã®profileãŒãƒžãƒƒãƒã—ã¾ã—㟠+Reference_REF_NoDisplay = 実際ã®referenceã¾ãŸã¯identifierãŒãªã„referenceã¯displayã‚’æŒã¤ã¹ãã§ã™ +Reference_REF_NoType = Bundleã¾ãŸ+D130ã¯containedå‚ç…§ãŒãƒãƒ³ãƒ‰ãƒ«/リソース {0} 内ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Reference_REF_NotFound_Bundle = Bundle/containedリソースã«å¯¾ã™ã‚‹å‚ç…§ãŒãƒãƒ³ãƒ‰ãƒ«/リソース {0} 内ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Reference_REF_ResourceType = reference {0} ãŒresourceType {1}ã«ãƒžãƒƒãƒã—ã¦ã„ã¾ã™ +Reference_REF_WrongTarget = タイプ ''{0}'' ã¯ã“ã®è¦ç´ ã®æœ‰åŠ¹ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“({1} ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) +Reference__refers_to_a__not_a_ValueSet = å‚ç…§ {0} ã¯ValueSetã§ã¯ãªãã€{1} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ +Resource_RES_ID_Malformed_Chars = 無効ãªãƒªã‚½ãƒ¼ã‚¹ID:無効ãªæ–‡å­— (''{0}'') +Resource_RES_ID_Malformed_Length = 無効ãªãƒªã‚½ãƒ¼ã‚¹ID:長ã™ãŽã¾ã™ ({0} 文字) +Resource_RES_ID_Missing = リソースã«ã¯idãŒå¿…è¦ã§ã™ãŒã€å­˜åœ¨ã—ã¾ã›ã‚“ +Resource_RES_ID_Prohibited = リソースã«ã¯idãŒã‚ã‚Šã¾ã™ãŒã€è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Resource_resolution_services_not_provided = リソース解決サービスãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Resource_type_mismatch_for___ = リソースタイプã®ä¸ä¸€è‡´ {0} / {1} +SD_CONSTRAINED_KIND_NO_MATCH = 種類 {0} ã¯åŸºæœ¬æ§‹é€  {3} ã®ç¨®é¡ž {1} ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(基本タイプ = {2}) +SD_CONSTRAINED_TYPE_NO_MATCH = タイプ {0} ã¯ã€åˆ¶ç´„対象ã®åŸºæœ¬æ§‹é€  {1} ã®ã‚¿ã‚¤ãƒ—ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = !!extensionタイプを確èªã—ã¦ãã ã•ã„:extensionã¯ãれらãŒæœ¬å½“ã«ã©ã“ã§ã‚‚使用ã§ãã‚‹ã“ã¨ã‚’æ„図ã—ãŸã‚‚ã®ã§ã¯ãªã„é™ã‚Šã€ {0} ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’æŒã¤ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SD_DERIVATION_KIND_MISMATCH = 構造定義㯠{0} ã®ç¨®é¡žã‚’制約ã—ã¦ã„ã¾ã™ãŒã€ç•°ãªã‚‹ç¨®é¡ž ({1}) ã‚’æŒã£ã¦ã„ã¾ã™ +SD_ED_BIND_MULTIPLE_TYPES = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã¡ã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°å¯¾è±¡ã®è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—ãŒå­˜åœ¨ã—ã¾ã™ ({1})。ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ã™ã¹ã¦ã®ã‚¿ã‚¤ãƒ—ã«é©ç”¨ã•ã‚Œã¾ã™ +SD_ED_BIND_NOT_VS = è¦ç´  {0} ã«ãŠã‘ã‚‹valueSetå‚ç…§ {1} ã¯ã€value setã§ã¯ãªã„何ã‹ï¼ˆ{2})を指ã—ã¦ã„ã¾ã™ +SD_ED_BIND_NO_BINDABLE = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ãƒã‚¤ãƒ³ãƒ‰å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã¯å­˜åœ¨ã—ã¾ã›ã‚“ {1} +SD_ED_BIND_UNKNOWN_VS = è¦ç´  {0} ã«ãŠã‘ã‚‹valueSetå‚ç…§ {1} ã¯è§£æ±ºã§ãã¾ã›ã‚“ã§ã—㟠+SD_ED_SHOULD_BIND = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒå¿…è¦ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}) ãŒã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯å­˜åœ¨ã—ã¾ã›ã‚“ +SD_ED_SHOULD_BIND_WITH_VS = è¦ç´  {0} ã¯ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒå¿…è¦ãªã‚¿ã‚¤ãƒ—ã‚’æŒã£ã¦ã„ã¾ã™ ({1}) ãŒã€ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã¯value setãŒã‚ã‚Šã¾ã›ã‚“ +SD_ED_TYPE_NO_TARGET_PROFILE = タイプ {0} ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ—ロファイルを許å¯ã—ã¦ã„ã¾ã›ã‚“ +SD_ED_TYPE_PROFILE_IS_MODIFIER = プロファイル {0} ã¯modifier extensionã®ãŸã‚ã®ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ {3} è¦ç´ ã¯extensionã§ã™ +SD_ED_TYPE_PROFILE_NOTYPE = プロファイル {0} を見ã¤ã‘ã¾ã—ãŸãŒã€ãã‚ŒãŒé©ç”¨ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ—を特定ã§ãã¾ã›ã‚“ +SD_ED_TYPE_PROFILE_NOT_MODIFIER = プロファイル {0} ã¯modifier extensionã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ {3} è¦ç´ ã¯modifierã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SD_ED_TYPE_PROFILE_UNKNOWN = !!!!!!!!!!!!!!!!プロファイル {0} を解決ã§ãã¾ã›ã‚“ +SD_ED_TYPE_PROFILE_WRONG = プロファイル {0} ã¯ã‚¿ã‚¤ãƒ— {1} ã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ {3} è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {2} ã§ã™ +SD_ED_TYPE_PROFILE_WRONG_TARGET = プロファイル {0} ã¯ã‚¿ã‚¤ãƒ— {1} ã®ãŸã‚ã®ã‚‚ã®ã§ã€ã“れ㯠{4} ã§ã¯ã‚ã‚Šã¾ã›ã‚“(ã“ã‚Œã¯å¿…è¦ã§ã™ã€ãªãœãªã‚‰ {3} è¦ç´ ã¯ã‚¿ã‚¤ãƒ— {2} ã ã‹ã‚‰ã§ã™ï¼‰ +SD_ED_TYPE_PROFILE_WRONG_TYPE_one = type {0} ã¯ãƒ—ロファイル {2} ã§è¨±å¯ã•ã‚ŒãŸtypeã®ãƒªã‚¹ãƒˆ {1} ã«ã‚ã‚Šã¾ã›ã‚“ +SD_ED_TYPE_PROFILE_WRONG_TYPE_other = type {0} ã¯ãƒ—ロファイル {2} ã§è¨±å¯ã•ã‚ŒãŸtypeã®ãƒªã‚¹ãƒˆ {1} ã«ã‚ã‚Šã¾ã›ã‚“ +SD_ELEMENT_NOT_IN_CONSTRAINT = {1} ã®è¦ç´ å®šç¾©ã«ã¯ã€ãƒ—ロファイルã§ã¯è¨±ã•ã‚Œãªã„プロパティ {0} ãŒã‚ã‚Šã¾ã™ SD_EXTENSION_URL_MISMATCH = extension URLã®å›ºå®šå€¤{1}ã¯canonical URL {0}ã¨ä¸€è‡´ã—ã¾ã›ã‚“ SD_EXTENSION_URL_MISSING = Extension.urlã®å€¤ãŒextension URL {0}ã«å›ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“ -SG_DEPRECATED = Reference to deprecated item {0} -SG_WITHDRAWN = Reference to withdrawn item {0} -SG_RETIRED = Reference to retired item {0} -SG_EXPERIMENTAL = Reference to experimental item {0} -SG_DRAFT = Reference to draft item {0} -SG_DEPRECATED_SRC = Reference to deprecated item {0} from {1} -SG_WITHDRAWN_SRC = Reference to withdrawn item {0} from {1} -SG_RETIRED_SRC = Reference to retired item {0} from {1} -SG_EXPERIMENTAL_SRC = Reference to experimental item {0} from {1} -SG_DRAFT_SRC = Reference to draft item {0} from {1} -STATUS_CODE_WARNING = The code is valid but is {0} +SD_ILLEGAL_CHARACTERISTICS = ã“ã®è¦ç´ ã¯ {0} ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ— {1} ã¯ã“ã®ç¨®é¡žã®åˆ¶ç´„を関連性ã‚ã‚‹ã‚‚ã®ã«ã—ã¾ã›ã‚“ +SD_MUST_HAVE_DERIVATION = StructureDefinition {0} ã¯ã€baseDefinitionã‚’æŒã£ã¦ã„ã‚‹ã®ã§ã€derivationã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ +SD_NESTED_MUST_SUPPORT_DIFF = è¦ç´  {0} ã¯ã€must supportã¨ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸtypes/profiles/targetsã‚’æŒã£ã¦ã„ã¾ã™ãŒã€è¦ç´ è‡ªä½“ã¯must-supportã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。内部ã®must-supportsã¯ã€è¦ç´ ãŒmust-support = trueを継承ã—ãªã„é™ã‚Šã€ç„¡è¦–ã•ã‚Œã¾ã™ +SD_NESTED_MUST_SUPPORT_SNAPSHOT = è¦ç´  {0} ã¯ã€must supportã¨ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸtypes/profiles/targetsã‚’æŒã£ã¦ã„ã¾ã™ãŒã€è¦ç´ è‡ªä½“ã¯must-supportã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = タイプ㯠{0} ãªã®ã§ã€extensionã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆä¸å¤‰æ€§ã‚’指定ã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SD_NO_CONTEXT_WHEN_NOT_EXTENSION = タイプ㯠{0} ãªã®ã§ã€extensionã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’指定ã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SD_NO_SLICING_ON_ROOT = プロファイルã®ãƒ«ãƒ¼ãƒˆã§ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +SD_NO_TYPES_OR_CONTENTREF = è¦ç´  {0} ã¯å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚¿ã‚¤ãƒ—ãŒãªãã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„å‚照もã‚ã‚Šã¾ã›ã‚“ +SD_NO_TYPE_CODE_ON_CODE = {1} è¦ç´  {0} ã®snapshotã«ã¯å€¤ã®ãªã„type.codeãŒã‚ã‚Šã¾ã™ +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_BASE = プロファイル ''{0}'' ã¯äºˆæœŸã•ã‚ŒãŸ ''{2}'' ã§ã¯ãªãã€ç•°ãªã‚‹ãƒ™ãƒ¼ã‚¹''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_TYPE = プロファイル ''{0}'' ã¯obligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +SD_OBGLIGATION_INHERITS_PROFILE_NO_TARGET = ã“ã®extensionã‹ã‚‰å€¤ã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +SD_OBGLIGATION_INHERITS_PROFILE_TARGET_NOT_FOUND = プロファイル ''{0}'' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+SD_OBGLIGATION_PROFILE_DERIVATION = ä»–ã®ãƒ—ロファイルを制約ã™ã‚‹ãƒ—ロファイルã ã‘ãŒobligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ +SD_OBGLIGATION_PROFILE_ILLEGAL = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„プロパティ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ +SD_OBGLIGATION_PROFILE_ILLEGAL_BINDING = è¦ç´  ''{0}'' ã¯ã€åŸºæœ¬è¦ç´ ãŒæŒãŸãªã„ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’æŒã£ã¦ã„ã¦ã€ã“ã‚Œã¯obligationプロファイルã§ã¯è¨±ã•ã‚Œã¦ã„ãªã„ +SD_OBGLIGATION_PROFILE_ILLEGAL_ON_BINDING = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒ—ロパティ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ +SD_OBGLIGATION_PROFILE_INVALID_BINDING_CODE = è¦ç´  ''{0}'' ã¯ã€obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„追加ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ç›®çš„ ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ +SD_OBGLIGATION_PROFILE_INVALID_BINDING_STRENGTH = è¦ç´  ''{0}'' ã¯ã€åŸºæœ¬ (''{2}'') ã¨ã¯ç•°ãªã‚‹ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°å¼·åº¦ (''{1}'') ã‚’æŒã£ã¦ã„ã¦ã€ã“ã‚Œã¯obligationプロファイルã§ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +SD_OBGLIGATION_PROFILE_PATH_WRONG = !!è¦ç´  ''{0}'' ã®ãƒ‘ス値 ''{1}'' ã¯ã€åŸºæœ¬ãƒ‘ス ''{2}'' ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +SD_OBGLIGATION_PROFILE_UKNOWN = !!プロファイルã¯obligationプロファイルã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ãŒã€åŸºæœ¬ãƒ—ロファイル ''{0}'' ãŒä¸æ˜ŽãªãŸã‚ã€ãã®æ­£ç¢ºã•ã‚’確èªã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +SD_OBGLIGATION_PROFILE_UNMATCHED = è¦ç´  ''{0}'' ã¯ã€ã“ã®obligationプロファイルãŒåŸºã¥ã„ã¦ã„るプロファイル ''{1}'' ã«åŒç­‰ã®ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“ +SD_PATH_TYPE_MISMATCH = パス {1} ã¯ã€æ§‹é€  {0} ã®ã‚¿ã‚¤ãƒ—ã§å§‹ã¾ã‚‰ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +SD_SPECIALIZED_TYPE_MATCHES = タイプ {0} ã¯ã€ç‰¹æ®ŠåŒ–ã•ã‚Œã¦ã„る基本構造 {1} ã®ã‚¿ã‚¤ãƒ—ã¨åŒã˜ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“ +SD_TYPE_MISSING = タイプãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +SD_TYPE_NOT_DERIVED = タイプ {0} ã¯ã€ã‚¿ã‚¤ãƒ—ã®åŸºæœ¬å®šç¾©ã‚’制約ã™ã‚‹ã¨ãã«ã®ã¿ã‚¿ã‚¤ãƒ—ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ +SD_TYPE_NOT_LOCAL = タイプ {0} ã¯ã€FHIR仕様ã§å®šç¾©ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€åˆæ³•çš„ã§ã¯ã‚ã‚Šã¾ã›ã‚“。他ã®ã‚¿ã‚¤ãƒ—ã«ã¯åå‰ç©ºé–“ãŒå¿…è¦ã§ã™ +SD_TYPE_NOT_LOGICAL = !!タイプ {0} ã¯ã€ç¨®é¡žãŒ 'logical' ã§ãªã„ {1} ã®å ´åˆã«ã®ã¿å®šç¾©ã§ãã¾ã™ +SD_TYPE_NOT_MATCH_NS = タイプã®åå‰ç©ºé–“ {0} ã¯ã€ã‚¿ã‚¤ãƒ—ã®å®šç¾©ã®ãŸã‚ã®urlåå‰ç©ºé–“ {1} ã¨ä¸€è‡´ã™ã¹ãã§ã™ +SD_VALUE_COMPLEX_FIXED = 複åˆã‚¿ã‚¤ãƒ— {0} ã®å ´åˆã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’éŽå‰°ã«åˆ¶ç´„ã™ã‚‹ã“ã¨ã‚’é¿ã‘ã‚‹ãŸã‚ã«ã€å›ºå®šå€¤ã§ã¯ãªãパターンを使用ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„ +SD_VALUE_TYPE_IILEGAL = è¦ç´  {0} ã¯ã€è¨±å¯ã•ã‚ŒãŸã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆ ({3}) ã«ãªã„タイプ {2} ã® {1} ã‚’æŒã£ã¦ã„ã¾ã™ +SD_VALUE_TYPE_REPEAT_HINT = ç¹°ã‚Šè¿”ã—è¦ç´ ã«ã¯ {1} ãŒã‚ã‚Šã¾ã™ã€‚ {1} ã¯ã™ã¹ã¦ã®ç¹°ã‚Šè¿”ã—ã«é©ç”¨ã•ã‚Œã¾ã™ï¼ˆã“ã‚Œã¯ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯æ˜Žç¢ºã§ãªã„) +SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = ç¹°ã‚Šè¿”ã—è¦ç´ ã«ã¯ãƒ—リミティブ型㮠{1} 値ãŒã‚ã‚Šã¾ã™ã€‚DotNetãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ã“れをã™ã¹ã¦ã®ç¹°ã‚Šè¿”ã—ã«é©ç”¨ã—ãªã„ - ã“ã‚Œã¯ã‚¨ãƒ©ãƒ¼ã§ã™ +SEARCHPARAMETER_BASE_WRONG = リソースタイプ {1} ã¯ã€ã“ã‚ŒãŒæ´¾ç”Ÿã—ã¦ã„ã‚‹SearchParameter ({0}) ã®ãƒ™ãƒ¼ã‚¹ã¨ã—ã¦ãƒªã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ +SEARCHPARAMETER_EXP_WRONG = å¼ ''{2}'' ã¯ã€æ´¾ç”Ÿå…ƒã®SearchParameter {0} ã®å¼ ''{1}'' ã¨äº’æ›æ€§ãŒãªãã€ã“ã‚Œã¯æ´¾ç”Ÿé–¢ä¿‚ãŒæœ‰åŠ¹ã§ãªã„ã“ã¨ã‚’示ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +SEARCHPARAMETER_NOTFOUND = ベースã®Search Parameter {0} を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ããªã„ãŸã‚ã€ã“ã®SearchParameterãŒãã‚Œã‹ã‚‰é©åˆ‡ã«æ´¾ç”Ÿã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +SEARCHPARAMETER_TYPE_WRONG = タイプ {1} ã¯ã€æ´¾ç”Ÿå…ƒã®SearchParameter内ã®ã‚¿ã‚¤ãƒ— {0} ã¨ç•°ãªã‚Šã¾ã™ +SECURITY_STRING_CONTENT_ERROR = 文字列値ã«ã¯ã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šè¨±å¯ã•ã‚Œã¦ã„ãªã„HTMLã‚¿ã‚°ãŒå«ã¾ã‚Œã¦ã„るよã†ã«è¦‹ãˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒå«ã¾ã‚Œã¦ã„ã¾ã™ +SECURITY_STRING_CONTENT_WARNING = 文字列値ã«ã¯ã€HTMLã‚¿ã‚°ãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„るよã†ã«è¦‹ãˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®å†…容ãŒé©åˆ‡ãªãƒã‚¹ãƒˆãƒ—ロセッシングãªã—ã«HTMLã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹ã¨ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒªã‚¹ã‚¯ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +SLICING_CANNOT_BE_EVALUATED = スライシングã¯è©•ä¾¡ã§ãã¾ã›ã‚“:{0} +SM_DEPENDENT_PARAM_MODE_MISMATCH = パラメータ {0} ã¯å¤‰æ•° {1} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ãã®ãƒ¢ãƒ¼ãƒ‰ã¯ {2} ã§ã‚ã‚Šã€ã“ã‚Œã¯ã‚°ãƒ«ãƒ¼ãƒ— {3} ã§å¿…è¦ã¨ã•ã‚Œã‚‹ãƒ¢ãƒ¼ãƒ‰ã¨åŒã˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SM_DEPENDENT_PARAM_NOT_FOUND = {1} パラメータ ''{0}'' ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+SM_DEPENDENT_PARAM_TYPE_MISMATCH = パラメータ ''{0}'' ã¯å¤‰æ•° ''{1}'' ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ãã®ã‚¿ã‚¤ãƒ—㯠''{2}'' ã§ã‚ã‚Šã€ã“ã‚Œã¯ã‚°ãƒ«ãƒ¼ãƒ— ''{3}'' ã§å¿…è¦ã¨ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ—ã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。必è¦ãªã‚¿ã‚¤ãƒ—㯠''{4}'' (マップ ''{5}'' ã‹ã‚‰ï¼‰ +SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = グループ {0} ã¯ã™ã§ã«ç•°ãªã‚‹ãƒ‘ラメータã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã‚¿ã‚¤ãƒ—ã®ãƒã‚§ãƒƒã‚¯ãŒæ­£ã—ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ (ä»– = [{1}]ï¼›ã“ã‚Œ = [{2}]) +SM_GROUP_INPUT_DUPLICATE = åå‰ {0} ã¯ã™ã§ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ +SM_GROUP_INPUT_MODE_INVALID = グループパラメータ {0} モード {1} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SM_GROUP_INPUT_MODE_MISMATCH = タイプ ''{0}'' ã¯mode ''{1}'' ã‚’æŒã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯structure definitionã®mode ''{2}'' ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +SM_GROUP_INPUT_NO_TYPE = グループ {1} パラメータ {0} ã«ã¯ã‚¿ã‚¤ãƒ—ãŒãªã„ãŸã‚ã€ãƒ‘スを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +SM_GROUP_INPUT_TYPE_NOT_DECLARED = タイプ {0} ã¯å®£è¨€ã•ã‚Œã¦ãŠã‚‰ãšã€æœªçŸ¥ã§ã™ +SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = canonical URL {1} ã«ãƒžãƒƒãƒ—ã™ã‚‹ã‚¿ã‚¤ãƒ— {0} ã¯æœªçŸ¥ã§ã™ã€‚パスを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = タイプ {0} ã¯æœªçŸ¥ãªã®ã§ã€ãƒ‘スを検証ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +SM_GROUP_NAME_DUPLICATE = グループå ''{0}'' ã¯ã™ã§ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ +SM_IMPORT_NOT_FOUND = {0} ã«ä¸€è‡´ã™ã‚‹ãƒžãƒƒãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- 検証ãŒé–“é•ã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +SM_LIST_RULE_ID_ONLY_WHEN_SHARE = ruleIdã¯ã€listMode㌠''share'' ã®å ´åˆã«ã®ã¿æä¾›ã•ã‚Œã‚‹ã¹ãã§ã™ +SM_MATCHING_RULEGROUP_NOT_FOUND = ソース={0} ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ={1} ã®ã‚¿ã‚¤ãƒ—ペアã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ«ãƒ¼ãƒ«ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +SM_NAME_INVALID = åå‰ {0} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SM_NO_LIST_MODE_NEEDED = listModeã¯ã€ä¸€åº¦ã ã‘実行ã§ãるルールã§ã‚ã‚‹ãŸã‚ã€æä¾›ã•ã‚Œã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SM_NO_LIST_RULE_ID_NEEDED = listRuleIdã¯ã€ä¸€åº¦ã ã‘実行ã§ãるルールã§ã‚ã‚‹ãŸã‚ã€æä¾›ã•ã‚Œã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +SM_ORPHAN_GROUP = グループ {0} ã¯ã“ã®ãƒžãƒƒãƒ”ングスクリプト内ã‹ã‚‰æ­£å¸¸ã«å‘¼ã³å‡ºã•ã‚Œã¦ãŠã‚‰ãšã€ãã‚Œã®å…¥åŠ›ã«ã‚¿ã‚¤ãƒ—ãŒãªã„ãŸã‚ã€ã‚¿ã‚¤ãƒ—ã®ç¢ºèªã¯ã§ãã¾ã›ã‚“ +SM_RULEGROUP_NOT_FOUND = グループ {0} を解決ã§ãã¾ã›ã‚“ã§ã—㟠+SM_RULEGROUP_PARAM_COUNT_MISMATCH = グループ {0} 㯠{1} 個ã®ãƒ‘ラメータを使ã£ã¦å‘¼ã³å‡ºã•ã‚Œã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã«ã¯ {2} 個をå–ã‚Šã¾ã™ +SM_RULE_SOURCE_MAX_REDUNDANT = 最大値 {0} ã¯å†—é•·ã§ã™ã€ãªãœãªã‚‰æœ‰åŠ¹ãªæœ€å¤§å€¤ã¯ {0} ã ã‹ã‚‰ã§ã™ +SM_RULE_SOURCE_MIN_REDUNDANT = 最å°å€¤ {0} ã¯å†—é•·ã§ã™ã€ãªãœãªã‚‰æœ‰åŠ¹ãªæœ€å°å€¤ã¯ {0} ã ã‹ã‚‰ã§ã™ +SM_RULE_SOURCE_UNASSIGNED = ソースステートメントã¯ã‚½ãƒ¼ã‚¹ã«å¤‰æ•°ã‚’割り当ã¦ã¾ã›ã‚“ - ã“ã‚ŒãŒæ„図ã—ãŸã‚‚ã®ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„ +SM_SOURCE_CONTEXT_UNKNOWN = ソースコンテキスト {0} ã¯ã“ã®æ™‚点ã§ã¯æœªçŸ¥ã§ã™ +SM_SOURCE_PATH_INVALID = ソースパス {0}.{1} ã¯æœªçŸ¥ã®ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ +SM_SOURCE_TYPE_INVALID = タイプ {0} ã¯ã‚½ãƒ¼ã‚¹ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ {1} ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。å¯èƒ½ãªã‚¿ã‚¤ãƒ—㯠[{2}] ã§ã™ +SM_SOURCE_TYPE_NOT_FOUND = ソースタイプãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã®ã§ã€ã“ã®æš—示的ãªä¾å­˜ãƒ«ãƒ¼ãƒ«ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を決定ã§ãã¾ã›ã‚“ã§ã—㟠+SM_TARGET_CONTEXT_UNKNOWN = ターゲットコンテキスト ''{0}'' ã¯ã“ã®æ™‚点ã§ã¯æœªçŸ¥ã§ã™ +SM_TARGET_NO_TRANSFORM_NO_CHECKED = transformãŒãªã„å ´åˆã€ãƒ‘ラメータã¯æä¾›ã§ãã¾ã›ã‚“ +SM_TARGET_PATH_INVALID = ターゲットパス {0}.{1} ã¯æœªçŸ¥ã®ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ +SM_TARGET_PATH_MULTIPLE_MATCHES = ターゲットパス {0}.{1} ã¯ãƒ‘ス {2} ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯è¤‡æ•°ã®è¦ç´  ({3}) ã‚’å‚ç…§ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“れ以上ã®ãƒã‚§ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“ +SM_TARGET_TRANSFORM_EXPRESSION_ERROR = 評価パラメータã¨ã—ã¦æ¸¡ã•ã‚ŒãŸFHIRPathå¼ãŒç„¡åŠ¹ã§ã™ï¼š{0} +SM_TARGET_TRANSFORM_MISSING_PARAMS = translateæ“作ã®1ã¤ä»¥ä¸Šã®ãƒ‘ラメータãŒæ¬ è½ã—ã¦ã„ã¾ã™ï¼ˆ3ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€{0}ã§ã—ãŸï¼‰ +SM_TARGET_TRANSFORM_NOT_CHECKED = transform {0} ã¯ã¾ã ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +SM_TARGET_TRANSFORM_OP_INVALID_TYPE = {1}変数{0}ã®ã‚¿ã‚¤ãƒ—{2}ãŒç„¡åŠ¹ã§ã™ - プリミティブã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = 変æ›{0}ã«ã¯{2}ã®{1}変数ãŒã‚ã‚Šã¾ã›ã‚“ +SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = transform {0}ã¯{1}〜{2}ã®ãƒ‘ラメータをå–ã‚Šã¾ã™ãŒã€{3}ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = transform {0}ã¯{1}個ã®ãƒ‘ラメータをå–ã‚Šã¾ã™ãŒã€{2}ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = インデックス{0}ã®ãƒ‘ラメータを処ç†ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆã‚¿ã‚¤ãƒ—= {1}) +SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = 出力パラメータã®å€¤''{0}''ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ +SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = map_uri ''{0}''ãŒè§£æ±ºã§ããªã‹ã£ãŸãŸã‚ã€ãƒžãƒƒãƒ—ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = {0}パラメータã®å€¤ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = ソース変数{0}ã¯ä¸æ˜Žã§ã™ +SM_TARGET_TRANSFORM_TYPE_UNKNOWN = タイプ''{0}''ã¯æœªçŸ¥ã§ã™ +SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = {0}ã®ã‚¿ã‚¤ãƒ—パラメータã®å€¤ã‚’処ç†ã§ãã¾ã›ã‚“ã§ã—㟠+SM_TARGET_TRANSLATE_BINDING_SOURCE = ソース変数ã«å¿…è¦ãªãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = ソースValueSetã«ã¯ã€ãƒžãƒƒãƒ—ãŒç¿»è¨³ã—ãªã„1ã¤ä»¥ä¸Šã®ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ï¼š{0} +SM_TARGET_TRANSLATE_BINDING_TARGET = ターゲット変数ã«å¿…è¦ãªãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = マップãŒç”Ÿæˆã™ã‚‹1ã¤ä»¥ä¸Šã®ã‚³ãƒ¼ãƒ‰ãŒã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆValueSetã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:{0} +SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = ソースValueSetã®å±•é–‹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š''{0}'' +SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = ターゲットValueSetã®å±•é–‹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š''{0}'' +SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = ソース変数ãŒä¸æ˜ŽãªValueSet''{0}''ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +SM_TARGET_TRANSLATE_BINDING_VS_TARGET = ターゲット変数ãŒä¸æ˜ŽãªValueSet''{0}''ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚³ãƒ³ã‚»ãƒ—トマップをãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +SM_TARGET_TYPE_MULTIPLE_POSSIBLE = ã“ã“ã§ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—ãŒå¯èƒ½ã§ã™ï¼ˆ{0})。ã—ãŸãŒã£ã¦ã€ã•ã‚‰ãªã‚‹ã‚¿ã‚¤ãƒ—ãƒã‚§ãƒƒã‚¯ã¯ä¸å¯èƒ½ã§ã™ +SM_TARGET_TYPE_NOT_FOUND = ターゲットタイプãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸãŸã‚ã€ã“ã®æš—é»™ã®ä¾å­˜ãƒ«ãƒ¼ãƒ«ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を決定ã§ãã¾ã›ã‚“ã§ã—㟠+SNAPSHOT_EXISTING_PROBLEM = 生æˆã•ã‚ŒãŸsnapshotã«ã¯ã€å…ƒã®æä¾›ã•ã‚ŒãŸsnapshot{0}ã¨è¦ç´ æ•°ãŒç•°ãªã‚Šã¾ã™{1} +SNAPSHOT_IS_EMPTY = !!!!プロファイル''{0}''ã®snapshotãŒç©ºã§ã™ï¼ˆã“ã‚Œã¯èµ·ã“ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“) STATUS_CODE_HINT = The code is {0} -STATUS_CODE_WARNING_CODE = The code ''{1}'' is valid but is {0} STATUS_CODE_HINT_CODE = The code ''{1}'' is {0} -SD_ED_TYPE_PROFILE_WRONG_TYPE_one = type {0} ã¯ãƒ—ロファイル {2} ã§è¨±å¯ã•ã‚ŒãŸtypeã®ãƒªã‚¹ãƒˆ {1} ã«ã‚ã‚Šã¾ã›ã‚“ -SD_ED_TYPE_PROFILE_WRONG_TYPE_other = type {0} ã¯ãƒ—ロファイル {2} ã§è¨±å¯ã•ã‚ŒãŸtypeã®ãƒªã‚¹ãƒˆ {1} ã«ã‚ã‚Šã¾ã›ã‚“ -SG_DEPENDS_ON_DEPRECATED = The {0} {1} is deprecated -SG_DEPENDS_ON_WITHDRAWN = The {0} {1} is withdrawn -SG_DEPENDS_ON_RETIRED = The {0} {1} is retired -SG_DEPENDS_ON_EXPERIMENTAL = The {0} {1} is an experimental resource -SG_DEPENDS_ON_DRAFT = The {0} {1} is a draft resource -SG_DEPENDS_ON_EXTENSION = extension -SG_DEPENDS_ON_PROFILE = profile +STATUS_CODE_WARNING = The code is valid but is {0} +STATUS_CODE_WARNING_CODE = The code ''{1}'' is valid but is {0} +Same_id_on_multiple_elements__in_ = {3} ã®ä¸­ã§åŒã˜id ''{0}'' ã‚’æŒã¤è¤‡æ•°ã®è¦ç´  {1}/{2} ãŒã‚ã‚Šã¾ã™ +Slice_encountered_midway_through_set_path___id___ = セットã®é€”中ã§ã‚¹ãƒ©ã‚¤ã‚¹ãŒå‡ºç¾ã—ã¾ã—㟠(path = {0}, id = {1})ï¼›{2} +Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - discriminator @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___order___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - order @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = differential ({0}) 上ã®ã‚¹ãƒ©ã‚¤ã‚·ãƒ³ã‚°ãƒ«ãƒ¼ãƒ«ã¯ã€ãƒ™ãƒ¼ã‚¹ ({1}) 上ã®ãã‚Œã¨ä¸€è‡´ã—ã¾ã›ã‚“ - rule @ {2} ({3}) +StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} at {1}: タイプ {2} 㯠{4}ã®ã‚¿ã‚¤ãƒ— {3} ã¨ã—ã¦ä¸æ­£ã§ã™ +TERMINOLOGY_TX_NOSVC_BOUND_EXT = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ãŒæ‹¡å¼µå¯èƒ½ãªValueSet {0}ã‹ã‚‰ã§ã‚ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚用語サービスãŒãªã„ãŸã‚ã§ã™ +TERMINOLOGY_TX_NOSVC_BOUND_REQ = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ãªValueSet {0}ã‹ã‚‰ã§ã‚ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚用語サービスãŒãªã„ãŸã‚ã§ã™ +TERMINOLOGY_TX_SYSTEM_HTTPS = システムURL ''{0}''ãŒèª¤ã£ã¦https:ã§å§‹ã¾ã£ã¦ã„ã¾ã™ã€‚http:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +TERMINOLOGY_TX_SYSTEM_NOT_USABLE = !!URIãŒ''{0}''ã®CodeSystemã®å®šç¾©ã«ã¯codeãŒæä¾›ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€codeを検証ã§ãã¾ã›ã‚“ +TERMINOLOGY_TX_SYSTEM_NO_CODE = !!systemãŒæä¾›ã•ã‚Œã¦ã„ãªã„コードã¯å®šç¾©ã•ã‚ŒãŸæ„味ãŒã‚ã‚Šã¾ã›ã‚“。systemã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = コードシステムå‚ç…§{0}ãŒé–“é•ã£ã¦ã„ã¾ã™ - コードシステムå‚ç…§ã¯build.fhir.orgã¸ã®å‚ç…§ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ­£ã—ã„å‚ç…§ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼š{1} +TERMINOLOGY_TX_SYSTEM_WRONG_HTML = コードシステムå‚ç…§{0}ãŒé–“é•ã£ã¦ã„ã¾ã™ - コードシステムå‚ç…§ã¯HTMLページã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã“ã‚ŒãŒæ­£ã—ã„å‚ç…§ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ï¼š{1} +TX_SERVER_NO_BATCH_RESPONSE = サーãƒãƒ¼ã¯ãƒãƒƒãƒæ¤œè¨¼ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‹ã‚‰nullã‚’è¿”ã—ã¾ã—㟠+TYPE_CHECKS_FIXED_CC = !!!!!!!!!!!!!!!!!!プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€ãŠã‚ˆã³display ''{2}'']ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} +TYPE_CHECKS_FIXED_CC_US = !!!!!!!!!!!!!!!!!!プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€display ''{2}''ãŠã‚ˆã³userSelected {5}]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} +TYPE_CHECKS_PATTERN_CC = !!!!!!!!!!!!!!!!!!プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€ãŠã‚ˆã³display ''{2}'']ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} +TYPE_CHECKS_PATTERN_CC_US = !!!!!!!!!!!!!!!!!!プロファイル{3}ã§å®šç¾©ã•ã‚ŒãŸãƒ‘ターン[system {0}ã€code {1}ã€display ''{2}''ãŠã‚ˆã³userSelected {5}]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å•é¡Œ: {4} +TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = フラグメントå‚ç…§ã§ãªã„å ´åˆã€Canonical URLã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“({0}) +TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = å«ã¾ã‚Œã‚‹ãƒªã‚½ãƒ¼ã‚¹ã®Canonical URLã¯ã€å­˜åœ¨ã™ã‚‹å ´åˆã¯çµ¶å¯¾URLã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“({0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = 添付ファイルã«ã¯ãƒ‡ãƒ¼ã‚¿ãŠã‚ˆã³/ã¾ãŸã¯URLãŒã‚ã‚Šã€ã¾ãŸã¯contentTypeãŠã‚ˆã³/ã¾ãŸã¯languageã®ã„ãšã‚Œã‹ãŒã‚ã‚‹ã¹ãã§ã™ +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“(url = {0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = 指定ã•ã‚ŒãŸæ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{0}ã¯ã€å®Ÿéš›ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{1}ã¨ä¸€è‡´ã—ã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = 指定ã•ã‚ŒãŸæ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º{0}ã¯ç„¡åŠ¹ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = 添付ファイルã®ã‚µã‚¤ã‚ºã¯{0}ãƒã‚¤ãƒˆã§ã€æŒ‡å®šã•ã‚ŒãŸåˆ¶é™ã®{1}ãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ãŒ{0}ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ–¹æ³•ã‚’ç†è§£ã—ã¦ã„ãªã„ãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = {0}ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã‚’確èªã§ãã¾ã›ã‚“: {1} +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64エンコードã•ã‚ŒãŸå€¤ã«ã¯ã€ç©ºç™½ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(RFC 4648ã«ã‚ˆã‚‹ï¼‰ã€‚ãŸã ã—ã€éžæ¤œè¨¼ãƒªãƒ¼ãƒ€ãƒ¼ã¯ã€ç©ºç™½ã‚’å—ã‘入れるã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64エンコードã•ã‚ŒãŸå€¤ã¯ã€ç©ºç™½ã‚’å«ã‚ãªã„よã†ã«ã™ã‚‹ã¹ãã§ã™ï¼ˆRFC 4648ã«ã‚ˆã‚‹ï¼‰ã€‚ãŸã ã—ã€éžæ¤œè¨¼ãƒªãƒ¼ãƒ€ãƒ¼ã¯ã€ç©ºç™½ã‚’å—ã‘入れるã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64サイズã¯{0}ãƒã‚¤ãƒˆã§ã€æŒ‡å®šã•ã‚ŒãŸåˆ¶é™ã®{1}ãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' ã¯è§£æ±ºã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ­ãƒ¼ãƒ‰ã§ããªã„ãŸã‚ã€ãã®å¦¥å½“性をãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' ã¯èª¤ã£ãŸã‚¿ã‚¤ãƒ—ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ã€‚見ã¤ã‹ã£ãŸã‚‚ã® {1} 予期ã—ã¦ã„ã‚‹ã‚‚ã® {2} +TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = {0} ã®å°æ•°ç‚¹ä»¥ä¸‹ã®æ¡æ•°ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã“ã‚Œã¯ã€{1} æ¡ã®ä¸Šé™ã‚’超ãˆã¦ã„ã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = identifier.system ㌠''urn:ietf:rfc:3986'' ã®å ´åˆã€identifier.value ã¯å®Œå…¨ãªURIã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(例ãˆã°ã‚¹ã‚­ãƒ¼ãƒ ã‹ã‚‰å§‹ã¾ã‚‹ï¼‰ã€''{0}'' ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = markdownã«ã¯ã€''{0}'' ã§å§‹ã¾ã‚‹çµ„ã¿è¾¼ã¿HTMLã‚¿ã‚°ã®ã‚ˆã†ãªå†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯è¡¨ç¤ºå±¤ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã•ã‚Œã‚‹ï¼ˆã¾ãŸã¯ã•ã‚Œã‚‹ã¹ã(SHOULD)ã§ã™ï¼‰ã€‚ã“ã®æŒ¯ã‚‹èˆžã„ãŒæœ›ã¾ã—ã„ã‚‚ã®ã‹ã©ã†ã‹ã‚’確èªã™ã‚‹ãŸã‚ã«ã€å†…容をãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = タイプ {1} ã«å¯¾ã™ã‚‹æ­£è¦è¡¨ç¾ ''{0}'' を評価中ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼š{2} +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = プロファイルã®maxValueã«ã¯code {0}ãŒã‚ã‚Šã€å€¤{1}ã®codeã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = プロファイルã®maxValueã«codeãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = UCUM定義ã«åŸºã¥ã„ã¦å€¤{0}ã‚’å˜ä½{1}ã‹ã‚‰maxValueå˜ä½{2}ã«å¤‰æ›ã§ããªã„ãŸã‚ã€æœ€å¤§å€¤ã¯ç„¡åŠ¹ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = プロファイルã®maxValueã«systemãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = プロファイルã®maxValueã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = UCUMサービスãŒãªãã€UCUMコードãŒåŒä¸€ã§ãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = プロファイルã®maxValueã®systemãŒ{0}ã§ã€å€¤{1}ã®systemã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = 値ã«codeãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = 値ã«systemãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = æ•°é‡ã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å¤§å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = インスタンスã®å€¤({2})ã¯æŒ‡å®šã•ã‚ŒãŸæœ€å¤§å€¤({3})より大ãã„ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = UCUM変æ›å¾Œã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å€¤({0} {1})ã¯æŒ‡å®šã•ã‚ŒãŸmaxValue({2} {3})より大ãã„ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = プロファイルã®minValueã«ã¯code {0}ãŒã‚ã‚Šã€å€¤{1}ã®codeã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = プロファイルã®minValueã«codeãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = UCUM定義ã«åŸºã¥ã„ã¦å€¤{0}ã‚’å˜ä½{1}ã‹ã‚‰minValueå˜ä½{2}ã«å¤‰æ›ã§ããªã„ãŸã‚ã€æœ€å°å€¤ã¯ç„¡åŠ¹ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = プロファイルã®minValueã«systemãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = プロファイルã®minValueã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = UCUMサービスãŒãªãã€UCUMコードãŒåŒä¸€ã§ãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = プロファイルã®minValueã®systemãŒ{0}ã§ã€å€¤{1}ã®systemã¨ç•°ãªã‚‹ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = 値ã«codeãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = 値ã«systemãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = æ•°é‡ã«å®Ÿéš›ã®å€¤ãŒãªã„ãŸã‚ã€æœ€å°å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = インスタンスã®å€¤({2})ã¯æŒ‡å®šã•ã‚ŒãŸæœ€å°å€¤({3})よりå°ã•ã„ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = UCUM変æ›å¾Œã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å€¤({0} {1})ã¯æŒ‡å®šã•ã‚ŒãŸminValue({2} {3})よりå°ã•ã„ã§ã™ +TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã®Example URLã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ ({0}) +TYPE_SPECIFIER_ABSTRACT_TYPE = Type specifier {1} ã¯æŠ½è±¡åž‹ {0} を指定ã—ã¾ã—㟠+TYPE_SPECIFIER_ILLEGAL_TYPE = Type specifier {1} ã¯ç„¡åŠ¹ãªåž‹ {0} を指定ã—ã¾ã—㟠+TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Type specifierã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã¯ãªãã€åŸºåº•åž‹ {0} ã¯æŠ½è±¡çš„ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Type specifierã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã¯ãªãã€åŸºåº•åž‹ {0} ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Terminology_PassThrough_TX_Message = !!{0} for ''{1}#{2}'' +Terminology_TX_Binding_CantCheck = URIå‚ç…§ã«ã‚ˆã‚‹ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +Terminology_TX_Binding_Missing = CodeableConcept {0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ +Terminology_TX_Binding_Missing2 = Coding {0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒã‚ã‚Šã¾ã›ã‚“ +Terminology_TX_Binding_NoServer = 用語サーãƒãƒ¼ãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ[{0}])を検証ã§ãã¾ã›ã‚“ã§ã—㟠+Terminology_TX_Binding_NoSource = パス{0}ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã¯ã‚½ãƒ¼ã‚¹ãŒãªã„ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +Terminology_TX_Binding_NoSource2 = ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã«ã‚½ãƒ¼ã‚¹ãŒãªã„ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ +Terminology_TX_Code_ValueSet = コードãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。ValueSet {0} ã®ã‚³ãƒ¼ãƒ‰ãŒå¿…é ˆã§ã™ +Terminology_TX_Code_ValueSetMax = コードãŒæä¾›ã•ã‚Œã¦ãŠã‚‰ãšã€ValueSet{0}ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆæœ€å¤§ValueSet{1}) +Terminology_TX_Code_ValueSet_Ext = コードãŒæä¾›ã•ã‚Œã¦ãŠã‚‰ãšã€ValueSet{0}ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Terminology_TX_Code_ValueSet_MISSING = コードãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。ValueSetã®ã‚³ãƒ¼ãƒ‰ãŒå¿…é ˆã§ã™ +Terminology_TX_Coding_Count = {0}ãŒæœŸå¾…ã•ã‚Œã¦ã„ã¾ã—ãŸãŒã€{1}ã®codingè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Terminology_TX_Confirm_1_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…é ˆã§ã™ï¼ˆã‚¯ãƒ©ã‚¹= {1}) +Terminology_TX_Confirm_2_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)(クラス= {1}) +Terminology_TX_Confirm_3_CC = æä¾›ã•ã‚ŒãŸcodingãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codingãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¹= {1}) +Terminology_TX_Confirm_4a = !!æä¾›ã•ã‚ŒãŸcode({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼š{1} +Terminology_TX_Confirm_5 = !!!!æä¾›ã•ã‚ŒãŸcodeãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“) +Terminology_TX_Confirm_6 = !!!!æä¾›ã•ã‚ŒãŸcodeãŒValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ +Terminology_TX_Display_Wrong = displayã¯''{0}''ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Terminology_TX_Error_CodeableConcept = CodeableConceptã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} +Terminology_TX_Error_CodeableConcept_Max = maxValueSetを使用ã—ã¦CodeableConceptを検証ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} +Terminology_TX_Error_Coding1 = Codingã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0} +Terminology_TX_Error_Coding2 = Codingã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠{0}: {1} +Terminology_TX_NoValid_10 = æä¾›ã•ã‚ŒãŸcodeã¯æœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆcode = {1}#{2}) +Terminology_TX_NoValid_11 = æä¾›ã•ã‚ŒãŸcodeã¯æœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆcode = {1}#{2}, error = {3}) +Terminology_TX_NoValid_12 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ã€‚{1} +Terminology_TX_NoValid_13 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªcodeãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)。{1} +Terminology_TX_NoValid_14 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ã€‚{1} +Terminology_TX_NoValid_15 = 用語サーãƒãƒ¼ãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')を検証ã§ãã¾ã›ã‚“ã§ã—㟠+Terminology_TX_NoValid_16 = !!æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet {1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼‰{2} +Terminology_TX_NoValid_17 = !!æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet {1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“){2} +Terminology_TX_NoValid_18 = !!!!æä¾›ã•ã‚ŒãŸå€¤ï¼ˆ''{0}'')ã¯ValueSet{1}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼‰{2} +Terminology_TX_NoValid_1_CC = æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet {0}ã«å«ã¾ã‚Œã¦ãŠã‚‰ãšã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆcodes = {1}) +Terminology_TX_NoValid_2_CC = æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codingãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“)(codes = {1}) +Terminology_TX_NoValid_3_CC = !!æä¾›ã•ã‚ŒãŸcodingã®ã„ãšã‚Œã‚‚ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ãªã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codingãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ï¼‰ï¼ˆcodes = {1}) +Terminology_TX_NoValid_4 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™{1} +Terminology_TX_NoValid_5 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。é©åˆ‡ãªã‚³ãƒ¼ãƒ‰ãŒãªã„å ´åˆã‚’除ãã€ã“ã®ValueSetã‹ã‚‰ã®codeãŒå¿…è¦ã§ã™ï¼ˆãƒãƒªãƒ‡ãƒ¼ã‚¿ã¯ä½•ãŒé©åˆ‡ã‹åˆ¤æ–­ã§ãã¾ã›ã‚“){1} +Terminology_TX_NoValid_6 = !!æä¾›ã•ã‚ŒãŸCoding({2})ãŒValueSet{0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®codeãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ {1} +Terminology_TX_NoValid_7 = æä¾›ã•ã‚ŒãŸcodeã®ã„ãšã‚Œã‚‚ãŒæœ€å¤§ValueSet {0}ã§æ¤œè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆerror = {2}) +Terminology_TX_NoValid_8 = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‚‚ãŒæœ€å¤§ValueSet {0}ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®ValueSetã‹ã‚‰ã®ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ï¼ˆcodes = {1}) +Terminology_TX_NoValid_9 = æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ï¼ˆ{2})ã¯æœ€å¤§ValueSet {0}ã§æ¤œè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸï¼ˆã‚¨ãƒ©ãƒ¼= {1}) +Terminology_TX_System_Invalid = 無効ãªã‚·ã‚¹ãƒ†ãƒ URI:{0} +Terminology_TX_System_Relative = Coding.systemã¯ãƒ­ãƒ¼ã‚«ãƒ«å‚ç…§ã§ã¯ãªãã€çµ¶å¯¾å‚ç…§ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Terminology_TX_System_Unknown = ä¸æ˜ŽãªCodeSystem ''{0}'' +Terminology_TX_System_ValueSet = 無効ãªã‚·ã‚¹ãƒ†ãƒ URI:{0} - ValueSetURIをシステムã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“ +Terminology_TX_System_ValueSet2 = CodingãŒCodeSystemã§ã¯ãªãã€ValueSetã‚’å‚ç…§ã—ã¦ã„ã¾ã™ï¼ˆ''{0}'') +Terminology_TX_ValueSet_NotFound = !!ValueSet {0}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Terminology_TX_ValueSet_NotFound_CS = !!ValueSetãŒã‚ã‚‹ã¹ã場所ã«CodeSystem({0})ã¸ã®å‚ç…§ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Text_should_not_be_present = テキストã¯å­˜åœ¨ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“(''{0}'') +The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = ベースsnapshotã¯ã‚¹ãƒ©ã‚¤ã‚¹ã‚’closedã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¦ã„ã¾ã™ãŒã€differentialã¯{0}ã®{1}ã§ãれを拡張ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼ˆ{2}) +This__cannot_be_parsed_as_a_FHIR_object_no_namespace = !!ã“ã‚Œã¯FHIRオブジェクトã¨ã—ã¦è§£æžã§ãã¾ã›ã‚“(åå‰ç©ºé–“ãŒã‚ã‚Šã¾ã›ã‚“) +This_base_property_must_be_an_Array_not_ = ã“ã®ãƒ™ãƒ¼ã‚¹ãƒ—ロパティã¯é…列ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +This_cannot_be_parsed_as_a_FHIR_object_no_name = !!ã“ã‚Œã¯FHIRオブジェクトã¨ã—ã¦è§£æžã§ãã¾ã›ã‚“(åå‰ãŒã‚ã‚Šã¾ã›ã‚“) +This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = !!ã“ã‚Œã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰''{0}'') +This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = !!ã“ã‚Œã¯FHIRリソースã§ã¯ãªã„よã†ã§ã™ï¼ˆæœªçŸ¥ã®åå‰ç©ºé–“/åå‰''{0}::{1}'') +This_element_does_not_match_any_known_slice_ = !!ã“ã®è¦ç´ ã¯ã©ã®æ—¢çŸ¥ã®ã‚¹ãƒ©ã‚¤ã‚¹ã¨ã‚‚一致ã—ã¾ã›ã‚“ {0} +This_property_must_be__not_ = プロパティ{2}ã¯{0}ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{1}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({3}ã§ï¼‰ +This_property_must_be_a_Literal_not_ = ã“ã®ãƒ—ロパティã¯Literalã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +This_property_must_be_a_URI_or_bnode_not_ = ã“ã®ãƒ—ロパティã¯URIã¾ãŸã¯bnodeã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +This_property_must_be_an_Array_not_ = プロパティ{1}ã¯JSONé…列ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({2}ã§ï¼‰ +This_property_must_be_an_object_not_ = ã“ã®ãƒ—ロパティã¯ã‚ªãƒ–ジェクトã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({1}ã¯{2}ã§ï¼‰ +This_property_must_be_an_simple_value_not_ = ã“ã®ãƒ—ロパティã¯å˜ç´”ãªå€¤ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€{0}ã§ã¯ã‚ã‚Šã¾ã›ã‚“({1}ã¯{2}ã§ï¼‰ +Type_Specific_Checks_DT_Base64_Valid = 値''{0}''ã¯æœ‰åŠ¹ãªBase64値ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_Boolean_Value = 真å½å€¤ã¯''true''ã¾ãŸã¯''false''ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_Code_WS = コード ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ (空白ã®ãƒ«ãƒ¼ãƒ«) +Type_Specific_Checks_DT_DateTime_Reasonable = 値 ''{0}'' ã¯ã€åˆç†çš„ãªå¹´ã®ç¯„囲外ã§ã™ - データ入力エラーを確èªã—ã¦ãã ã•ã„ +Type_Specific_Checks_DT_DateTime_Regex = instant ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“(正è¦è¡¨ç¾ã«ã‚ˆã‚‹ï¼‰ +Type_Specific_Checks_DT_DateTime_TZ = 日付ã«æ™‚é–“ãŒã‚ã‚‹å ´åˆã€ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚’æŒãŸãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_DateTime_Valid = 有効ãªæ—¥ä»˜/時間ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +Type_Specific_Checks_DT_Date_Valid = 有効ãªæ—¥ä»˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +Type_Specific_Checks_DT_Decimal_GT = !!!!!!値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§å€¤ {0} を超ãˆã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Decimal_LT = !!!!!!値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ {0} を下回ã£ã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Decimal_Range = 値 ''{0}'' ã¯ã€ä¸€èˆ¬çš„ã«/åˆç†çš„ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹å進数ã®ç¯„囲外ã§ã™ +Type_Specific_Checks_DT_Decimal_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªå進数ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_ID_Valid = id値 ''{0}'' ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_Identifier_System = Identifier.systemã¯çµ¶å¯¾å‚ç…§ã§ãªã‘ã‚Œã°ãªã‚‰ãšã€ãƒ­ãƒ¼ã‚«ãƒ«å‚ç…§ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_Instant_Valid = 有効ãªinstantã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +Type_Specific_Checks_DT_Integer64_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªinteger64ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_Integer_GT = !!!!!!値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§å€¤ {0} を超ãˆã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Integer_LT = !!!!!!値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ {0} を下回ã£ã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Integer_LT0 = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ 0 を下回ã£ã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Integer_LT1 = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å°å€¤ 1 を下回ã£ã¦ã„ã¾ã™ +Type_Specific_Checks_DT_Integer_Valid = 値 ''{0}'' ã¯æœ‰åŠ¹ãªæ•´æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_OID_Start = OIDã¯urn:oid:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Type_Specific_Checks_DT_OID_Valid = OIDã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ ({0}) +Type_Specific_Checks_DT_Primitive_Length = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§é•· {0} より長ã„ã§ã™ +Type_Specific_Checks_DT_Primitive_NotEmpty = 値ã¯ç©ºã«ã§ãã¾ã›ã‚“ +Type_Specific_Checks_DT_Primitive_Regex = è¦ç´ å€¤ ''{0}'' ã¯æ­£è¦è¡¨ç¾ ''{1}'' を満ãŸã—ã¦ã„ã¾ã›ã‚“ +Type_Specific_Checks_DT_Primitive_Regex_Type = è¦ç´ å€¤ ''{0}'' 㯠{1} ã®æ­£è¦è¡¨ç¾ ''{2}'' を満ãŸã—ã¦ã„ã¾ã›ã‚“ +Type_Specific_Checks_DT_Primitive_ValueExt = プリミティブ型ã¯å€¤ã‚’æŒã¤ã‹ã€å­ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’æŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ +Type_Specific_Checks_DT_Primitive_WS = プリミティブ型ã¯ç©ºç™½ã ã‘ã§ã‚ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“ +Type_Specific_Checks_DT_String_Length = 値ã¯è¨±å¯ã•ã‚ŒãŸæœ€å¤§é•· 1 MB (1048576 bytes) より長ã„ã§ã™ +Type_Specific_Checks_DT_String_WS = 値ã¯ç©ºç™½ã§å§‹ã¾ã£ãŸã‚Šçµ‚ã‚ã£ãŸã‚Šã™ã‚‹ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“  ''{0}'' +Type_Specific_Checks_DT_String_WS_ALL = 値ã¯ã™ã¹ã¦ç©ºç™½ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“ ''{0}'' +Type_Specific_Checks_DT_Time_Valid = 有効ãªæ™‚é–“ã§ã¯ã‚ã‚Šã¾ã›ã‚“ ({0}) +Type_Specific_Checks_DT_URI_OID = URIã®å€¤ã¯oid:ã§å§‹ã¾ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Type_Specific_Checks_DT_URI_UUID = URIã®å€¤ã¯uuid:ã§å§‹ã¾ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +Type_Specific_Checks_DT_URI_WS = URIã®å€¤ã«ã¯ç©ºç™½ãŒã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“(''{0}'') +Type_Specific_Checks_DT_URL_Resolve = URL値 ''{0}'' ã¯è§£æ±ºã§ãã¾ã›ã‚“ +Type_Specific_Checks_DT_UUID_Strat = UUIDã¯urn:uuid:ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Type_Specific_Checks_DT_UUID_Valid = UUIDã¯æœ‰åŠ¹ã§å°æ–‡å­—ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ ({0}) +UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = system {0}ã®ãƒ—ロパティフィルターをop = {1}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +UNABLE_TO_INFER_CODESYSTEM = !!!!!!!!!!!!!!!!ValueSet {1}内ã®ã‚³ãƒ¼ãƒ‰{0}ã®ã‚·ã‚¹ãƒ†ãƒ URIを決定ã§ãã¾ã›ã‚“ã§ã—㟠+UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§è¦ç´ {1}(パス = {2})ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ +UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = ValueSet{0}ã‹ã‚‰å‚ç…§ã•ã‚ŒãŸCodeSystem {1}ã«ã¯æ–‡æ³•ãŒã‚ã‚Šã€ãã®ã‚³ãƒ¼ãƒ‰ã¯ãã‚Œã§æœ‰åŠ¹ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„制御文字をå«ã‚€Unicodeシーケンス: {0} +UNICODE_BIDI_CONTROLS_CHARS_MATCH = 終端ã•ã‚Œã¦ã„ãªã„制御文字をå«ã‚€Unicodeシーケンス(CVE-2021-42574å‚照): {0} +UNICODE_XML_BAD_CHARS_one = ã“ã®å†…容ã«ã¯æ–‡å­—{1}(16進数値)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®æ–‡å­—ã¯FHIRã®XMLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä¸é©åˆã§ã€é€šå¸¸ã€ãã®ã‚ˆã†ãªæ–‡å­—を有効ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ +UNICODE_XML_BAD_CHARS_other = ã“ã®å†…容ã«ã¯æ–‡å­—{1}(16進数値)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“れらã®æ–‡å­—ã¯FHIRã®XMLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä¸é©åˆã§ã€é€šå¸¸ã€ãã®ã‚ˆã†ãªæ–‡å­—を有効ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ +UNKNOWN_CODESYSTEM = !!!!!!!!CodeSystem {0}ã¯æœªçŸ¥ã§ã™ +UNKNOWN_CODESYSTEM_VERSION = !!CodeSystem {0}ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³{1}ã¯æœªçŸ¥ã§ã™ã€‚有効ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³: {2} +UNKNOWN_CODE_IN_FRAGMENT = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' - CodeSystemã¯æ–­ç‰‡ã¨ã—ã¦ãƒ©ãƒ™ãƒ«ä»˜ã‘ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãã®ã‚³ãƒ¼ãƒ‰ã¯ä»–ã®æ–­ç‰‡ã§ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ +UNRECOGNISED_PROPERTY_TYPE = è¦ç´ {1}ã®ç„¡åŠ¹ãªJSONåž‹{0};有効ãªåž‹ = {2} +UNRECOGNISED_PROPERTY_TYPE_WRONG = è¦ç´ {1}ã®ç„¡åŠ¹ãªåž‹{2};有効ãªåž‹ = {3}ã€JSONåž‹ = {0} +UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„:型{2}ã§ãƒ‘ターンã®discriminator({0})ã®ã‚¹ãƒ©ã‚¤ã‚¹{1}ã«å€¤ãŒã‚るプロパティãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = åž‹{2}ã§ãƒ‘ターンã®discriminator({0})ã®ã‚¹ãƒ©ã‚¤ã‚¹{1}ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„プロパティ{3}ãŒã‚ã‚Šã¾ã™ +Unable_to_connect_to_terminology_server = 用語サーãƒãƒ¼ ({1}) ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。エラー = {0} +Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = 用語サーãƒãƒ¼ ({1}) ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。LOINCã€SNOMEDã€ICD-Xãªã©ã‚’検証ã™ã‚‹ãŸã‚ã®ç”¨èªžã‚µãƒ¼ãƒ“スを使用ã›ãšã«å®Ÿè¡Œã™ã‚‹ã«ã¯ã€ãƒ‘ラメータ ''-tx n/a'' を使用ã—ã¦ãã ã•ã„。エラー = {0} +Unable_to_find__resolving_discriminator__from_ = {2}ã‹ã‚‰discriminator{1}を解決ã—ã¦{0}を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unable_to_find_base__for_ = {1}ã®åŸºåº•{0}を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unable_to_find_base_definition_for_logical_model__from_ = è«–ç†ãƒ¢ãƒ‡ãƒ«ã®åŸºæœ¬å®šç¾©ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: {0}ã‹ã‚‰{1} +Unable_to_find_element_ = è¦ç´  {0} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Unable_to_find_element__in_ = {1}内ã«è¦ç´ {0}ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Unable_to_find_element_with_id_ = id ''{0}''ã‚’æŒã¤è¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Unable_to_find_profile__at_ = プロファイル ''{0}''ãŒ{1}ã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Unable_to_find_resourceType_property = resourceTypeプロパティãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Unable_to_find_resource__at__resolving_discriminator__from_ = {3}ã‹ã‚‰discriminator{2}を解決ã—ã¦ãƒªã‚½ãƒ¼ã‚¹{0}ã‚’{1}ã§è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unable_to_handle_system__concept_filter_with_op__ = system {0}ã®ã‚³ãƒ³ã‚»ãƒ—トフィルターをop = {1}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unable_to_handle_system__filter_with_property__ = system {0}ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’property = {1}ã€op = {2}ã§å‡¦ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unable_to_locate_the_profile__in_order_to_validate_against_it = 検証ã™ã‚‹ãŸã‚ã®ãƒ—ロファイル ''{0}'' を特定ã§ãã¾ã›ã‚“ +Unable_to_process_request_for_resource_for___ = リソースã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“ {0} / {1} +Unable_to_resolve_ = å‚ç…§ {0} を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_actual_type_ = 実際ã®ã‚¿ã‚¤ãƒ— {0} を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_element__in_profile_ = プロファイル{1}ã®ä¸­ã§è¦ç´ {0}を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_name_reference__at_path_ = パス{1}ã§åå‰å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_profile__in_element_ = è¦ç´ {1}内ã®ãƒ—ロファイル{0}を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_reference_to_ = å‚ç…§{0}を解決ã§ãã¾ã›ã‚“ +Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = スライスマッãƒãƒ³ã‚°ã‚’解決ã§ãã¾ã›ã‚“ - 固定値ã¾ãŸã¯å¿…è¦ãªValueSetãŒã‚ã‚Šã¾ã›ã‚“ +Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = スライスマッãƒãƒ³ã‚°ã‚’解決ã§ãã¾ã›ã‚“ - ValueSetã«ã‚ˆã‚‹ã‚¹ãƒ©ã‚¤ã‚¹ãƒžãƒƒãƒãƒ³ã‚°ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ +Unable_to_resolve_system__no_value_set = systemを解決ã§ãã¾ã›ã‚“ - ValueSetãŒã‚ã‚Šã¾ã›ã‚“ +Unable_to_resolve_system__value_set_expansion_has_multiple_systems = !!systemを解決ã§ãã¾ã›ã‚“ - ValueSetã®expansionã«è¤‡æ•°ã®systemãŒã‚ã‚Šã¾ã™ +Unable_to_resolve_system__value_set_has_imports = !!systemを解決ã§ãã¾ã›ã‚“ - ValueSetã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆãŒã‚ã‚Šã¾ã™ +Unable_to_resolve_system__value_set_has_include_with_filter = !!!!systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«system {2}ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãŒã‚ã‚Šã¾ã™ +Unable_to_resolve_system__value_set_has_include_with_no_system = systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«systemãŒã‚ã‚Šã¾ã›ã‚“ +Unable_to_resolve_system__value_set_has_include_with_unknown_system = !!systemを解決ã§ãã¾ã›ã‚“ - ValueSet {0}ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰#{1}ã«ã¯æœªçŸ¥ã®system{2}ãŒã‚ã‚Šã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚¨ãƒ©ãƒ¼{3}ã‚’è¿”ã—ã¾ã—㟠+Unable_to_resolve_system__value_set_has_multiple_matches = !!systemを解決ã§ãã¾ã›ã‚“ - ValueSetã®expansionã«è¤‡æ•°ã®ä¸€è‡´ãŒã‚ã‚Šã¾ã™: {0} +Unable_to_resolve_system__value_set_has_no_includes_or_expansion = !!systemを解決ã§ãã¾ã›ã‚“ - ValueSet{0}ã«ã¯ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã¾ãŸã¯å±•é–‹ãŒã‚ã‚Šã¾ã›ã‚“ +Unable_to_resolve_value_Set_ = !!ValueSet{0}を解決ã§ãã¾ã›ã‚“ +Unable_to_validate_code_without_using_server = サーãƒãƒ¼ã‚’使用ã›ãšã«ã‚³ãƒ¼ãƒ‰ã‚’検証ã§ãã¾ã›ã‚“。ç†ç”±: {0} +Undefined_attribute__on__for_type__properties__ = åž‹{2}ã®{1}ã«æœªå®šç¾©ã®å±žæ€§''@{0}''ãŒã‚ã‚Šã¾ã™ +Undefined_element_ = {1}ã§æœªå®šç¾©ã®è¦ç´ ''{0}'' +Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = differentialã«ãŠã‘る予期ã—ãªã„状æ³ï¼šæš—黙的ãªã‚¹ãƒ©ã‚¤ã‚¹åãŒæœ‰åŠ¹ãªåž‹ã‚’å«ã¾ãªã„(''{0}''?) {1}/{2}㧠+Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = differentialã«ãŠã‘る予期ã—ãªã„状æ³ï¼š{0}/{1}ã§ä¸æ­£ãªåž‹ +Unexpected_datatype_for_rdfstype = rdfs:typeã®äºˆæœŸã—ãªã„データ型 +Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = 処ç†ã§ããªã„状æ³ï¼šãƒªã‚½ãƒ¼ã‚¹ãŒè¤‡æ•°ã®ã‚ªãƒ—ションã«ãƒ—ロファイル化ã•ã‚Œã¦ã„ã‚‹ - プロファイルを並ã¹æ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +Unknown_Code_in = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' +Unknown_Code_in_Version = system''{1}''ã§æœªçŸ¥ã®ã‚³ãƒ¼ãƒ‰''{0}'' +Unknown_Data_format_ = 未知ã®ãƒ‡ãƒ¼ã‚¿å½¢å¼''{0}'' +Unknown_Date_format_ = 未知ã®æ—¥ä»˜å½¢å¼''{0}'' +Unknown_resource_type_missing_rdfstype = 未知ã®ãƒªã‚½ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—(rdfs:typeãŒæ¬ è½ã—ã¦ã„る) +Unknown_type__at_ = {1}ã§æœªçŸ¥ã®åž‹{0} +Unrecognised_extension_context_ = !!èªè­˜ã§ããªã„extensionコンテキスト{0} +Unrecognised_predicate_ = !!èªè­˜ã§ããªã„述語''{0}'' +Unrecognised_property_ = èªè­˜ã§ããªã„プロパティ''{0}'' +Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - extensionã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ - スライス{1}ã®discriminator({0})用 +Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - å°‘ãªãã¨ã‚‚一ã¤ã®codingãŒå¿…è¦ - スライス{1}ã®discriminator({0})用 +Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„CodeableConceptパターン - textã®ä½¿ç”¨ - スライス{1}ã®discriminator({0})用 +Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„Identifierパターン - extensionã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ - スライス{1}ã®discriminator({0})用 +Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = スライス{1}ã®discriminator({0})ã«å¯¾ã™ã‚‹å›ºå®šãƒ‘ターンタイプã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“:{2} +Unsupported_fixed_value_type_for_discriminator_for_slice__ = スライス{1}ã®discriminator ({0})ã«å¯¾ã™ã‚‹å›ºå®šå€¤ã‚¿ã‚¤ãƒ—ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“:{2} +Unsupported_version_R1 = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R1 +Unsupported_version_R2 = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R2 +Unsupported_version_R2B = サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³R2B +Unxpected_internal_condition__no_source_on_diff_element = 予期ã—ãªã„内部状態 - differantialè¦ç´ ã«ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“ +VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = IG {1}ã‹ã‚‰ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ãƒ—ロファイルå‚ç…§''{0}''ã¯è§£æ±ºã§ããªã‹ã£ãŸãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“ +VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = プロファイル{0}ã®ãƒ‘ス{1}ã§ã®ç„¡åŠ¹ãªåˆ¶ç´„ - ベースタイプ{3}ã‹ã‚‰åž‹{2}ã«åˆ¶ç´„ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ +VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = プロファイル {1} ãŒä¾å­˜é–¢ä¿‚ {2} を特定ã—ã¦ã„ã¾ã™ï¼ˆextension http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies を使用)ãŒã€ã“ã®ãƒ—ロファイルã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+VALIDATION_VAL_PROFILE_OTHER_VERSION = プロファイルã¯FHIRã®åˆ¥ãƒãƒ¼ã‚¸ãƒ§ãƒ³({0})ã®ãŸã‚ã€ç„¡è¦–ã•ã‚Œã¾ã—㟠+VALIDATION_VAL_PROFILE_SIGNPOST = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ +VALIDATION_VAL_PROFILE_SIGNPOST_BASE = リソースをプロファイルã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ +VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ - ãƒãƒ³ãƒ‰ãƒ«ãƒ‘ラメータã¨ã—ã¦æä¾›ã•ã‚Œã¾ã™ +VALIDATION_VAL_PROFILE_SIGNPOST_DEP = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ï¼ˆ{1}ã®ä¸­ã®http://hl7.org/fhir/StructureDefinition/structuredefinition-dependenciesã«ã‚ˆã‚‹ï¼‰ +VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = リソースを{1}ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ãƒ—ロファイルã§ã‚るプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ +VALIDATION_VAL_PROFILE_SIGNPOST_META = リソースをプロファイル{0}ã«å¯¾ã—ã¦æ¤œè¨¼ã—ã¾ã™ï¼ˆãƒ¡ã‚¿ã«ã‚ˆã‚‹ï¼‰ +VALIDATION_VAL_PROFILE_THIS_VERSION_OK = ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®FHIRã®ãƒ—ロファイル - ã™ã¹ã¦OK +VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = プロファイルã¯ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®FHIRã®ãŸã‚ã®ã‚‚ã®ã§ã™ãŒã€ç„¡åŠ¹ãªåž‹{0}ã§ã™ +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = !!プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。å–å¾—ã¯ã‚¨ãƒ©ãƒ¼ {1}ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—㟠+VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = !!プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。ホスト {1} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = !!プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“。ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼ã¯æœªçŸ¥ã®ãƒ—ロファイルをå–å¾—ã—ãªã„設定ã«ãªã£ã¦ã„ã¾ã™ VALIDATION_VAL_STATUS_INCONSISTENT = リソースã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ "{0}"ã¯æ¨™æº–ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ "{1}"ã¨ä¸€è²«ã—ã¦ã„ã¾ã›ã‚“ VALIDATION_VAL_STATUS_INCONSISTENT_HINT = リソースã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ "{0}"ã¯æ¨™æº–ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ "{1}"ã¨ä¸€è²«ã—ãªã„ãŸã‚ã€ç¢ºèªã™ã¹ãã§ã™ -CODESYSTEM_CS_COUNT_COMPLETE_WRONG = CodeSystem.contentãŒcompleteã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptã®æ•° ({0})ãŒCodeSystem.count ({1})ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -CODESYSTEM_CS_COUNT_FRAGMENT_WRONG = CodeSystem.contentãŒfragment/exampleã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptã®æ•° ({0})ãŒCodeSystem.count ({1})を超ãˆã¦ã„ã¾ã™ -CODESYSTEM_CS_COUNT_NOTPRESENT_ZERO = CodeSystem.contentãŒnot-presentã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€CodeSystem.countã«0より大ãã„値ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚ŒãŒconceptã‚’æŒãŸãªã„completeãªã‚³ãƒ¼ãƒ‰ã‚·ã‚¹ãƒ†ãƒ ã§ã‚ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã‹ã€countã®å€¤ã‚’æ›´æ–°/削除ã—ã¦ãã ã•ã„。 -CODESYSTEM_CS_COUNT_SUPPLEMENT_WRONG = ã“ã®supplementコードシステムã¯countã®å€¤ãŒ{1}ã§ã™ãŒã€é…下ã®codesysteã®countã®å€¤ã¨ä¸€è‡´ã—ã¾ã›ã‚“ -CODESYSTEM_CS_COUNT_NO_CONTENT_ALLOWED = CodeSystem.contentãŒnot-presentã§ã‚ã‚‹ã«ã‚‚ã‹ã‹ã‚らãšã€conceptãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠VALUESET_CIRCULAR_REFERENCE = ValuSetã®pathway {1}を処ç†ä¸­ã«{0}ã¸ã®å¾ªç’°å‚ç…§ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+VALUESET_CONCEPT_DISPLAY_PRESENCE_MIXED = ã“ã®å«æœ‰ç‰©ã«ã¯è¡¨ç¤ºã‚ã‚Šã®conceptã¨è¡¨ç¤ºãªã—ã®conceptãŒæ··åœ¨ã—ã¦ã„ã¾ã™ - æ„図ã—ãŸé€šã‚Šã‹ç¢ºèªã—ã¦ãã ã•ã„ +VALUESET_CONCEPT_DISPLAY_SCT_TAG_MIXED = !!ã“ã®SNOMED-CTベースã®å«æœ‰ç‰©ã«ã¯ã€ã‚»ãƒžãƒ³ãƒ†ã‚£ãƒƒã‚¯ã‚¿ã‚°ï¼ˆFSN用語)付ãã®conceptã¨ãれ無ã—(優先用語)ã®conceptãŒæ··åœ¨ã—ã¦ã„ã¾ã™ - æ„図ã—ãŸé€šã‚Šã‹ç¢ºèªã—ã¦ãã ã•ã„ +VALUESET_EXAMPLE_SYSTEM_ERROR = 例システム''{0}''ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€ã“ã‚Œã¯é•æ³•ã§ã™ã€‚conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ +VALUESET_EXAMPLE_SYSTEM_HINT = 例システム''{0}''ãŒæŒ‡å®šã•ã‚ŒãŸã®ã§ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ +VALUESET_IMPORT_UNION_INTERSECTION = ã“ã®ValueSetã«ã¯ã€è¤‡æ•°ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸValueSetã‚’æŒã¤å˜ä¸€ã®å«æœ‰ç‰©ãŒã‚ã‚Šã¾ã™ã€‚å•é¡Œhttps://jira.hl7.org/browse/FHIR-25179ã«ã‚ˆã‚‹ã¨ã€ã“れらã®ValueSetãŒçµåˆã•ã‚Œã¦ã„ã‚‹ã®ã‹äº¤å·®ã—ã¦ã„ã‚‹ã®ã‹ã«ã¤ã„ã¦éŽåŽ»ã«æ··ä¹±ãŒã‚ã‚Šã¾ã—ãŸã€‚ã“ã®ValueSetãŒ2022å¹´3月31日以å‰ã«å…¬é–‹ã•ã‚ŒãŸãƒ‘ッケージã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€ãã‚Œã¯çµåˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ãれ以外ã®å ´åˆã¯äº¤å·®ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚çµåˆã‚’希望ã™ã‚‹å ´åˆã¯ã€ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’複数ã®å«æœ‰ç‰©ã«åˆ†ã‘ã¦ãã ã•ã„ +VALUESET_INCLUDE_INVALID_CONCEPT_CODE = !!code''{1}''ã¯system{0}ã§ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = !!code''{2}''ã¯system {0}ã®version {1}ã§ã¯æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +VALUESET_INC_TOO_MANY_CODES = !!value setã«å¤§é‡ã®codeãŒå«ã¾ã‚Œã‚‹ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã¾ã›ã‚“: {0} +VALUESET_NO_SYSTEM_WARNING = !!systemãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“ +VALUESET_REFERENCE_INVALID_TYPE = ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ{0}ã¯ã€ç„¡åŠ¹ãªåž‹{1}ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’指ã—ã¦ã„ã¾ã™ +VALUESET_REFERENCE_UNKNOWN = ValueSetã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ{0}ãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ç¢ºèªã§ãã¾ã›ã‚“ +VALUESET_SHAREABLE_EXTRA_MISSING = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = !!公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’推奨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +VALUESET_SHAREABLE_MISSING = 公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã™ã¹ã(SHOULD)ã§ã™ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 +VALUESET_SHAREABLE_MISSING_HL7 = !!公開ã•ã‚ŒãŸvalue setsã¯ValueSet.{0}ã®å­˜åœ¨ã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ShareableValueSetプロファイルã«æº–æ‹ ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“(SHALL)ãŒã€è¦ç´ ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 VALUESET_SUPPLEMENT_MISSING_one = å¿…è¦ãªsupplementãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: {1} VALUESET_SUPPLEMENT_MISSING_other = å¿…è¦ãªsupplementãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: {1} -CONCEPTMAP_VS_TOO_MANY_CODES = concept mapã«å¤§é‡ã®codeãŒå«ã¾ã‚Œã‚‹ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã¾ã›ã‚“: {0} -CONCEPTMAP_VS_INVALID_CONCEPT_CODE = システム {0}ã«ãŠã‘ã‚‹code "{1}"㯠value set "{2}"ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {1}ã®ã‚·ã‚¹ãƒ†ãƒ  {0}ã«ãŠã‘ã‚‹code "{2}"㯠value set "{3}"ã§æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -VALUESET_INC_TOO_MANY_CODES = value setã«å¤§é‡ã®codeãŒå«ã¾ã‚Œã‚‹ãŸã‚ã€ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã¾ã›ã‚“: {0} +VALUESET_TOO_COSTLY = !!ValueSet {0}ã«ã¯å¤šã™ãŽã‚‹ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã€è¡¨ç¤ºã§ãã¾ã›ã‚“({1}) +VALUESET_TOO_COSTLY_TIME = !!ValueSet {0}ã®å‡¦ç†ã«æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™ (>{1}sec) +VALUESET_UNC_SYSTEM_WARNING = 未知ã®system''{0}''ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€conceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“(詳細: {1}) +VALUESET_UNC_SYSTEM_WARNING_VER = 未知ã®system/version''{0}''ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€onceptã¨filterã¯ç¢ºèªã§ãã¾ã›ã‚“(詳細: {1}) +Validation_BUNDLE_Message = メッセージã®æœ€åˆã®ã‚¨ãƒ³ãƒˆãƒªã¯MessageHeaderã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +Validation_VAL_Content_Unknown = !!èªè­˜ã§ããªã„内容 {0} +Validation_VAL_NoType = 未知ã®åž‹ {0} +Validation_VAL_Profile_MatchMultiple = プロファイル{0}ã€è¦ç´ ã¯è¤‡æ•°ã®ã‚¹ãƒ©ã‚¤ã‚¹ã«ä¸€è‡´ã—ã¾ã™ - {1}, {2} +Validation_VAL_Profile_Maximum_one = {3}: 最大許容値 = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) +Validation_VAL_Profile_Maximum_other = {3}: 最大許容値 = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) +Validation_VAL_Profile_Minimum_one = {3}: 最å°å¿…è¦å€¤ = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) +Validation_VAL_Profile_Minimum_other = {3}: 最å°å¿…è¦å€¤ = {7}ã€è¦‹ã¤ã‹ã£ãŸå€¤ = {0} (from {1}) +Validation_VAL_Profile_MultipleMatches_one = {0}ã®é¸æŠžè‚¢ã®ä¸­ã§è¤‡æ•°ã®ä¸€è‡´ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: {1} +Validation_VAL_Profile_MultipleMatches_other = {0}ã®é¸æŠžè‚¢ã®ä¸­ã§è¤‡æ•°ã®ä¸€è‡´ã™ã‚‹ãƒ—ロファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: {1} +Validation_VAL_Profile_NoCheckMax_one = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最大許容値({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) +Validation_VAL_Profile_NoCheckMax_other = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最大許容値({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) +Validation_VAL_Profile_NoCheckMin_one = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最å°å¿…è¦å€¤({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) +Validation_VAL_Profile_NoCheckMin_other = {3}: {0}ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã‚¹ãƒ©ã‚¤ã‚¹æ¤œè¨¼ãŒãªã„ãŸã‚最å°å¿…è¦å€¤({2})ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ (from {1}) +Validation_VAL_Profile_NoDefinition = リソースタイプ''{0}''ã®å®šç¾©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Validation_VAL_Profile_NoMatch = 指定ã•ã‚ŒãŸãƒ—ロファイルã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ãŒé¸æŠžè‚¢{0}ã®ä¸­ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +Validation_VAL_Profile_NoSnapshot = StructureDefinition {0}ã«ã¯snapshotãŒã‚ã‚Šã¾ã›ã‚“ - 検証ã¯snapshotã«å¯¾ã—ã¦è¡Œã‚れるãŸã‚ã€ã“れをæä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +Validation_VAL_Profile_NoType = !!è¦ç´ {0}ã®åž‹ãŒæœªçŸ¥ã§ã‚ã‚Šã€ç„¡åŠ¹ã§ã™ã€‚ã“ã®æ™‚点ã§æœ‰åŠ¹ãªåž‹ã¯{1}ã§ã™ +Validation_VAL_Profile_NotAllowed = ã“ã®è¦ç´ ã¯ãƒ—ロファイル {0}ã«ã‚ˆã£ã¦è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ +Validation_VAL_Profile_NotSlice = ã“ã®è¦ç´ ã¯æ—¢çŸ¥ã®ã‚¹ãƒ©ã‚¤ã‚¹{0}ã¨ä¸€è‡´ã›ãšã€ã‚¹ãƒ©ã‚¤ã‚¹ã¯é–‰ã˜ã¦ã„ã¾ã™: {1} +Validation_VAL_Profile_OutOfOrder = プロファイル {0}ã«ã‚ˆã‚‹ã¨ã€è¦ç´ ''{1}''ã®é †åºãŒèª¤ã£ã¦ã„ã¾ã™ï¼ˆ{2}ã®å¾Œã«è¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼‰ +Validation_VAL_Profile_SliceOrder = プロファイル {0}ã«ã‚ˆã‚‹ã¨ã€é †åºä»˜ã‘ã•ã‚ŒãŸã‚¹ãƒ©ã‚¤ã‚¹ã®ä¸­ã§è¦ç´ ''{1}''ã®é †åºãŒèª¤ã£ã¦ã„ã¾ã™ +Validation_VAL_Profile_Unknown = !!プロファイルå‚ç…§''{0}''ã¯æœªçŸ¥ã®ãŸã‚ã€ç¢ºèªã•ã‚Œã¦ã„ã¾ã›ã‚“ +Validation_VAL_Profile_WrongType = 指定ã•ã‚ŒãŸãƒ—ロファイルã®ã‚¿ã‚¤ãƒ—ã¯''{0}''ã§ã€ãƒ—ロファイル''{2}''ã®ä¸­ã«ã‚ã‚Šã¾ã—ãŸãŒã€''{1}''ã®ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠+Validation_VAL_Profile_WrongType2 = プロファイル{0}ã®ãƒ‘ス{1}ã§ã®åž‹ã®ä¸ä¸€è‡´ï¼šè¦ç´ ã®åž‹ã¯{4}ã§ã™ãŒã€ãƒ—ロファイル{3}ã¯ç•°ãªã‚‹åž‹{2}ã®ãŸã‚ã§ã™ +Validation_VAL_Unknown_Profile = 未知ã®ãƒ—ロファイル {0} +Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ã¾ã›ã‚“。コンテキストã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³{0}ãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ãŠã‚Šã€æ–°ã—ãロードã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³{1}ã§ã™ +Wrong_namespace__expected_ = é–“é•ã£ãŸãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ - ''{0}''ãŒå¿…è¦ã§ã™ +Wrong_type_for_resource = リソースã®åž‹ãŒé–“é•ã£ã¦ã„ã¾ã™ +XHTML_URL_DATA_DATA_INVALID = dataã®dataã¯æœ‰åŠ¹ãªbase64コンテンツã§ã‚ã‚‹ã¹ãã§ã™URL:{0} +XHTML_URL_DATA_DATA_INVALID_COMMA = data URLã®data部分ã«ã‚«ãƒ³ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼š{0} +XHTML_URL_DATA_MIMETYPE = data: URLã®mimetype部分ãŒç„¡åŠ¹ã§ã™ï¼ˆ{1})URL: {0} +XHTML_URL_DATA_NO_DATA = dataã«dataãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: URL +XHTML_URL_EMPTY = URLãŒç©ºã§ã™ +XHTML_URL_INVALID = URLã¯''({1})''ã®ãŸã‚有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“:{0} +XHTML_URL_INVALID_CHARS_one = URLã«ç„¡åŠ¹ãªæ–‡å­—({1})ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ +XHTML_URL_INVALID_CHARS_other = URLã«{0}個ã®ç„¡åŠ¹ãªæ–‡å­—({1})ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ +XHTML_XHTML_Attribute_Illegal = XHTMLã®å±žæ€§åãŒç„¡åŠ¹ã§ã™(''{0}'' on ''{1}'') +XHTML_XHTML_DOCTYPE_ILLEGAL = å½¢å¼ãŒæ­£ã—ããªã„XHTML: DocType宣言ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã“ã‚Œã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(XXEセキュリティ脆弱性ä¿è­·ï¼‰ +XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = !!段è½å†…ã®XHTMLã®è¦ç´ åãŒç„¡åŠ¹ã§ã™(''{0}'') +XHTML_XHTML_Element_Illegal = XHTMLã®è¦ç´ åãŒç„¡åŠ¹ã§ã™(''{0}'') +XHTML_XHTML_Entity_Illegal = XHTMLã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãŒç„¡åŠ¹ã§ã™(''{0}'') +XHTML_XHTML_Image_Reference_Illegal = XHTMLã®ç”»åƒå‚ç…§ãŒç„¡åŠ¹ã§ã™(''{0}'') +XHTML_XHTML_NS_InValid = XHTMLã®ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ãŒé–“é•ã£ã¦ã„ã¾ã™(''{0}'', ''{1}''ã§ã‚ã‚‹ã¹ãã§ã™) +XHTML_XHTML_Name_Invalid = XHTMLã®åå‰ãŒé–“é•ã£ã¦ã„ã¾ã™(''{0}'') - divã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ +_DT_Fixed_Wrong = !!値㯠''{0}'' ã§ã™ãŒã€ ''{1}'' ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ +_has_children__and_multiple_types__in_profile_ = プロファイル {3}ã§{0}ã¯è¤‡æ•°ã®ã‚¿ã‚¤ãƒ—({2})ã®children({1})ã‚’æŒã¡ã¾ã™ +_has_children__for_type__in_profile__but_cant_find_type = プロファイル{3}ã§ã¯{0}ã¯children({1})ã‚’æŒã¡ã¾ã™ãŒã€ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ +_has_no_children__and_no_types_in_profile_ = {0} ã«ã¯childrenãŒãªã({1})ã€ãƒ—ロファイル {2} ã«ã‚‚タイプãŒã‚ã‚Šã¾ã›ã‚“ +defined_in_the_profile = プロファイルã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ +documentmsg = (ドキュメント) +element__null_ = è¦ç´  = null: {0} +element_id__null__on_ = è¦ç´ id = null: {0} on {1} +error_writing_number__to_JSON = 数値 ''{0}'' ã‚’JSONã«æ›¸ã込むエラー +getSliceList_should_only_be_called_when_the_element_has_slicing = è¦ç´ ãŒã‚¹ãƒ©ã‚¤ã‚¹ã‚’æŒã¤ã¨ãã ã‘ã€getSliceListを呼ã³å‡ºã™ã¹ãã§ã™ +needs_a_snapshot = snapshotãŒå¿…è¦ã§ã™ +no_base_profile_provided = ベースプロファイルãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +no_derived_structure_provided = 派生ã—ãŸæ§‹é€ ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“ +no_url_in_expand_value_set = expand value setã«urlãŒã‚ã‚Šã¾ã›ã‚“ +no_url_in_expand_value_set_2 = expand value set 2ã«urlãŒã‚ã‚Šã¾ã›ã‚“ +no_value_set = ValueSetã«ã¯urlプロパティãŒã‚ã‚Šã¾ã›ã‚“ +not_done_yet_cant_fetch_ = ã¾ã çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“: {0} ã‚’å–å¾—ã§ãã¾ã›ã‚“ +not_the_right_kind_of_structure_to_generate_schematrons_for = schematronsを生æˆã™ã‚‹ãŸã‚ã®é©åˆ‡ãªç¨®é¡žã®æ§‹é€ ã§ã¯ã‚ã‚Šã¾ã›ã‚“ +null_min = minãŒnullã§ã™ +reference_to__cannot_be_resolved = {0} ã¸ã®å‚ç…§ã¯è§£æ±ºã§ãã¾ã›ã‚“ +type_on_first_differential_element = 最åˆã®differantialè¦ç´ ã®ã‚¿ã‚¤ãƒ—ï¼ +type_on_first_snapshot_element_for__in__from_ = {1}ã‹ã‚‰{0}ã®æœ€åˆã®snapshotè¦ç´ ã®ã‚¿ã‚¤ãƒ— +xml_attr_value_invalid = XML属性{0}ã«ç„¡åŠ¹ãªæ–‡å­—ãŒã‚ã‚Šã¾ã™ +xml_encoding_invalid = XMLエンコーディングãŒç„¡åŠ¹ã§ã™ï¼ˆUTF-8ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) diff --git a/exec/pack/Messages_nl.properties b/exec/pack/Messages_nl.properties index ec0c21b30..9cd834c2c 100644 --- a/exec/pack/Messages_nl.properties +++ b/exec/pack/Messages_nl.properties @@ -1,22 +1,74 @@ -#InstanceValidator -Bad_file_path_error = \n********************\n* Het bestand dat je opgaf, ''{0}'', bestaat niet op het lokale bestandssysteem.\n* Controleer of de locatie klopt.\n********************\n\n +# InstanceValidator = one,other +ABSTRACT_CODE_NOT_ALLOWED = Code ''{0}#{1}'' is abstract en niet toegestaan in deze context +ALL_OK = Alles OK +ARRAY_CANNOT_BE_EMPTY = Array kan niet leeg zijn - de eigenschap zou niet aanwezig moeten zijn als deze geen waarden bevat +ATTEMPT_TO_CHANGE_SLICING = Het element op {0} definieert de slicing {1} maar vervolgens probeert een element in de slicing {2} deze opnieuw te definiëren als {3} +Adding_wrong_path = Verkeerd pad toegevoegd +Adding_wrong_path__outcomegetPath___resultPathBase__ = Verkeerd pad toegevoegd - outcome.getPath() = {0}, resultPathBase = {1} +Adding_wrong_path_in_profile___vs_ = Verkeerd pad toegevoegd in profiel {0}: {1} versus {2} +All_observations_should_have_a_performer = Best practice aanbeveling: alle Observations zouden een performer moeten bevatten +All_observations_should_have_a_subject = Best practice aanbeveling: alle Observations zouden een subject moeten bevatten +All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = Best practice aanbeveling: alle Observations zouden een effective[x] ({0}) moeten bevatten +Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Poging tot slicen van een element dat niet herhaalt: {0}/{1} van {2} in {3}, bij element {4} (slice = {5}) +Attempt_to_replace_element_name_for_a_nonchoice_type = Poging om een elementnaam te vervangen door een niet-keuze type +Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Poging om terminologieserver te gebruiken terwijl er geen terminologieserver beschikbaar is +Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Poging om een snapshot van profiel ''{0}'' te gebruiken als {1} voordat deze is gegenereerd +BINDING_ADDITIONAL = {0} gespecificeerd in een additionele binding +BINDING_MAX = {0} gespecificeerd in de max binding +BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE = {0} matches gevonden voor ''{1}'' in de bundel ({2}) +BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT = {0} matches gevonden voor fragment {2} in resource ''{1}'' in de Bundle ({3}) +BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Behalve bij transactions en batches, moet iedere entry in een Bundle een fullUrl hebben, welke de identiteit vormt van de resource in de entry +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_MULTIPLE_MATCHES = De {1} resource komt overeen met meer dan één van de toegestane profielen ({3}) +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH = De {1} resource kwam niet overeen met de toegestane profielen (Type {2}: {3}) +BUNDLE_BUNDLE_ENTRY_MULTIPLE_PROFILES_NO_MATCH_REASON = De {1} resource kwam niet overeen met profiel {2} omdat: {3} +BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_one = Kan ''{1}'' niet vinden in de Bundle ({2}). Merk op dat er een resource in de Bundle staat met hetzelfde type en id, maar dat deze niet matcht op basis van de regels voor fullUrl rond matchen van relatieve referenties (moet zijn ``{3}``) +BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT_other = Kan ''{1}'' niet vinden in de Bundle ({2}). Merk op dat er {0} resources in de Bundle staan met hetzelfde type en id, maar dat deze niet matchen op basis van de regels voor fullUrl rond matchen van relatieve referenties (een van ``{3}``) +BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT = Kan ''{0}'' niet vinden in de Bundle ({1}) +BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = Entry {0} is niet bereikbaar door voorwaarts links te volgen vanuit de MessageHeader. Controleer of deze is bedoeld om bijgevoegd te worden (nodig om het bericht te verwerken) +BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = Entry {0} is niet bereikbaar door voorwaarts links te volgen vanuit de Composition. Alleen bij Provenance wordt dit toegestaan (R4 sectie 3.3.1) +BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = Entry {0} is niet bereikbaar door referenties te volgen vanuit de Composition. Controleer of deze direct uit de Compositon gekoppeld moet zijn als dit een bron van Narrative inhoud is +BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = Entry {0} komt overeen met de referentie {1} op basis van type en id maar niet met de fullUrl {2} volgens de regels voor het volgen van verwijzingen in Bundles +BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = Entry {0} komt overeen met de verwijzing {1} op basis van type en id maar zijn fullUrl {2} komt niet overeen met de fullUrl {3} van het doel volgens de regels voor het volgen van verwijzingen in Bundles +BUNDLE_ENTRY_URL_ABSOLUTE = De fullUrl moet een absolute url zijn (niet ''{0}'') +BUNDLE_ENTRY_URL_MATCHES_NO_ID = De fullUrl ''{0}'' lijkt een RESTful server url te zijn, maar de resource mist een id +BUNDLE_ENTRY_URL_MATCHES_TYPE_ID = De fullUrl ''{0}'' lijkt een RESTful server url te zijn, maar eindigt niet met het correcte type en een id (/{1}/{2}) +BUNDLE_LINK_SEARCH_NO_DUPLICATES = Het link relatietype ''{0}'' kan slechts één keer voorkomen +BUNDLE_LINK_SEARCH_PROHIBITED = Het link relatietype ''{0}'', in gebruik in zoeksets, is in deze context verboden +BUNDLE_LINK_STYELSHEET_EXTERNAL = Externe Stylesheets anders dan https://hl7.org/fhir/fhir.css ZOUDEN NIET MOETEN worden gebruikt +BUNDLE_LINK_STYELSHEET_INSECURE = De stylesheet-referentie is niet veilig +BUNDLE_LINK_STYELSHEET_LINKABLE = De stylesheet-referentie kan niet worden gevonden +BUNDLE_LINK_STYELSHEET_NOT_FOUND = De stylesheet-referentie is niet gevonden in deze bundel +BUNDLE_LINK_UNKNOWN = Het link relatietype ''{0}'' is onbekend en niet toegestaan deze context +BUNDLE_POSSSIBLE_MATCHES = De bundle bevat geen overeenkomsten voor {1} volgens de regels van Bundle referentie-oplossing, maar heeft meerdere resources die overeenkomen met {0} op basis van resource type en id +BUNDLE_RULE_INVALID_INDEX = Index van Bundle-regels is ongeldig ({0}) +BUNDLE_RULE_NONE = Geen regel +BUNDLE_RULE_PROFILE_UNKNOWN = Bundle-regels profiel {1} is onbekend voor {0} +BUNDLE_RULE_UNKNOWN = Bundle-regel wijst naar ongeldige resource {0} +BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entries moeten resources bevatten +BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Zoekresultaten moeten id''s bevatten +BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Kan niet bepalen of deze resource een geldige resource type is bij deze zoekactie +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = Dit is geen overeenkomstig resourcetype voor de opgegeven zoekactie ({0} verwacht {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = Dit is geen overeenkomstig resourcetype voor de opgegeven zoekactie (is een search.mode nodig?) ({0} verwacht {1}) +BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = Dit is geen OperationOutcome ({0}) +BUNDLE_SEARCH_NOSELF = SearchSet Bundles moeten een self link bevatten die specificeert waarmee is gezocht +BUNDLE_SEARCH_NO_MODE = SearchSet bundles zouden search.mode op de entries moeten hebben +BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = Er kunnen geen typen worden bepaald vanuit de zoekstring, dus de typen kunnen niet worden gecontroleerd +Bad_file_path_error = ** Fout: het bestand dat je opgaf, ''{0}'', bestaat niet op het lokale bestandssysteem. Controleer of de locatie klopt. ** +Base__Derived_profiles_have_different_types____vs___ = Basis & afgeleide profielen hebben verschillende typen ({0} = {1} vs {2} = {3}) +Base_profile__has_no_type = Basisprofiel {0} heeft geen type Bundle_BUNDLE_Entry_Canonical = De canonical URL ({0}) kan niet gelijk zijn aan de fullUrl ({1}) tenzij op de canonical server zelf Bundle_BUNDLE_Entry_Document = De eerste entry in een document moet een composition zijn -Bundle_BUNDLE_Entry_IdUrlMismatch = Resource ID komt niet overeen met de ID in de entry fullUrl (''{0}'' versus ''{1}'') +Bundle_BUNDLE_Entry_IdUrlMismatch = Resource ID komt niet overeen met de ID in de entry fullUrl (''{0}'' versus ''{1}'') Bundle_BUNDLE_Entry_MismatchIdUrl = De canonical URL ({0}) komt niet overeen met fullUrl ({1}) tenzij de resource id ({2}) ook overeenkomt +Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = Opgegeven mogisch model {1} niet gevonden voor resource ''Binary/{0}'' Bundle_BUNDLE_Entry_NoFirst = Documenten of Messages moeten tenminste een entry bevatten Bundle_BUNDLE_Entry_NoFirstResource = Geen resource bij eerste entry Bundle_BUNDLE_Entry_NoFullUrl = Bundle entry mist fullUrl -BUNDLE_BUNDLE_ENTRY_FULLURL_REQUIRED = Behalve bij transactions en batches, moet iedere entry in een Bundle een fullUrl hebben, welke de identiteit vormt van de resource in de entry -Bundle_BUNDLE_Entry_NoProfile_TYPE = Geen profiel gevonden voor {0} resource van type ''{1}'' Bundle_BUNDLE_Entry_NoProfile_EXPL = Opgegeven profiel {2} niet gevonden voor {0} resource van type ''{0}'' -Bundle_BUNDLE_Entry_NO_LOGICAL_EXPL = Opgegeven mogisch model {1} niet gevonden voor resource ''Binary/{0}'' -Bundle_BUNDLE_Entry_NotFound = Kan ''{0}'' niet vinden in de bundle ({1}) -Bundle_BUNDLE_Entry_Orphan_MESSAGE = Entry {0} is niet bereikbaar door links te volgen (voorwaarts of achterwaarts) vanuit de MessageHeader, dus zijn aanwezigheid moet worden gecontroleerd (is het nodig om het bericht te verwerken?) +Bundle_BUNDLE_Entry_NoProfile_TYPE = Geen profiel gevonden voor {0} resource van type ''{1}'' +Bundle_BUNDLE_Entry_NotFound = Kan ''{0}'' niet vinden in de Bundle ({1}) Bundle_BUNDLE_Entry_Orphan_DOCUMENT = Entry {0} is niet bereikbaar door links te volgen (voorwaarts of achterwaarts) vanuit de Composition -BUNDLE_BUNDLE_ENTRY_REVERSE_R4 = Entry {0} is niet bereikbaar door voorwaarts links te volgen vanuit de Composition. Alleen bij Provenance wordt dit toegestaan (R4 sectie 3.3.1) -BUNDLE_BUNDLE_ENTRY_REVERSE_R5 = Entry {0} is niet bereikbaar door voorwaarts links te volgen vanuit de Composition. Controleer of deze direct uit de Compositon gekoppeld moet zijn als dit een bron van Narrative inhoud is -BUNDLE_BUNDLE_ENTRY_REVERSE_MSG = Entry {0} is niet bereikbaar door voorwaarts links te volgen vanuit de MessageHeader. Controleer of deze bedoeld is om bijgevoegd te worden (nodig om het bericht te verwerken) +Bundle_BUNDLE_Entry_Orphan_MESSAGE = Entry {0} is niet bereikbaar door links te volgen (voorwaarts of achterwaarts) vanuit de MessageHeader, dus zijn aanwezigheid moet worden gecontroleerd (is het nodig om het bericht te verwerken?) Bundle_BUNDLE_Entry_Type = Het type ''{0}'' is niet geldig - hier geen resources toegestaan (toegestaan = {1}) Bundle_BUNDLE_Entry_Type2 = Het type ''{0}'' is niet geldig - moet zijn {1} (toegestaan = {2}) Bundle_BUNDLE_Entry_Type3_one = Het type ''{1}'' is niet geldig - moet type {2} zijn @@ -25,16 +77,157 @@ Bundle_BUNDLE_FullUrl_Missing = Relatieve referentie in Bundle waarvan de entry Bundle_BUNDLE_FullUrl_NeedVersion = Entries met fullURL {0} moeten meta/versionId specificeren omdat er versie-specifieke referenties zijn Bundle_BUNDLE_MultipleMatches = Meerdere matches in bundle voor referentie {0} Bundle_BUNDLE_Not_Local = URN referentie staat niet lokaal in de bundel {0} -Bundle_MSG_Event_Count = Verwacht {0} maar gevonden {1} event elementen Bundle_Document_Date_Missing = Een document moet een datum hebben (Bundle.timestamp) Bundle_Document_Date_Missing_html = [(type = ''document'') implies (meta.lastUpdated.hasValue())] +Bundle_MSG_Event_Count = Verwacht {0} maar gevonden {1} event elementen +CDATA_is_not_allowed = CDATA is niet toegestaan +CDA_UNKNOWN_TEMPLATE = De CDA template {0} is onbekend +CDA_UNKNOWN_TEMPLATE_EXT = De CDA template {0} / {1} is onbekend +CODESYSTEM_CS_COUNT_COMPLETE_WRONG = Het codesysteem is compleet maar het aantal concepten {0} komt niet overeen met het aangegeven totaal ({1}) +CODESYSTEM_CS_COUNT_FRAGMENT_WRONG = Het codesysteem is een fragment/voorbeeld maar het aantal concepten ({0}) is hoger dan het aangegeven totaal ({1}) +CODESYSTEM_CS_COUNT_NO_CONTENT_ALLOWED = Het codesysteem zegt dat er geen aanwezige concepten zijn, maar dit is toch het geval +CODESYSTEM_CS_COUNT_SUPPLEMENT_WRONG = Het codesysteemsupplement geeft een totaal van {1} concepten, maar dit verschilt van het onderliggende codesysteem dat de waarde {0} heeft +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7-gedefinieerde CodeSystems MOETEN een waarde hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is +CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7-gedefinieerde CodeSystems ZOUDEN een waarde MOETEN hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystems ZOUDEN GEEN waarde MOETEN hebben voor het {0} element als het een supplement betreft +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = CodeSystem Supplements met content-waarde ''supplement'' MOETEN een supplements element hebben waarin staat voor welk codesysteem het een supplement is +CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = CodeSystem supplementen MOETEN de content-waarde ''supplement'' hebben +CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystems ZOUDEN een waarde MOETEN hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is +CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} is een supplement, dus kan niet worden gebruikt als waarde in Coding.system +CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Review de ''alle codes'' ValueSet - incomplete CodeSystems moeten generiek geen waardelijst voor ''alle codes'' specificeren +CODESYSTEM_CS_NO_VS_SUPPLEMENT1 = CodeSystem supplementen zouden geen ValueSet met alle waarden moeten aangeven, of deze moet overeenkomen met die in het onderliggende codesysteem +CODESYSTEM_CS_NO_VS_SUPPLEMENT2 = CodeSystem supplementen zouden geen ValueSet met alle waarden moeten aangeven, of deze moet overeenkomen met die in het onderliggende codesysteem en dat is hier niet het geval (''{0}'') +CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} kan niet worden gevonden, dus kan niet controleren of concepten geldig zijn +CODESYSTEM_CS_SUPP_INVALID_CODE = De code ''{1}'' is niet gedeclareerd in het basis CodeSystem {0} dus deze is ongeldig in het supplement +CODESYSTEM_CS_SUPP_NO_SUPP = Het codesysteem is gemarkeerd als supplement maar het definieert niet van welk codesysteem het een supplement is +CODESYSTEM_CS_UNK_EXPANSION = De gevonden code ({2}) bestaat niet in de expansie van de waardelijst {0} en een code uit deze waardelijst is verplicht. Het systeem {1} is niet gevonden. +CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0} heeft een ''volledig systeem'' waardelijst {1}, maar dit is een expansion met een onjuist aantal concepten (gevonden {2}, verwacht {3}) +CODESYSTEM_DESIGNATION_DISP_CLASH_LANG = De designation ''{0}'' mist use en heeft dezelfde taal (''{2}'') als, dus is niet onderscheidbaar van, de basis weergavenaam (''{1}'') +CODESYSTEM_DESIGNATION_DISP_CLASH_NO_LANG = De designation ''{0}'' mist use en heeft geen taal, dus is niet onderscheidbaar van de basis weergavenaam (''{1}'') +CODESYSTEM_NOT_CONTAINED = CodeSystems wordt direct naar verwezen vanuit Coding.system, dus is het generiek goed als het geen contained resources zijn +CODESYSTEM_PROPERTY_BAD_HL7_URI = Onbekende CodeSystem eigenschap ''{0}''. Als je je eigen eigenschappen definieert, doe dat dan niet in de HL7 namespace +CODESYSTEM_PROPERTY_CODE_TYPE_MISMATCH = Verkeerd type ''{2}'': de code ''{0}'' identificeert een eigenschap met type ''{1}'' +CODESYSTEM_PROPERTY_CODE_WARNING = Als het type ''code'' is, dan moet de valueSet eigenschap wordt gezet om duidelijk te maken welke codes geldig zijn in het element +CODESYSTEM_PROPERTY_DUPLICATE_CODE = Er bestaat al een eigenschap met de code ''{0}'' +CODESYSTEM_PROPERTY_DUPLICATE_URI = Er bestaat al een eigenschap met de uri ''{0}'' +CODESYSTEM_PROPERTY_KNOWN_CODE_SUGGESTIVE = Deze eigenschap heeft alleen de standaardcode (''{0}'') maar niet de standaard-uri ''{1}'' dus mist een goed gedefinieerde betekenis in het terminologiesysteem +CODESYSTEM_PROPERTY_NO_VALUE = De eigenschap ''{0}'' heeft geen waarde en kan niet worden geïnterpreteerd +CODESYSTEM_PROPERTY_SYNONYM_CHECK = Het synoniem ''{0}'' wordt niet ook gedefinieerd in het codesysteem. De eigenschap Synonym is alleen bedoeld voor equivalentie met andere, bestaande codes +CODESYSTEM_PROPERTY_UNDEFINED = De eigenschap ''{0}'' heeft geen definitie in CodeSystem.property. Vele terminolgietools zullen niet weten wat hiermee te doen +CODESYSTEM_PROPERTY_UNKNOWN_CODE = Deze eigenschap heeft alleen een code (''{0}'') en geen uri, dus heeft geen duidelijke betekenis in het terminolgiesysteem +CODESYSTEM_PROPERTY_URI_CODE_MISMATCH = De uri ''{0}'' heeft normaal code ''{1}''. Met code ''{2}'' ontstaat vaak verwarring in ValueSet filters etc +CODESYSTEM_PROPERTY_URI_TYPE_MISMATCH = Verkeerd type ''{2}'': de uri ''{0}'' identificeert een eigenschap met type ''{1}'' +CODESYSTEM_PROPERTY_WRONG_TYPE = De eigenschap ''{0}'' heeft ongeldig type ''{1}''. Deze is gedefinieerd met type ''{2}'' +CODESYSTEM_SHAREABLE_EXTRA_MISSING = Gepubliceerde codesystemen ZOUDEN zich MOETEN houden aan het ShareableCodeSystem profiel, wat zegt dat het element CodeSystem.{0} aanwezig zou moeten zijn, maar deze ontbreekt +CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = Door HL7 gepubliceerde codesystemen MOETEN zich houden aan het ShareableCodeSystem profiel, wat zegt dat het element CodeSystem.{0} aanwezig zou moeten zijn, maar deze ontbreekt +CODESYSTEM_SHAREABLE_MISSING = Gepubliceerde codesystemen ZOUDEN zich MOETEN houden aan het ShareableCodeSystem profiel, wat zegt dat het element CodeSystem.{0} aanwezig moet zijn, maar deze ontbreekt +CODESYSTEM_SHAREABLE_MISSING_HL7 = Door HL7 gepubliceerde codesystemen MOETEN zich houden aan het ShareableCodeSystem profiel, wat zegt dat het element CodeSystem.{0} aanwezig moet zijn, maar deze ontbreekt +CODESYSTEM_THO_CHECK = Meeste codesystemen gedefinieerd in HL7 IG''s zullen later naar THO worden verplaatst in het proces. Overweeg om dit codesysteem nu al een THO url te geven (Zie https://confluence.hl7.org/display/TSMG/Terminology+Play+Book, en/of praat met TSMG) +CODE_CASE_DIFFERENCE = De code ''{0}'' verschilt van de correcte code ''{1}'' op hoofdletters. Hoewel het codesysteem ''{2}'' niet hoofdlettergevolig is, wordt implementers ter zeerste aanbevolen om de juiste schrijfwijze te gebruiken +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = De bron-code ''{0}'' is niet geldig in het codesysteem {1} +CONCEPTMAP_GROUP_SOURCE_CODE_INVALID_VS = De bron-code ''{0}'' is niet geldig in de waardelijst {1} +CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = De bron-weergave ''{0}'' voor de code ''{2}'' is niet geldig. Mogelijke weergaven: {1} +CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Bron CodeSystem {0} heeft niet alle content (content = {1}), dus de broncodes kunnen niet worden gecontroleerd +CONCEPTMAP_GROUP_SOURCE_MISSING = Geen bron CodeSystem, dus de bron-codes kunnen niet worden gecontroleerd +CONCEPTMAP_GROUP_SOURCE_SERVER_SIDE = Bron CodeSystem {0} wordt alleen ondersteund in de terminologieserver dus worden bron-codes niet gevalideerd om performanceredenen +CONCEPTMAP_GROUP_SOURCE_UNKNOWN = Het bron CodeSystem {0} is niet volledig gedefinieerd en gevuld en er is geen sourceScope gedefinieerd, dus er zal geen controle op bron-codes worden gedaan +CONCEPTMAP_GROUP_TARGET_CODE_INVALID = De doel-code ''{0}'' is niet geldig in het codesysteem {1} +CONCEPTMAP_GROUP_TARGET_CODE_INVALID_VS = De doel-code ''{0}'' is niet geldig in de waardelijst {1} +CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = De doel-weergave ''{0}'' voor de code ''{2}'' is niet geldig. Mogelijke weergave(n): {1} +CONCEPTMAP_GROUP_TARGET_INCOMPLETE = Doel CodeSystem {0} heeft niet alle content (content = {1}), dus de doelcodes kunnen niet worden gecontroleerd +CONCEPTMAP_GROUP_TARGET_MISSING = Geen doel CodeSystem, dus de doel-codes kunnen niet worden gecontroleerd +CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = De code {0} is niet geldig in het systeem {1} +CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = De property code ''{0}'' is onbekend +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = Het type van deze property zou moeten {1} zijn, niet {0} +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = Aangezien er geen system is gespecifceerd, kan een eenvoudige code niet worden gebruikt +CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = Het codesysteem {0} is niet gevonden, dus codes kunnen niet worden gecontroleerd +CONCEPTMAP_GROUP_TARGET_SERVER_SIDE = Doel CodeSystem {0} wordt alleen ondersteund in de terminologieserver dus worden doel-codes niet gevalideerd om performanceredenen +CONCEPTMAP_GROUP_TARGET_UNKNOWN = Het doel CodeSystem {0} is niet volledig gedefinieerd en gevuld en er is geen targetScope gedefinieerd, dus er zal geen controle op doel-codes worden gedaan +CONCEPTMAP_SHAREABLE_EXTRA_MISSING = Gepubliceerde conceptmaps ZOUDEN zich MOETEN houden aan het ShareableConceptMap profiel, wat zegt dat het element ConceptMap.{0} aanwezig zou moeten zijn, maar het ontbreekt +CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = Door HL7 gepubliceerde conceptmaps MOETEN zich houden aan het ShareableConceptMap profiel, wat zegt dat het element ConceptMap.{0} aanwezig zou moeten zijn, maar het ontbreekt +CONCEPTMAP_SHAREABLE_MISSING = Gepubliceerde conceptmaps ZOUDEN zich MOETEN houden aan het ShareableConceptMap profiel, wat zegt dat het element ConceptMap.{0} aanwezig moet zijn, maar het ontbreekt +CONCEPTMAP_SHAREABLE_MISSING_HL7 = Door HL7 gepubliceerde conceptmaps MOETEN zich houden aan het ShareableConceptMap profiel, wat zegt dat het element ConceptMap.{0} aanwezig moet zijn, maar het ontbreekt +CONCEPTMAP_VS_CONCEPT_CODE_UNKNOWN_SYSTEM = De code ''{1}'' komt uit het system {0} dat niet is gevonden, dus het is onbekend of dezelfde geldig is volgens de waardelijst ''{2}'' +CONCEPTMAP_VS_INVALID_CONCEPT_CODE = De code ''{1}'' uit system {0} is ongeldig in de waardelijst ''{2}'' +CONCEPTMAP_VS_INVALID_CONCEPT_CODE_VER = De code ''{2}'' uit system {0} versie {1} is ongeldig in de waardelijst ''{3}'' +CONCEPTMAP_VS_TOO_MANY_CODES = De conceptmap heeft teveel codes om te valideren ({0}) +CONTAINED_ORPHAN_DOM3 = De contained resource ''{0}'' wordt niet naar verwezen vanuit de omliggende resource, noch verwijst deze zelf naar omliggende resource (dom-3) +CS_SCT_IPS_NOT_IPS = De SNOMED CT code {0} ({1}) is geen deel van de IPS gratis set +Can_only_specify_profile_in_the_context = Kan alleen een profiel specificeren in de context +Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Kan geen onderliggende elementen hebben op een polymorf element - je moet deze eerst opdelen in slices per type (sortElements: {0}:{1}) CapabalityStatement_CS_SP_WrongType = Type komt niet overeen - SearchParameter ''{0}'' type is {1}, maar type is hier {2} +Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Circulaire snapshot-references gedetecteerd; kan geen snapshot genereren (stack = {0}) CodeSystem_CS_VS_IncludeDetails = CodeSystem {0} heeft een ''volledig systeem'' waardelijst {1}, maar de include bevat extra details CodeSystem_CS_VS_Invalid = CodeSystem {0} heeft een ''volledig systeem'' waardelijst {1}, maar deze bevat geen enkele include -CODESYSTEM_CS_VS_EXP_MISMATCH = CodeSystem {0} heeft een ''volledig systeem'' waardelijst {1}, maar dit is een expansion met een onjuist aantal concepten (gevonden {2}, verwacht {3}) CodeSystem_CS_VS_WrongSystem = CodeSystem {0} heeft een ''volledig systeem'' waardelijst {1}, maar het system {2} in de waardelijst komt niet overeen +Code_found_in_expansion_however_ = Code gevonden in expansion, echter: {0} +Coding_has_no_system__cannot_validate = Coding heeft geen system. een code zonder system heeft geen gedefinieerde betekenis en kan niet worden gevalideerd. Er zou een system moeten zijn +Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Contained resource lijkt geen FHIR-type hebben (onbekende naam ''{0}'') +Could_not_match_discriminator_for_slice_in_profile_one = Kan geen overeenkomende discriminator ({0}) bepalen voor slice {1} in profiel {2} - de discriminator {3} heeft geen vaste waarde, binding of aanwezigheidverplichtingen +Could_not_match_discriminator_for_slice_in_profile_other = Kan geen overeenkomende discriminators ({1}) bepalen voor slice {2} in profiel {3} - geen van de {0} discriminators {4} heeft een vaste waarde, binding of aanwezigheidverplichtingen +DISCRIMINATOR_BAD_PATH = Fout bij verwerken padexpressie voor discriminator: {0} (src = ''{1}'') +DUPLICATE_ID = Duplicaat id waarde ''{0}'' +DUPLICATE_JSON_PROPERTY_KEY = De JSON property ''{0}'' is een duplicaat en wordt genegeerd +Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited versies komen exact overeen met delimiter ''{0}'' : {1} vs {2} +Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Afgeleid profiel {0} heeft geen waarde voor derivation en kan dus niet worden verwerkt +Derived_profile__has_no_type = Afgeleid profiel {0} heeft geen type +Details_for__matching_against_Profile_ = Details voor {0} matching tegen profiel {1} +Did_not_find_single_slice_ = Geen enkele slice gevonden: {0} +Did_not_find_type_root_ = Kan type root niet vinden: {0} +Differential_does_not_have_a_slice__b_of_____in_profile_ = Differential in profiel {5} heeft geen slice bij {6} (op {0}, positie {1} of {2} / {3} / {4}) +Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential gaat in ''{0} (@ {1})'', maar de basis doet dat niet en er is niet een enkelvoudig vast type. Het type is {2}. Dit wordt nog niet ondersteund +Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = Discriminator ({0}) is gebaseerd op elementaanwezigheid, maar slice {1} heeft geen min>=1 of max=0 +Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = Discriminator ({1}) is gebaseerd op type, maar slice {2} in {3} heeft {0} typen: {4} +Discriminator__is_based_on_type_but_slice__in__has_no_types = Discriminator ({0}) is gebaseerd op type, maar slice {1} in {2} heeft geen typen +Display_Name_WS_for__should_be_one_of__instead_of_one = Verkeerde whitespace in weergavenaam ''{4}'' voor {1}#{2}. Geldige weergave is {3} (voor de taal/talen ''{5}'') +Display_Name_WS_for__should_be_one_of__instead_of_other = Verkeerde whitespace in weergavenaam ''{4}'' voor {1}#{2}. Geldige weergave is een van de volgende {0} opties: {3} (voor de taal/talen ''{5}'') +Display_Name_for__should_be_one_of__instead_of_one = Verkeerde weergavenaam ''{4}'' voor {1}#{2} - moet zijn ''{3}'' (voor taal/talen ''{5}'') +Display_Name_for__should_be_one_of__instead_of_other = Verkeerde weergavenaam ''{4}'' voor {1}#{2} - moet een zijn van {0} keuzes: ''{3}'' voor de taal/talen ''{5}'' +Does_not_match_slice_ = Komt niet overeen met slice ''{0}'' (discriminator: {1}) +Duplicate_Resource_ = Duplicaat resource {0} van type {3} (bestaande versie {2}, nieuwe versie {1}) +ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = Fout in constraint ''{0}'': {1} +ED_INVARIANT_DIFF_NO_SOURCE = De invariant {0} gedefinieerd in de differential mag geen source hebben, tenzij deze gelijk is aan het profiel +ED_INVARIANT_EXPRESSION_CONFLICT = De constraint ''{0}'' heeft een expressie ''{1}'', die verschilt van de eerdere gegeven expressie ''{2}'' (invariants mogen herhalen, maar kunnen niet verschillen) +ED_INVARIANT_EXPRESSION_ERROR = Fout in constraint ''{0}'' met expressie ''{1}'': {2} +ED_INVARIANT_KEY_ALREADY_USED = De constraint sleutel ''{0}'' bestaat al in het basisprofiel ''{1}'' +ED_INVARIANT_NO_EXPRESSION = De constraint ''{0}'' heeft geen calculeerbare expressie, dus validators zullen deze niet kunnen controleren +ED_INVARIANT_NO_KEY = De constraint heeft geen sleutel dus kan de content niet worden gevalideerd +ED_PATH_WRONG_TYPE_MATCH = Het pad moet ''{0}'' zijn en niet ''{1}'', als de typelijst niet is beperkt +ED_SEARCH_EXPRESSION_ERROR = Fout in zoekexpressie ''{0}'': {1} +ELEMENT_CANNOT_BE_NULL = Het element mag niet ''null'' zijn +ERROR_GENERATING_SNAPSHOT = Fout bij genereren snapshot: {0} (dit komt meestal door een probleem in de differential) +EXTENSION_CONTEXT_UNABLE_TO_CHECK_PROFILE = De extensie {0} specificeert een context {1} maar de validator kan momenteel niet controleren of het profiel geldig is of niet +EXTENSION_CONTEXT_UNABLE_TO_FIND_PROFILE = De extensie {0} specificeert een context {1} maar de validator kan dat profiel niet vinden +EXTENSION_EXTM_CONTEXT_WRONG_XVER = De modifier extensie {0} uit FHIR version {3} is niet toegestaan om te worden gebruikt op dit punt (toegestaan = {1}; dit element is [{2}; dit is een waarschuwing aangezien contexten gewijzigd mogen worden tussen versies van FHIR) +EXTENSION_EXTP_CONTEXT_WRONG_XVER = De extensie {0} van FHIR versie {3} is niet toegestaan om te worden gebruikt op dit punt (toegestaan = {1}; dit element is [{2}; Dit is een waarschuwing aangezien contexten gewijzigd mogen worden tussen versies van FHIR) +EXT_VER_URL_IGNORE = Extensie URL''s hebben geen versies. De validator heeft de versie genegeerd en de extensie toch verwerkt +EXT_VER_URL_MISLEADING = De extension URL bevat een ''|'' waardoor deze op een geversioneerde url lijkt. Dat is het niet en dit is verwarrend voor implementers +EXT_VER_URL_NOT_ALLOWED = De extensie URL mag geen versie bevatten +EXT_VER_URL_NO_MATCH = Extensie URL''s hebben geen versies. De validator kon deze url niet bereiken, met of zonder versie-gebaseerde verwijzing +EXT_VER_URL_REVERSION = De extensie URL mag geen versie bevatten. De extensie is gevalideerd tegen versie {0} van de extensie +Element_must_have_some_content = Element moet inhoud hebben +Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Fout bij {0}#{1}: het doelprofiel {2} is geen geldige inperking op de basis ({3}) +Error_at_path__Slice_for_type__has_more_than_one_type_ = Fout bij pad {0}: Slice voor type ''{1}'' heeft meerdere typen ''{2}'' +Error_at_path__Slice_for_type__has_wrong_type_ = Fout bij pad {0}: Slice voor type ''{1}'' heeft verkeerde type ''{2}'' +Error_at_path__Slice_name_must_be__but_is_ = Fout bij pad {0}: Slicenaam moet zijn ''{1}'' maar is ''{2}'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.count() > 1 +Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.path != ''$this'' +Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.type != ''type'' +Error_at_path__in__Type_slicing_with_slicingordered__true = Fout bij pad {0} in {1}: Type slicing met slicing.ordered = true +Error_expanding_ValueSet_running_without_terminology_services = Fout bij expansie van ValueSet: geen terminologieservices +Error_generating_table_for_profile__ = Fout bij maken van tabel voor profiel {0}: {1} +Error_in_profile__at__Base_isSummary___derived_isSummary__ = Fout in profiel {0} in {1}: Basis isSummary = {2}, afgeleide isSummary = {3} +Error_parsing_ = Fout bij verwerken {0}:{1} +Error_parsing_JSON_ = Fout bij verwerken JSON: {0} +Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Fout bij verwerken JSON: de primitieve waarde moet een boolean zijn +Error_parsing_JSON_the_primitive_value_must_be_a_number = Fout bij verwerken JSON: de primitieve waarde moet een getal zijn +Error_parsing_JSON_the_primitive_value_must_be_a_string = Fout bij verwerken JSON: de primitieve waarde moet een string zijn +Error_parsing_Turtle_ = Fout bij verwerken Turtle: {0} +Error_parsing_XHTML_ = Fout bij verwerken XHTML: {0} +Error_reading__from_package__ = Fout bij lezen {0} uit package {1}#{2}: {3} +Error_validating_code_running_without_terminology_services = Fout bij valideren van code ''{0}'' in systeem ''{1}'' omdat de validator draait zonder terminologieservices +Extension_EXTM_Context_Wrong = De modifier extensie {0} is hier niet toegestaan (toegestaan = {1}; dit element is {2}) Extension_EXTP_Context_Wrong = De extensie {0} mag niet op dit punt worden gebruikt (toegestaan = {1}; dit element is {2}) -Extension_EXTM_Context_Wrong = De modifier extension {0} is hier niet toegestaan (toegestaan = {1}; dit element is {2}) Extension_EXT_Count_Mismatch = Aantal extensies komt niet overeen: verwacht {0}, maar gevonden {1} Extension_EXT_Count_NotFound = Aantal extensies komt niet overeen: kan extensie niet vinden: {0} Extension_EXT_Fixed_Banned = Geen extensies toegestaan, aangezien de opgegeven vaste waarde geen extensies bevat @@ -48,38 +241,269 @@ Extension_EXT_SubExtension_Invalid = Sub-extensie url ''{0}'' is niet gedefiniee Extension_EXT_Type = De definitie van extensie ''{0}'' bevat typen {1}, gevonden is echter {2} Extension_EXT_URL_Absolute = Extension.url moet een absolute URL zijn Extension_EXT_Unknown = Onbekende extensie {0} -Extension_EXT_Unknown_NotHere = De extensie {0} is onbekend en hier niet toegestaan -Extension_EXT_Url_NotFound = Extension.url is verplicht +Extension_EXT_Unknown_NotHere = De extensie {0} is niet gevonden en dus hier niet toegestaan +Extension_EXT_Url_NotFound = Extension.url is verplicht voor identificatie, gebruik en validatie van de extensie Extension_EXT_Version_Internal = Extension.url ''{0}'' controlestatus ongeldig Extension_EXT_Version_Invalid = Extension.url ''{0}'' is niet geldig (ongeldige versie ''{1}'') Extension_EXT_Version_InvalidId = Extension.url ''{0}'' is niet geldig (ongeldig element.id ''{1}'') -Extension_EXT_Version_NoChange = Extension url ''{0}'' is niet geldig (element.id ''{1}'' is geldig, maar kan niet worden gebruikt in een meerdere-versies-paradigma omdat de relevante versies geen wijzigingen bevatten) +Extension_EXT_Version_NoChange = Extensie url ''{0}'' is niet geldig (element.id ''{1}'' is geldig, maar kan niet worden gebruikt in een meerdere-versies-paradigma omdat de relevante versies geen wijzigingen bevatten) +Extension_PROF_Type = De definitie voor profiel ''{0}'' is voor het type {1} maar gevonden type is {2} +FHIRPATH_ARITHMETIC_MINUS = Fout in datumberekening: kan type {0} niet afhalen van {1} +FHIRPATH_ARITHMETIC_PLUS = Fout in datumberekening: kan type {0} niet optellen bij {1} +FHIRPATH_ARITHMETIC_QTY = Fout in datumberekening: poging om een eindige quantity duration tijdseenheid erbij op te tellen {0} +FHIRPATH_ARITHMETIC_UNIT = Fout in datumberekening: niet-herkende tijdeenheid {0} +FHIRPATH_AS_COLLECTION = Poging om ''as()'' te gebruiken op meer dan één item (''{0}'', ''{1}'') +FHIRPATH_CANNOT_USE = Fout bij evalueren FHIRPath expressie: Kan {0} niet gebruiken in deze context omdat {1} +FHIRPATH_CANT_COMPARE = Fout bij evalueren FHIRPath expressie: Kan geen waarden vergelijken van type {0} en {1} +FHIRPATH_CHECK_FAILED = Fout bij evalueren FHIRPath expressie: Controle {0} is mislukt +FHIRPATH_CHOICE_NO_TYPE_SPECIFIER = De expressie ''{0}'' verwijst naar een element dat een keuze is, maar geen ofType() heeft zodat SQL-weergave de volledige elementnaam vooraf kunnen bepalen +FHIRPATH_CHOICE_SPURIOUS_TYPE_SPECIFIER = De expressie ''{0}'' verwijst naar een element dat geen keuze is, maar ofType() heeft. SQL-weergave zullen waarschijnlijk vooraf een incorrecte volledige elementnaam bepalen +FHIRPATH_CODED_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een string, code, uri, Coding, CodeableConcept met volgorde maar gevonden {1} +FHIRPATH_COLLECTION_STATUS_CONTEXT = De context is inherent een collectie dus zal de expressie ''{0}'' mogelijk mislukken, een fout geven, of false teruggeven als er meer dan één item is in de context ({2}) +FHIRPATH_COLLECTION_STATUS_OPERATION_LEFT = De linker kant is inherent een collectie dus zal de expressie ''{0}'' mogelijk mislukken, een fout geven, of false teruggeven als er meer dan één item wordt geëvalueerd in de context +FHIRPATH_COLLECTION_STATUS_OPERATION_RIGHT = De rechter kant is inherent een collectie dus zal de expressie ''{0}'' mogelijk mislukken, een fout geven, of false teruggeven als er meer dan één item wordt geëvalueerd in de context +FHIRPATH_COLLECTION_STATUS_PARAMETER = Parameter {1}t is inherent een collectie dus zal de expressie ''{0}'' mogelijk mislukken, een fout geven, of false teruggeven als er meer dan één item is in de parameterwaarde ({2}) +FHIRPATH_CONTINUOUS_ONLY = Fout bij evaluatie van FHIRPath-expressie: De functie {0} kan alleen worden gebruikt op een decimaal of datum type maar gevonden {1} +FHIRPATH_DECIMAL_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt met decimal maar gevonden {1} +FHIRPATH_DISCRIMINATOR_BAD_NAME = Ongeldige functienaam {0}() in discriminator +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = Onjuiste expressiesyntax in discriminator (const) +FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = Onjuiste expressiesyntax in discriminator (groep ''{0}'') +FHIRPATH_DISCRIMINATOR_CANT_FIND = Kan discriminator niet vinden in definities: {0} in profiel {1} op element {2}, kijkende in profiel {3} +FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Kan discriminator {0} op {2} niet vinden, gevonden in de definities omdat de extensie {1} uit profiel {3} niet is gevonden +FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Fout in discriminator bij {1}: geen onderliggende elementen, {0} typeprofielen +FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Fout in discriminator bij {1}: geen onderliggende elementen, {0} typen +FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Fout in discriminator bij {0}: sliced element gevonden bij opzoeken van de vaste waarde voor een van de slices +FHIRPATH_DISCRIMINATOR_NOTYPE = Fout in discriminator bij {0}: geen onderliggende elementen, geen type +FHIRPATH_DISCRIMINATOR_NO_CODE = Onjuist gebruik van ofType() in discriminator - Type heeft geen code op {0} +FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = onjuist gebruik van resolve() in discriminator - {0} mogelijke typen op {1} (kan er maar een zijn) +FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = Onjuist gebruik van resolve() in discriminator - Type op {0} is niet Reference {1} +FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = Onjuist gebruik van resolve() in discriminator - geen type op element {0} +FHIRPATH_DISCRIMINATOR_TYPE_NONE = Onjuist gebruik van ofType() in discriminator - geen type op element {0} +FHIRPATH_FOCUS_other = Fout bij evalueren FHIRPath expressie: focus voor {0} kan maar een warde hebben, maar heeft {0} waarden +FHIRPATH_HO_HOST_SERVICES = Interne fout bij evalueren FHIRPath expressie: er zijn geen host services gespecificeerd ({0}) +FHIRPATH_INVALID_TYPE = Het type {0} is ongeldig +FHIRPATH_LEFT_VALUE_other = Fout bij evalueren FHIRPath expressie: linker operandus van {1} kan maar 1 waarde hebben, maar heeft {0} waarden +FHIRPATH_LEFT_VALUE_WRONG_TYPE = Fout bij evalueren FHIRPath expressie: linker operandus van {0} heeft het verkeerde type {1} +FHIRPATH_LOCATION = (bij {0}) +FHIRPATH_NOT_A_COLLECTION = Gebruik van een collectie-operator gevonden op iets dat geen collectie is bij ''{0}'' - controleer of er geen problemem in de expressiesyntax zitten +FHIRPATH_NOT_IMPLEMENTED = Fout bij evalueren FHIRPath expressie: De functie {0} is niet geemplementeerd +FHIRPATH_NO_COLLECTION = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een singleton value maar gevonden {1} +FHIRPATH_NO_TYPE = Fout bij evalueren FHIRPath-expressie: Geen type gegeven bij {1} +FHIRPATH_NUMERICAL_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt met integer, decimal of Quantity maar gevonden {1} +FHIRPATH_OFTYPE_IMPOSSIBLE = Het opgegeven type in ofType() is {1} wat geen mogelijke kandidaat is voor de bestaande typen ({0}) in de expressie {2}. Controleer de paden en typen om zeker te weten dat dit de intentie is +FHIRPATH_OP_INCOMPATIBLE = Fout bij evalueren FHIRPath expressie {0}: linker en rechter operandus hebben incompatibele of ongeldige typen ({1}, {2}) +FHIRPATH_ORDERED_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op collecties met een volgorde +FHIRPATH_PARAM_WRONG = Fout bij evalueren FHIRPath expressie: Het expressietype {0} wordt niet ondersteund voor parameter {1} op functie {2} +FHIRPATH_PRIMITIVE_ONLY = Fout bij evalueren FHIRPath-expressie: de functie {0} kan alleen op primitieven worden gebruikt +FHIRPATH_REDEFINE_VARIABLE = De variabele '{0}'' kan niet opnieuw worden gedefinieerd' +FHIRPATH_REFERENCE_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een string, uri, canonical of Reference met volgorde maar gevonden {1} +FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Probleem met gebruik van resolve() - profiel {0} op {1} is niet gevonden +FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Onjuist gebruik van resolve() in discriminator - {0} mogelijke doeltypen op {1} (kan er maar één zijn) +FHIRPATH_RIGHT_VALUE_other = Fout bij evalueren FHIRPath-expressie: rechter operandus van {1} kan maar 1 waarde hebben, maar heeft {0} waarden +FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Fout bij evalueren FHIRPath expressie: rechter operandus van {0} heeft het verkeerde type {1} +FHIRPATH_STRING_ORD_ONLY = Fout bij evaluatie van FHIRPath-expressie: De functie {0} kan alleen worden gebruikt op een geordende collectie van string, uri, code, id maar gevonden {1} +FHIRPATH_STRING_SING_ONLY = Fout bij evalueren FHIRPath-expressie: De functie {0} is alleen van toepassing op string, uri, code en id maar gevonden {1} +FHIRPATH_UNABLE_BOOLEAN = Kan niet verwerken als een boolean: {0} +FHIRPATH_UNKNOWN_CONSTANT = Fout bij evalueren FHIRPath expressie: Ongeldige FHIR constante {0} +FHIRPATH_UNKNOWN_CONTEXT = Onbekende context bij toepassen FHIRPath expressie: {0} +FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Onbekend contextelement bij toepassen FHIRPath expressie: {0} +FHIRPATH_UNKNOWN_EXTENSION = Referentie naar onbekende extensie - controleer of de url ''{0}'' klopt +FHIRPATH_UNKNOWN_NAME = Fout bij evalueren FHIRPath expressie: De naam ''{0}'' is niet geldig voor een van de mogelijke typen: {1} +FHIRPATH_UNKNOWN_TYPE = Fout bij evalueren FHIRPath-expressie: het type ''{0}'' is onbekend of wordt niet ondersteund bij {1} +FHIRPATH_WRONG_PARAM_TYPE = Fout bij evalueren FHIRPath expressie: Het parametertype {2} is niet geldig voor {0} parameter {1}. verwacht {3} Fixed_Type_Checks_DT_Address_Line = Verwacht {0}, maar gevonden {1} line elementen Fixed_Type_Checks_DT_Name_Family = Verwacht {0}, maar gevonden {1} family elementen Fixed_Type_Checks_DT_Name_Given = Verwacht {0}, maar gevonden {1} given elementen Fixed_Type_Checks_DT_Name_Prefix = Verwacht {0}, maar gevonden {1} prefix elementen Fixed_Type_Checks_DT_Name_Suffix = Verwacht {0}, maar gevonden {1} suffix elementen +Found__items_for__resolving_discriminator__from_ = {0} items gevonden voor {1} bij controle van discriminator {2} van {3} +IG_DEPENDENCY_CLASH_CANONICAL = Het packageId {0} wijst naar de canonical {1} die niet consistent is met de opgegeven canonical {2} +IG_DEPENDENCY_CLASH_PACKAGEID = De canonical {0} wijst naar de package {1} die niet consistent is met de opgegeven packageId {2} +IG_DEPENDENCY_DIRECT = De url zou direct naar de ImplementationGuide resource moeten wijzen (bijv. met ''/ImplementationGuide/'') +IG_DEPENDENCY_EXCEPTION = Exceptie bij controle packageversie-consistentie: {0} +IG_DEPENDENCY_INVALID_PACKAGEID = Het packageId {0} is niet geldig +IG_DEPENDENCY_INVALID_PACKAGE_VERSION = De versie {0} is geen geldige NPM-packageversie +IG_DEPENDENCY_NO_PACKAGE = Er kon geen NPM package-id worden vastgesteld dus kan de versieconsistentie niet worden gecontroleerd +IG_DEPENDENCY_NO_VERSION = Er is geen versie gespecificeerd voor het package dus kan de versieconsistentie niet worden gecontroleerd +IG_DEPENDENCY_PACKAGE_UNKNOWN = Het package {0} is niet gevonden dus kan de versieconsistentie niet worden gecontroleerd +IG_DEPENDENCY_VERSION_ERROR = De ImplementationGuide is gebaseerd op FHIR-versie {0} maar package {1} is gebaseerd op FHIR-versie {2}. Gebruik in plaats daarvan package {3} +IG_DEPENDENCY_VERSION_WARNING = De ImplementationGuide is gebaseerd op FHIR-versie {0} maar package {1} is gebaseerd op FHIR-versie {2}. In het algemeen zouden versie-mismatches moeten worden voorkomen - sommige tools zullen dit met wisselend succes proberen op te lossen, maar andere zullen het niet eens proberen +ILLEGAL_COMMENT_TYPE = De fhir_comments property moet een array van strings zijn +ILLEGAL_PROPERTY = De eigenschap ''{0}'' is ongeldig +INV_FAILED = Fout bij constraint: {0} +INV_FAILED_SOURCE = Constraint faalde: {0} (gedefinieerd in {1}) +Illegal_path__in_differential_in__illegal_character_ = Onjuist pad ''{0}'' in differential in {1}: ongeldige tekens ''{2}'' +Illegal_path__in_differential_in__illegal_characters_ = Onjuist pad ''{0}'' in differential in {1}: ongeldige tekens [] +Illegal_path__in_differential_in__must_start_with_ = Onjuist pad ''{0}'' in input differential in {1}: moet beginnen met {2}.{3} +Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Onjuist pad ''{0}'' in differential in {1}: naamdeel is meer dan 64 tekens lang +Illegal_path__in_differential_in__name_portion_mising_ = Onjuist pad ''{0}'' in differential in {1}: naamdeel mist (''..'') +Illegal_path__in_differential_in__no_unicode_whitespace = Onjuist pad ''{0}'' in differential in {1}: geen unicode whitespace Internal_INT_Bad_Type = Vaste waarde heeft onbekend type {0} -Language_XHTML_Lang_Different1 = Resource heeft een taal ({0}) en XHTML heeft een taal (lang) ({1}), maar deze komen niet overeen -Language_XHTML_Lang_Different2 = Resource heeft een taal ({0}) en XHTML heeft een taal (xml:lang) ({1}), maar deze komen niet overeen +Internal_error___type_not_known_ = Interne fout - type onbekend {0} +Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist = Ongeldige slicing: er is meer dan één type slice op {0}, maar een daarvan ({1}) heeft min = 1, zodat andere slices niet kunnen bestaan +JSON_COMMA_EXTRA = Er is een extrra comma aan het einde van de {0} in de JSON +JSON_COMMA_MISSING = Er ontbreekt een comma in de JSON +JSON_COMMENTS_NOT_ALLOWED = Commentaar is niet toegestaan in JSON +JSON_PROPERTY_NO_QUOTES = De JSON property ''{0}'' heeft geen aanhalingstekens rondom de naam van de property +JSON_PROPERTY_VALUE_NO_QUOTES = De JSON property ''{0}'' heeft geen aanhalingstekens rondom de waarde van de property ''{1}'' +LIQUID_SYNTAX_COLON = Fout bij evaluatie {0}: limit wordt niet gevolgd door '':'' +LIQUID_SYNTAX_EXPECTING = Script {0}: Gevonden ''{1}'' verwacht ''{2}'' parsing-cyclus +LIQUID_SYNTAX_INCLUDE = Script {0}: fout bij lezen include: {1} +LIQUID_SYNTAX_LOOP = Script {0}: fout bij lezen loop: {1} +LIQUID_SYNTAX_NOTERM = Script {0}: Niet-afgesloten Liquid statement {1} +LIQUID_SYNTAX_NUMBER = Fout bij evaluatie {0}: limiet niet gevolgd door een getal +LIQUID_SYNTAX_UNEXPECTED = Fout bij evaluatie {0}: niet-verwachte content bij {1} +LIQUID_SYNTAX_UNTERMINATED = Script {0}: niet-afgesloten string parsing-cyclus gevonden +LIQUID_UNKNOWN_FILTER = Onbekend Liquid filter ''{0}'' +LIQUID_UNKNOWN_FLOW_STMT = Script {0}: onbekend flowcontrol statement ''{1}'' +LIQUID_UNKNOWN_NOEND = Script {0}: scripteinde gevonden bij zoeken naar {1} +LIQUID_UNKNOWN_SYNTAX = Onverwachte syntaxparsing liquid-statement +LIQUID_VARIABLE_ALREADY_ASSIGNED = Liquid fout: de variabele ''{0}'' heeft al een toegekende waarde +LIQUID_VARIABLE_ILLEGAL = Liquid fout: de variabelenaam ''{0}'' kan niet worden gebruikt +LOGICAL_MODEL_NAME_MISMATCH = De naam ''{0}'' komt niet overeen met de verwachte naam ''{1}'' +LOGICAL_MODEL_QNAME_MISMATCH = De QName ''{0}'' komt niet overeen met de verwachte QName ''{1}'' +Language_XHTML_Lang_Different1 = Resource heeft een taal ({0}) en XHTML heeft een taal (lang) ({1}), maar deze komen niet overeen +Language_XHTML_Lang_Different2 = Resource heeft een taal ({0}) en XHTML heeft een taal (xml:lang) ({1}), maar deze komen niet overeen Language_XHTML_Lang_Missing1 = Resource heeft een taal, maar de XHTML heeft geen lang of xml:lang attribuut (beide zijn nodig - zie https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) Language_XHTML_Lang_Missing2 = Resource heeft een taal, maar de XHTML heeft geen lang attribuut (beide zijn nodig - zie https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) Language_XHTML_Lang_Missing3 = Resource heeft een taal, maar de XHTML heeft geen xml:lang attribuut (beide zijn nodig - zie https://www.w3.org/TR/i18n-html-tech-lang/#langvalues) +MEASURE_MR_GRPST_POP_UNK_CODE = De code voor deze groep-stratifier komt niet overeen met de measure-definitie +MEASURE_MR_GRP_DUPL_CODE = De code voor deze groep wordt gedupliceerd door een andere groep +MEASURE_MR_GRP_MISSING_BY_CODE = Het MeasureReport bevat geen groep voor de groep {0} +MEASURE_MR_GRP_NO_CODE = Groep moet een code hebben die overeenkomt met de groep-definitie in de measure +MEASURE_MR_GRP_NO_USABLE_CODE = Geen van de gevonden codes zijn bruikbaar voor vergelijking - zowel system als code zijn vereist op tenminste een code +MEASURE_MR_GRP_NO_WRONG_CODE = De gevonden code ({0}) komt niet overeen met de code in het MeasureReport ({1}) +MEASURE_MR_GRP_POP_COUNT_MISMATCH = Aantal {0} en aantal subjects {1} komen niet overeen +MEASURE_MR_GRP_POP_DUPL_CODE = De code van deze groep populatie wordt gedupliceerd door een andere groep +MEASURE_MR_GRP_POP_NO_CODE = Groep zou een code moeten hebben die overeenkomt met de populatie-definitie van de groep in de measure +MEASURE_MR_GRP_POP_NO_COUNT = Aantal moet aanwezig zijn in reports waar type niet ''subject-list'' is +MEASURE_MR_GRP_POP_NO_SUBJECTS = Reports waar het type niet ''subject-list'' is, horen geen subjects te hebben +MEASURE_MR_GRP_POP_UNK_CODE = De code van deze groep populatie komt niet overeen met de measure-definitie +MEASURE_MR_GRP_UNK_CODE = De code voor deze group komt niet overeen met de measure-definitie +MEASURE_MR_M_SCORING_UNK = Het scoringsysteem in deze measure is onbekend, dus de measureScore waarden kunnen niet worden gecontroleerd +MEASURE_MR_SCORE_FIXED = Deze waarde is vastgezet door de Measure op ''{0}'' +MEASURE_MR_SCORE_PROHIBITED_MS = Geen measureScore als de scoring van het bericht ''cohort'' is +MEASURE_MR_SCORE_PROHIBITED_RT = Geen measureScore als het type report ''data-collection'' is +MEASURE_MR_SCORE_REQUIRED = Een measureScore is verplicht als de Measure.scoring={0} +MEASURE_MR_SCORE_UNIT_PROHIBITED = Een measureScore voor deze Measure Scoring ({0}) zou geen eenheden moeten hebben +MEASURE_MR_SCORE_UNIT_REQUIRED = Een eenheid is verplicht als het scoringtype {0} is +MEASURE_MR_SCORE_VALUE_INVALID_01 = De waarde is ongeldig - deze moeten tussen 0 en 1 liggen +MEASURE_MR_SCORE_VALUE_REQUIRED = Een waarde is verplicht als de Measure.scoring = {0} is +MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Fout in {0}: Gecompileerde versie van CQL is niet geldig +MEASURE_M_CRITERIA_CQL_ERROR = Fout in {0}: ''{1}'' +MEASURE_M_CRITERIA_CQL_LIB_DUPL = Meerdere overeenkomstige bibiotheken voor de namespace {0} +MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = Geen overeenkomstige bibliotheek gevonden voor de namespace {0} +MEASURE_M_CRITERIA_CQL_NOT_FOUND = De functie {1} bestaat niet in de bibliotheek {0} +MEASURE_M_CRITERIA_CQL_NO_ELM = Fout in {0}: Geen gecompileerde versie van CQL gevonden +MEASURE_M_CRITERIA_CQL_NO_LIB = Geen CQL-bibliotheken gevonden bij deze Measure +MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = Als de CQL-expressie geen namespace heeft, dan kan er slechts een Library voor de measure zijn +MEASURE_M_CRITERIA_UNKNOWN = De expressietaal {0} wordt niet ondersteund, dus deze kan niet worden gevalideerd +MEASURE_M_GROUP_CODE = Groepen zouden een code moeten hebben als er meer dan een groep is +MEASURE_M_GROUP_POP = Measure groepen zouden tenminste een populatie moeten bevatten +MEASURE_M_GROUP_POP_NO_CODE = Een measure groep-populatie zou een code moeten hebben als er meer dan een populatie is +MEASURE_M_GROUP_STRATA_COMP_NO_CODE = Een measure groep-stratifier component zou een code moeten hebben als meer dan één populatie is +MEASURE_M_GROUP_STRATA_NO_CODE = Een measure groep-stratifier zouden een code moeten bevatten als er meer dan een populatie is +MEASURE_M_LIB_UNKNOWN = De Library {0} is niet gevonden, dus validatie van expressies is mogelijk niet correct +MEASURE_M_NO_GROUPS = Een measure moet tenminste een groep bevatten +MEASURE_SHAREABLE_EXTRA_MISSING = Gepubliceerde measures ZOUDEN zich MOETEN houden aan het ShareableMeasure profiel, wat zegt dat het element Measure.{0} aanwezig zou moeten zijn, maar het ontbreekt +MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = Door HL7 gepubliceerde measures MOETEN zich houden aan het ShareableMeasure profiel, wat zegt dat het element Measure.{0} aanwezig zou moeten zijn, maar het ontbreekt +MEASURE_SHAREABLE_MISSING = Gepubliceerde measures ZOUDEN zich MOETEN houden aan het ShareableMeasure profiel, wat zegt dat het element Measure.{0} aanwezig moet zijn, maar het ontbreekt +MEASURE_SHAREABLE_MISSING_HL7 = Door HL7 gepubliceerde measures MOETEN zich houden aan het ShareableMeasure profiel, wat zegt dat het element Measure.{0} aanwezig moet zijn, maar het ontbreekt +MSG_DEPENDS_ON_DEPRECATED = De {0} {1} is verouderd +MSG_DEPENDS_ON_DRAFT = De {0} {1} is een draft resource +MSG_DEPENDS_ON_EXPERIMENTAL = De {0} {1} is een experimentele resource +MSG_DEPENDS_ON_EXTENSION = extensie +MSG_DEPENDS_ON_PROFILE = profiel +MSG_DEPENDS_ON_RETIRED = De {0} {1} is retired +MSG_DEPENDS_ON_WITHDRAWN = De {0} {1} is terugetrokken +MSG_DEPRECATED = Referentie naar verouderde {2} {0} +MSG_DEPRECATED_SRC = Referentie naar verouderde {2} {0} van {1} +MSG_DRAFT = Referentie naar draft {2} {0} +MSG_DRAFT_SRC = Referentie naar draft {2} {0} van {1} +MSG_EXPERIMENTAL = Referentie naar experimentele {2} {0} +MSG_EXPERIMENTAL_SRC = Referentie naar experimentele {2} {0} van {1} +MSG_RETIRED = Referentie naar retired {2} {0} +MSG_RETIRED_SRC = Referentie naar retired {2} {0} van {1} +MSG_WITHDRAWN = Referentie naar teruggetrokken {2} {0} +MSG_WITHDRAWN_SRC = Referentie naar teruggetrokken {2} {0} van {1} +MULTIPLE_LOGICAL_MODELS_other = {0} logische modellen gevonden in de aangegeven profielen, dus niet in staat logisch model te verwerken (kan er maar een zijn, gevonden {1}) +Measure_MR_M_None = Er is geen Measure aangegeven, dus er kan geen validatie worden gedaan tegen de Measure +Measure_MR_M_NotFound = De Measure ''{0}'' is niet gevonden, dus er kan geen validatie worden gedaan tegen de Measure Meta_RES_Security_Duplicate = Duplicaat security label {0} MustSupport_VAL_MustSupport = Het element {0} is niet gemarkeerd als ''mustSupport'' in het profiel {1}. Overweeg het element niet gebruiken, of om het element als mustSupport te markeren in het profiel +NDJSON_EMPTY_LINE_WARNING = De NOJSON bron bevat een lege regel. Dit wordt mogelijk niet geaccepteerd door sommige processors +NO_VALID_DISPLAY_FOUND_one = Er zijn geen geldige weergavenamen gevonden voor {1}#{2} in de taal {4} +NO_VALID_DISPLAY_FOUND_other = Er zijn geen geldige weergavenamen gevonden voor {1}#{2} in de talen {4} +Named_items_are_out_of_order_in_the_slice = Volgorde van benoemde items in de slice klopt niet +No_ExpansionProfile_provided = Geen ExpansionProfile gevonden +No_Expansion_Parameters_provided = Geen Expansion Parameters gevonden +No_Parameters_provided_to_expandVS = Geen Parameters gevonden voor expandVS +No_path_on_element_Definition__in_ = Geen pad op elementdefinitie {0} in {1} +No_path_on_element_in_differential_in_ = Geen pad op element in differential in {0} +No_path_value_on_element_in_differential_in_ = Geen padwaarde op element in differential in {0} +No_processing_instructions_allowed_in_resources = Geen processing instructions toegestaan in resources +No_reference_resolving_discriminator__from_ = Geen reference bij controle van discriminator {0} in {1} +No_type_found_on_ = Geen type gevonden op ''{0}'' +No_validator_configured = Geen validator geconfigureerd +Node_type__is_not_allowed = Nodetype {0} is niet toegestaan +None_of_the_provided_codes_are_in_the_value_set_one = De opgegeven code {2} staat niet in de waardelijst ''{1}'' +None_of_the_provided_codes_are_in_the_value_set_other = Geen van de opgegeven codes {2} staan niet in de waardelijst ''{1}'' +Not_done_yet = Nog niet gedaan +Not_done_yet_ValidatorHostServicescheckFunction = Nog niet gedaan (ValidatorHostServices.checkFunction) +Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = Nog niet gedaan (ValidatorHostServices.conformsToProfile), wanneer item geen element is +Not_done_yet_ValidatorHostServicesexecuteFunction = Nog niet gedaan (ValidatorHostServices.executeFunction) +Not_done_yet__resolve__locally_2 = Nog niet gedaan - lokaal opzoeken van {0} (2) +Not_handled_yet_sortElements_ = Nog niet ondersteund (sortElements: {0}:{1}) +OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = Dit object kan geen keyed Array in Json zijn omdat deze niet twee kindwaarden in de definities heeft (kindwaarden = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = Dit object is gedefinieerd als keyed Array in Json maar de in de definities benoemde value eigenschap is een keuze - dit wordt niet ondersteund (value eigenschap = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = Dit object is gedefinieerd als keyed Array in Json maar de in de definities benoemde value eigenschap is een lijst - dit wordt niet ondersteund (value eigenschap = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = Dit object is gedefinieerd als keyed Array in Json maar de definitie benoemt het eerste element niet als key (kindwaarden = {0}) +OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = Dit object is gedefinieerd als keyed Array in Json maar de key eigenschap benoemd in de definities is geen primitief type (kindwaarden = {0}, type = {1}) +Object_must_have_some_content = Object moet inhoud hebben +PACKAGE_VERSION_MISMATCH = FHIR-versie incorrect in package {0}: versie is {2} moet moet zijn {1} (pad: {3}) +PATTERN_CHECK_STRING = Het pattern [{0}] gedefinieerd in het profiel {1} is niet gevonden. Issues: {2} +PRIMITIVE_MUSTHAVEVALUE_MESSAGE = De elementdefinitie ``{0}`` in het profiel ''{1}'' vereist dat het element een waarde heeft +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = De elementdefinitie ``{0}`` in het profiel ''{1}'' vereist dat als het element geen waarde heeft, de extensie ''{2}'' aanwezig moet zijn +PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = De elementdefinitie ``{0}`` in het profiel ''{1}'' vereist dat als het element geen waarde heeft, een van de extensies ''{2}'' aanwezig moet zijn +Parser_Type__not_supported = Parsertype {0} niet ondersteund +Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Probleem bij controle van slicing-expressie voor element in profiel {0} pad {1} (fhirPath = {2}): {3} +Problem_processing_expression__in_profile__path__ = Probleem bij verwerken van expressie {0} in profiel {1} pad {2}: {3} Profile_EXT_Not_Here = De extensie {0} is niet toegestaan om hier te gebruiken (gebaseerd op context invariant ''{1}'') Profile_VAL_MissingElement = Ontbrekend element ''{0}'' - verplicht door vaste waarde in het profiel {1} Profile_VAL_NotAllowed = Het element {0} staat in de instance maar is niet toegestaan in de {1} volgens het profiel -Measure_MR_M_None = Er is geen Measure aangegeven, dus er kan geen validatie worden gedaan tegen de Measure -Measure_MR_M_NotFound = De Measure ''{0}'' is niet gevonden, dus er kan geen validatie worden gedaan tegen de Measure -Questionnaire_QR_Item_BadOption = De opgegeven code {1} in systeem {0} staat niet in de waardelijst met opties ({2}) in de vragenlijst -QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = De opgegeven code {1} kan niet worden gevalideerd tegen de waardelijst met opties ({2}) in de vragenlijst omdat het system {0} onbekend is +Profile___Error_generating_snapshot = Profiel {0} ({1}). Fout bij genereren snapshot +Profile___base__could_not_be_resolved = Profiel {0} ({1}) basis {2} niet gevonden +Profile___element__Error_generating_snapshot_ = Profiel {0} ({1}), element {2}. Fout bij genereren snapshot: {3} +Profile___has_no_base_and_no_snapshot = Profiel {0} ({1}) heeft geen basis en geen snapshot +Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profiel {0} komt niet overeen met {1} vanwege de volgende profielissues: {2} +Profile_based_discriminators_must_have_a_type__in_profile_ = Profiel-gebaseerde discriminators moeten een type hebben ({0} in profile {1}) +Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Profiel-gebaseerde discriminators moeten een type hebben met een profiel ({0} in profiel {1}) +Profile_based_discriminators_must_have_only_one_type__in_profile_other = Profiel-gebaseerde discriminators moeten slechts een type bevatten ({1} in profile {2}). Gevonden {0} typen +QUESTIONNAIRE_QR_ITEM_BADOPTION_CS = De opgegeven code {1} kan niet worden gevalideerd tegen de waardelijst met opties ({2}) in de vragenlijst omdat het system {0} niet is gevonden +QUESTIONNAIRE_Q_DERIVATION_TYPE_IGNORED = Het afleiding-type ''{0}'' betekent dat er geen controle op afleiding is uitgevoerd tegen deze vragenlijst +QUESTIONNAIRE_Q_DERIVATION_TYPE_UNKNOWN = Het afleiding-type ''{0}'' is onbekend, wat betekent dat er geen controle op afleiding is uitgevoerd tegen deze vragenlijst +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft antwoordopties, dus dit item zou dat ook moeten hebben +QUESTIONNAIRE_Q_ITEM_DERIVED_ANSWER_OPTIONS_NEW = Het item met linkId ''{1}'' in vragenlijst ''{0}'' kent deze antwoordoptie niet, dus dit antwoord is ongeldig +QUESTIONNAIRE_Q_ITEM_DERIVED_DEFINITION = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft definitie ''{2}'', dus moet hier worden herhaald +QUESTIONNAIRE_Q_ITEM_DERIVED_MAXLENGTH = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft definitie ''{2}'', dus dit item moet ook een max lengte hebben +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_ANSWER_TYPE = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft antwoord ''{2}'' terwijl deze antwoord {3} heeft. Misschien is dat wel valide maar de validator kan (nog?) niet controleren +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_DEFINITION = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft definitie ''{2}''. Is de bedoeling dit te wijzigen? +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_MAXLENGTH = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft max lengte ''{2}'', dus kan de maximale lengte niet groter zijn dan dat +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REPEATS = Het item met linkId ''{1}'' in vragenlijst ''{0}'' herhaalt niet, dus kan het hier ook niet herhalen +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_REQUIRED = Het item met linkId ''{1}'' in vragenlijst ''{0}'' is verplicht dus moet het hier ook bestaan +QUESTIONNAIRE_Q_ITEM_DERIVED_NC_TYPE = Het item met linkId ''{1}'' in vragenlijst ''{0}'' heeft type ''{2}'' en dat kan hier niet wijzigen in ''{3}'' +QUESTIONNAIRE_Q_ITEM_DERIVED_NI_ANSWER_VS = De validator kan (nog?) geen consistentie in afgeleide item waardelijsten controleren +QUESTIONNAIRE_Q_ITEM_NOT_DERIVED = Geen item met linkId ''{1}'' gevonden in vragenlijst ''{0}'' +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE = De vragenlijst ''{0}'' heeft geen afgeleid type gespecificeerd met de extensie ''http://hl7.org/fhir/StructureDefinition/questionnaire-derivationType'', dus afleidingen zijn niet gecontroleerd +QUESTIONNAIRE_Q_NO_DERIVATION_TYPE_VALUE = De afleiding-extensie heeft geen waarde +QUESTIONNAIRE_Q_UNKNOWN_DERIVATION = De vragenlijst ''{0}'' waarnaar wordt verwezen uit de afleiding is niet gevonden +Questionnaire_QR_Item_BadOption = De code ''{1}'' in systeem ''{0}'' staat niet in de waardelijst met opties ({2}) in de vragenlijst. Terminologiefout: {3} Questionnaire_QR_Item_Coding = Fout {0} bij valideren van Coding tegen Questionnaire opties Questionnaire_QR_Item_CodingNoOptions = Kan Coding optie niet valideren omdat er geen optielijst is gespecificeerd Questionnaire_QR_Item_DateNoOptions = Kan datum-antwoord niet valideren omdat er geen optielijst is gespecificeerd Questionnaire_QR_Item_Display = Items van type DISPLAY zouden zelf geen items moeten hebben - linkId {0} -Questionnaire_QR_Item_Group = Items van type group zouden zelf geen antwoorden moeten bevatten -Questionnaire_QR_Item_GroupAnswer = Items die niet van type group zijn zouden geen items behalve antwoorden moeten hebben (gebruik answer.item niet .item) +Questionnaire_QR_Item_Group = Items van type group zouden zelf geen antwoorden moeten bevatten +Questionnaire_QR_Item_GroupAnswer = Items die niet van type groep zijn zouden geen items behalve antwoorden moeten hebben (gebruik answer.item niet .item) Questionnaire_QR_Item_IntNoOptions = Kan integer-antwoordoptie niet valideren omdat er geen optielijst is gespecificeerd Questionnaire_QR_Item_Missing = Geen antwoord gevonden voor verplicht item ''{0}'' Questionnaire_QR_Item_NoCoding = De code {0}::{1} is geen geldige optie @@ -99,8 +523,6 @@ Questionnaire_QR_Item_NotEnabled = Item heeft een antwoord (2), terwijl deze nie Questionnaire_QR_Item_NotEnabled2 = Item heeft een antwoord, terwijl deze niet actief is (item id = ''{0}'') Questionnaire_QR_Item_NotFound = LinkId ''{0}'' niet gevonden in questionnaire Questionnaire_QR_Item_OnlyOneA = Er is slechts een antwoorditem toegestaan bij dit linkId -#The following error cannot occur for a single item. _one case left intentionally blank. -Questionnaire_QR_Item_OnlyOneI_one = Questionnaire_QR_Item_OnlyOneI_other = Er is slechts een item toegestaan bij dit linkId {1} - gevonden {0} items Questionnaire_QR_Item_Order = Structuurfout: items staan niet in de juiste volgorde Questionnaire_QR_Item_StringNoOptions = Kan string-antwoord niet valideren omdat er geen optielijst is gespecificeerd @@ -115,6 +537,10 @@ Questionnaire_Q_EnableWhen_IsInner = Vragen met een enableWhen kunnen niet verwi Questionnaire_Q_EnableWhen_NoLink = Vragen met een enableWhen moeten een waarde bevatten voor de vraag-link Questionnaire_Q_EnableWhen_NoTarget = Kan geen item vinden met linkId ''{0}'' waarnaar wordt verwezen in de enableWhen voor ''{1}'' Questionnaire_Q_EnableWhen_Self = Doel voor enableWhen van deze vraag kan niet verwijzen naar zichzelf +REFERENCE_REF_QUERY_INVALID = Het query deel van de conditionele referentie is geen geldige querystring ({0}) +REFERENCE_REF_SUSPICIOUS = De syntax van de reference ''{0}'' oogt incorrect en moeten worden gecontroleerd +REFERENCE_REF_WRONGTARGET_LOAD = Het type ''{2}'' is geen geldig Target voor het element {0} (moet zijn {1}) +RESOURCETYPE_PROPERTY_WRONG_TYPE = Het JSON element ''resourceType'' heeft het verkeerde JSON type: {0} Reference_REF_Aggregation = Referentie is {0} wat niet wordt ondersteund door de gespecificeerde aggregatiemode(s) voor de referentie ({1}) Reference_REF_BadTargetType = Ongeldig resource doeltype. Gevonden {0}, maar verwacht was n van ({1}) Reference_REF_BadTargetType2 = Het type ''{0}'' dat wordt gempliceerd door de reference URL {1} is geen geldig doeltype voor dit element (moet n zijn van {2}) @@ -130,81 +556,306 @@ Reference_REF_NoType = Kan type van de doel-resource niet vaststellen Reference_REF_NotFound_Bundle = Gebundelde of contained reference niet gevonden binnen de bundle/resource {0} Reference_REF_ResourceType = Overeenkomende reference voor reference {0} heeft resourceType {1} Reference_REF_WrongTarget = Het type ''{0}'' is geen geldig doel voor dit element (moet een zijn van {1}) -REFERENCE_REF_WRONGTARGET_LOAD = Het type ''{2}'' is geen geldig Target voor het element {0} (moet zijn {1}) -Resource_RES_ID_Malformed_Length = Ongeldig Resource id: te lang ({0} chars) +Reference__refers_to_a__not_a_ValueSet = Reference {0} verwijst naar een {1} in plaats van een ValueSet Resource_RES_ID_Malformed_Chars = Ongeldig Resource id: ongeldige tekens (''{0}'') +Resource_RES_ID_Malformed_Length = Ongeldig Resource id: te lang ({0} chars) Resource_RES_ID_Missing = Resource vereist een id, maar deze ontbreekt Resource_RES_ID_Prohibited = Resource heeft een id, maar dat is niet toegestaan -Terminology_PassThrough_TX_Message = {0} voor ''{1}#{2}'' -Terminology_TX_Binding_CantCheck = Binding met URI reference kan niet worden gecontroleerd -Terminology_TX_Binding_Missing = Binding voor {0} ontbreekt (cc) -Terminology_TX_Binding_Missing2 = Binding voor {0} ontbreekt -Terminology_TX_Binding_NoServer = De waarde kan niet worden gevalideerd zonder een terminologieserver -Terminology_TX_Binding_NoSource = Binding voor pad {0} heeft geen bron, dus kan niet worden gevalideerd -Terminology_TX_Binding_NoSource2 = Binding heeft geen bron, dus kan niet worden gevalideerd -Terminology_TX_Code_NotValid = Code {0} is geen geldige code in het codesysteem {1} -Terminology_TX_Code_Unknown = Onbekende code ({0}#{1}) -Terminology_TX_Code_ValueSet = Geen code aanwezig en een code is verplicht uit waardelijst {0} is verplicht -Terminology_TX_Code_ValueSet_MISSING = Geen code aanwezig en een code is verplicht uit de waardelijst -Terminology_TX_Code_ValueSetMax = Geen code aanwezig en een code is verplicht uit de waardelijst {0} (max waardelijst {1}) -Terminology_TX_Code_ValueSet_Ext = Geen code aanwezig en een code is verplicht uit waardelijst {0} -Terminology_TX_Coding_Count = Verwacht {0}, maar gevonden {1} coding elementen -Terminology_TX_Confirm_1_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is verplicht (class = {1}) -Terminology_TX_Confirm_2_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) (class = {1}) -Terminology_TX_Confirm_3_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is aanbevolen (class = {1}) -Terminology_TX_Confirm_4a = De gevonden code ({2}) bestaat niet in waardelijst {0} en een code uit deze waardelijst is verplicht: {1} -Terminology_TX_Confirm_4b = De gevonden codes ({2}) bestaan niet in waardelijst {0} en een code uit deze waardelijst is verplicht: {1} -Terminology_TX_Confirm_5 = Kan niet bevestigen dat de aanwezige codes bestaan in de waardelijst {0} en een coding uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) -Terminology_TX_Confirm_6 = Kan niet bevestigen dat de aanwezige codes bestaan in de waardelijst {0} en een coding uit deze waardelijst is aanbevolen -Terminology_TX_Display_Wrong = Display moet zijn ''{0}'' -Terminology_TX_Error_CodeableConcept = Fout {0} bij valideren CodeableConcept -Terminology_TX_Error_CodeableConcept_Max = Fout {0} bij valideren CodeableConcept met maxValueSet -Terminology_TX_Error_Coding1 = Fout {0} bij valideren Coding -Terminology_TX_Error_Coding2 = Fout {0} bij valideren Coding: {1} -Terminology_TX_NoValid_1_CC = Geen van de gevonden codings bestaan in waardelijst {0} en een coding uit deze waardelijst is verplicht (codes = {1}) -Terminology_TX_NoValid_10 = De gevonden code bestaat niet in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (code = {1}#{2}) -Terminology_TX_NoValid_11 = De gevonden code bestaat niet in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (code = {1}#{2}, fout = {3}) -Terminology_TX_NoValid_12 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht. {1} -Terminology_TX_NoValid_13 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) ({1}) -Terminology_TX_NoValid_14 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is aanbevolen. {1} -Terminology_TX_NoValid_15 = De gevonden waarde (''{0}'') kan niet worden gevalideerd zonder een terminologieserver -Terminology_TX_NoValid_16 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code uit deze waardelijst is verplicht {2} -Terminology_TX_NoValid_17 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) {2} -Terminology_TX_NoValid_18 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code uit deze waardelijst is aanbevolen. {2} -Terminology_TX_NoValid_2_CC = Geen van de gevonden codings bestaat in de waardelijst {0} en een coding uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) (codes = {1}) -Terminology_TX_NoValid_3_CC = Geen van de gevonden codings bestaat in de waardelijst {0} en een coding uit deze waardelijst is aanbevolen (codes = {1}) -Terminology_TX_NoValid_4 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht {1} -Terminology_TX_NoValid_5 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) {1} -Terminology_TX_NoValid_6 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is aanbevolen {1} -Terminology_TX_NoValid_7 = Geen van de gevonden codes kon worden gevalideerd tegen de maximum waardelijst {0}, (fout = {2}) -Terminology_TX_NoValid_8 = Geen van de gevonden codes bestaan in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (codes = {1}) -Terminology_TX_NoValid_9 = De gevonden code kon niet worden gevalideerd tegen de maximum waardelijst {0}, (fout = {1}) -Terminology_TX_System_Invalid = Ongeldige system URI: {0} -Terminology_TX_System_NotKnown = CodeSystem URI ''{0}'' is onbekend dus de code kan niet worden gevalideerd -Terminology_TX_System_Relative = Coding.system moet een absolute referentie zijn, geen lokale referentie -Terminology_TX_System_Unknown = Onbekend CodeSystem ''{0}'' -Terminology_TX_System_ValueSet = Ongeldige system URI: {0} - kan geen waardelijst URI gebruiken als system -Terminology_TX_System_ValueSet2 = De Coding verwijst naar een waardelijst in plaats van een codesysteem (''{0}'') -Terminology_TX_ValueSet_NotFound = ValueSet {0} niet gevonden door de validator -Terminology_TX_ValueSet_NotFound_CS = Referentie gevonden naar een CodeSystem ({0}) waar een ValueSet werd verwacht -Type_Specific_Checks_DT_Base64_Valid = De waarde ''{0}'' is geen geldige Base64 waarde -Type_Specific_Checks_DT_Boolean_Value = boolean waarden moeten ''true'' of ''false'' zijn -Type_Specific_Checks_DT_Code_WS = De code ''{0}'' is ongeldig (regels voor whitespace) -Type_Specific_Checks_DT_DateTime_Reasonable = De waarde ''{0}'' valt buiten de redelijke waarden voor jaar - controleer op invoerfouten -Type_Specific_Checks_DT_DateTime_Regex = De instant ''{0}'' is niet geldig (op basis van regex) -Type_Specific_Checks_DT_DateTime_TZ = als een datum een tijd bevat, dan moet deze ook een tijdzone bevatten -Type_Specific_Checks_DT_DateTime_Valid = Ongeldige datum/tijd ({0}) -Type_Specific_Checks_DT_Date_Valid = Ongeldige datum ({0}) -Type_Specific_Checks_DT_Decimal_Range = De waarde ''{0}'' valt buiten de ondersteunde, redelijke aantallen decimalen -Type_Specific_Checks_DT_Decimal_Valid = De waarde ''{0}'' is geen geldige decimaal -Type_Specific_Checks_DT_Decimal_GT = waarde is groter dan de toegestane maximumwaarde {0} -Type_Specific_Checks_DT_Decimal_LT = waarde is kleiner dan de toegestane minimumwaarde {0} -Type_Specific_Checks_DT_ID_Valid = id waarde ''{0}'' is ongeldig -Type_Specific_Checks_DT_Identifier_System = Identifier.system moet een absolute referentie zijn, geen lokale referentie -Type_Specific_Checks_DT_Instant_Valid = Ongeldige instant ({0}) +Resource_resolution_services_not_provided = Resource resolution functionaliteit wordt niet ondersteund +Resource_type_mismatch_for___ = Resourcetype komt niet overeen voor {0} / {1} +SCT_NO_MRCM = Niet gevalideerd tegen Machine Readable Concept Model (MRCM) +SD_CONSTRAINED_KIND_NO_MATCH = Het soort {0} (kind) moet hetzelfde zijn als de soort {1} in de basisstructuur {3} (basistype = {2}) +SD_CONSTRAINED_TYPE_NO_MATCH = Het type {0} moet hetzelfde zijn als het type in de basisstructuur {1} die wordt ingeperkt +SD_CONTEXT_SHOULD_NOT_BE_ELEMENT = Controleer extensietype voor {1}: extensies zouden niet context {0} moeten hebben tenzij het echt de bedoeling is dat ze overal kunnen worden gebruikt +SD_CONTEXT_SHOULD_NOT_BE_FHIRPATH = Controleer extensietype voor {1}: de context {0} lijkt een element te zijn, dus het contexttype zou dan ''element'' moeten zijn en niet ''fhirpath'' +SD_DERIVATION_KIND_MISMATCH = De StructureDefinition perkt soort {0} in, maar heeft een ander soort ({1}) +SD_ED_BIND_MULTIPLE_TYPES = Het element {0} heeft een binding en heeft meerdere typen onderhavig aan bindings ({1}). De binding zal van toepassing zijn op alle typen +SD_ED_BIND_NOT_VS = De waardelijst-reference {1} op element {0} wijst naar iets dat geen waardelijst is ({2}) +SD_ED_BIND_NO_BINDABLE = Het element {0} heeft een binding, maar er zijn geen typen gespecificeerd die een binding kunnen hebben {1} +SD_ED_BIND_UNKNOWN_VS = De waardelijst-reference {1} op element {0} is niet gevonden +SD_ED_SHOULD_BIND = Het element {0} heeft een type dat een binding ({1}) zou moeten hebben, maar er is geen binding gevonden +SD_ED_SHOULD_BIND_WITH_VS = Het element {0} heeft een type dat een binding ({1}) zou moeten hebben, maar de binding heeft geen waardelijst +SD_ED_TYPE_NO_TARGET_PROFILE = Type {0} laat geen target Profielen toe +SD_ED_TYPE_PROFILE_IS_MODIFIER = Profiel {0} is niet bedoeld voor een modifier extensie, met het {3} element is een modifier +SD_ED_TYPE_PROFILE_NOTYPE = Profiel {0} gevonden, maar kan niet bepalen op welke type deze van toepassing is +SD_ED_TYPE_PROFILE_NOT_MODIFIER = Profiel {0} is bedoeld voor een modifier extensie, maar het {3} element is geen modifier +SD_ED_TYPE_PROFILE_UNKNOWN = Kan profiel {0} niet vinden +SD_ED_TYPE_PROFILE_WRONG = Profiel {0} is voor type {1}, met het {3} element heeft type {2} +SD_ED_TYPE_PROFILE_WRONG_TARGET = Profiel {0} is voor type {1}, wat geen {4} is (welke wordt vereist om het {3} element type {2} heeft) +SD_ED_TYPE_PROFILE_WRONG_TYPE_one = Het type {0} staat niet in de lijst met geldige typen {1} in het profiel {2} +SD_ED_TYPE_PROFILE_WRONG_TYPE_other = Het type {0} staat niet in de lijst met geldige typen {1} in het profiel {2} +SD_ELEMENT_FIXED_WRONG_TYPE = Het basiselement heeft een vast type ''{0}'', dus dit element moet dit zelfde vaste type hebben, niet ‘’{1}’’ +SD_ELEMENT_NOT_IN_CONSTRAINT = De elementdefinitie voor {1} heeft eigenschap {0} wat niet is toegestaan in een profiel +SD_ELEMENT_PATTERN_WRONG_TYPE = Het basiselement heeft een patroon ''{0}'', dus dit element moet dit zelfde patroon voor dit type hebben, niet ''{1}'' +SD_ELEMENT_REASON_DERIVED = , omdat de waarde overeen moet komen met de vaste waarde in ''{0}'' +SD_EXTENSION_URL_MISMATCH = De vaste waarde voor de extensie-url is {1} wat niet overeenkomt met de canonical url {0} +SD_EXTENSION_URL_MISSING = De waarde van Extension.url is niet vastgezet op de extensie-url {0} +SD_ILLEGAL_CHARACTERISTICS = Dit element heeft een {0} maar de typen {1} maken dit type constraint niet relevant +SD_MUST_HAVE_DERIVATION = StructureDefinition {0} moet een derivation bevatten, aangezien er een baseDefinition is +SD_NESTED_MUST_SUPPORT_DIFF = Het element {0} heeft typen/profielen/targets gemarkeerd als mustSupport, maar het element zelf is niet gemarkeerd als mustSupport. De binnenste mustSupports worden genegeerd tenzij het element mustSupport = true overerft +SD_NESTED_MUST_SUPPORT_SNAPSHOT = Het element {0} heeft typen/profielen/targets gemarkeerd als mustSupport, maar het element zelf is niet gemarkeerd als mustSupport +SD_NO_CONTEXT_INV_WHEN_NOT_EXTENSION = Het type is {0} dus er zouden geen extensiecontext invariants moeten zijn +SD_NO_CONTEXT_WHEN_NOT_EXTENSION = Het type is {0} dus er zou geen extensiecontext moeten zijn +SD_NO_SLICING_ON_ROOT = Slicing is niet toegestaan aan de root van een profiel +SD_NO_TYPES_OR_CONTENTREF = Het element {0} heeft geen toegekende typen en geen content-reference +SD_NO_TYPE_CODE_ON_CODE = Snapshot voor {1} element {0} heeft type.code zonder een waarde +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_BASE = Het profile ‘’{0}’’ heeft een andere basis ''{1}'' dan verwacht ''{2}'' +SD_OBGLIGATION_INHERITS_PROFILE_NOT_RIGHT_TYPE = Het profiel ''{0}'' is niet gemarkeerd als obligation-profiel +SD_OBGLIGATION_INHERITS_PROFILE_NO_TARGET = Kan geen waarde uit deze extensie lezen +SD_OBGLIGATION_INHERITS_PROFILE_TARGET_NOT_FOUND = Het profiel ''{0}'' is niet gevonden +SD_OBGLIGATION_PROFILE_DERIVATION = Alleen profielen die een constraint zijn op een ander profiel kunnen worden gemarkeerd als obligation-profiel +SD_OBGLIGATION_PROFILE_ILLEGAL = Het element ''{0}'' heeft eigenschap ''{1}'' wat niet is toegestaan in obligation-profielen +SD_OBGLIGATION_PROFILE_ILLEGAL_BINDING = Het element ''{0}'' heeft een binding waar het basiselement dat niet heeft en dat niet is toegestaan in obligation-profielen +SD_OBGLIGATION_PROFILE_ILLEGAL_ON_BINDING = Het element ''{0}'' heeft een bindingeigenschap ''{1}'' en dat is niet toegestaan in obligation-profielen +SD_OBGLIGATION_PROFILE_INVALID_BINDING_CODE = Het element ''{0}'' heeft een additioneel bindingdoel ''{1}'' en dat is niet toegestaan in obligation-profielen +SD_OBGLIGATION_PROFILE_INVALID_BINDING_STRENGTH = Het element ''{0}'' heeft een andere bindingsterkte (''{1}'') dan de basis (''{2}'') en dat is niet toegestaan in obligation-profielen +SD_OBGLIGATION_PROFILE_PATH_WRONG = De padwaarde ''{1}'' van element ''{0}'' komt niet overeen met het basispad ''{2}'' +SD_OBGLIGATION_PROFILE_UKNOWN = Het element ''{0}'' is gemarkeerd als obligation-profiel maar de geldigheid kan niet worden gecontroleerd omdat het basisprofiel ''{0}'' onbekend is +SD_OBGLIGATION_PROFILE_UNMATCHED = Het element ''{0}'' heeft geen equivalent in het profiel ‘’{1}’’ waarop dit obligation-profiel is gebaseerd +SD_PATH_TYPE_MISMATCH = Het pad {1} moet beginnen met het structuurtype {0} +SD_SPECIALIZED_TYPE_MATCHES = Het type {0} moet niet hetzelfde zijn als het type in de basisstructuur {1} die wordt gespecialiseerd +SD_TYPE_MISSING = Geen type gevonden +SD_TYPE_NOT_DERIVED = Het type {0} kan alleen als type worden gebruikt bij het inperken van de basisdefinitie van het type +SD_TYPE_NOT_LOCAL = Het type {0} is niet geldig omdat deze niet is gedefinieerd in de FHIR-specificatie. Andere typen moeten een namespace hebben +SD_TYPE_NOT_LOGICAL = Het type {0} kan alleen worden gedefinieerd als het soort (kind) ''logical'' is, niet {1} +SD_TYPE_NOT_MATCH_NS = De type namespace {0} ZOU overeen MOETEN komen met de url namespace {1} voor de definitie van het type +SD_TYPE_PARAMETER_ABSTRACT_WARNING = Het type ''{0}'' bij {3} verwijst naar het abstracte type ''{1}'' maar de context is geen abstract type - meestal is dat een fout +SD_TYPE_PARAMETER_INVALID = De typedefinitie ''{2}'' heeft typeparameter ''{3}'', wat niet consistent is met zijn ancestor-typedefinitie ''{0}'' die typeparameter ''{1}'' heeft +SD_TYPE_PARAMETER_INVALID_REF = Het type ''{0}'' is een verwijzing naar ''{1}'' die typeparameter ''{2}'' heeft met een basistype {3} maar de opgegeven typeparameter is ''{4}'' wat niet het juiste type is +SD_TYPE_PARAMETER_MISSING = De typedefinitie ''{2}'' declareert geen typeparameter, maar deze is afgeleid van de typedefinitie ''{0}'' die typeparameter ''{1}'' heeft +SD_TYPE_PARAMETER_UNKNOWN = De typedefinitie ''{0}'' heeft typeparameter ''{1}'' maar dit is geen bekend type dus consistentie van de afleiding kan niet worden gecontroleerd +SD_TYPE_PARAM_NOT_SPECIFIED = Het type ''{0}'' van {3} is een verwijzing naar ''{1}'' die een typeparameter ''{2}'' moet hebben, maar er is geen typeparameter opgegeven voor ''{2}'' +SD_VALUE_COMPLEX_FIXED = Overweeg voor het the complex type {0} een pattern te gebruiken in plaats van een vaste waarde om te zware inperking van de instance te voorkomen +SD_VALUE_TYPE_IILEGAL = Het element {0} heeft een {1} van type {2}, welke niet in de lijst van toegestane typen staat ({3}) +SD_VALUE_TYPE_REPEAT_HINT = Het herhalende element heeft een {1}. De {1} is van toepassing op alle herhalingen (dit is niet alle gebruikers altijd duidelijk geweest) +SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = Het herhalende element heeft een {1} waarde voor een primitief type. De DotNet validator zal dit niet op alle herhalingen toepassen - dit is een fout +SEARCHPARAMETER_BASE_WRONG = Het resourcetype {1} is niet bekend als basis in de SearchParameter waar deze van is afgeleid ({0}) +SEARCHPARAMETER_EXP_WRONG = De expressie ''{2}'' is niet compatibel met de expressie ''{1}'' in de derivedFrom SearchParameter {0} wat waarschijnlijk betekent dat de derivation-relatie ongeldig is +SEARCHPARAMETER_MISSING_COMPONENTS = Als de SearchParameter type ''composite'' heeft, dan moet de SearchParameter twee of meer componenten definiëren +SEARCHPARAMETER_NOTFOUND = Kan de basis SearchParameter {0} niet vinden dus kan niet controleren of deze SearchParameter een correcte afleiding hiervan is +SEARCHPARAMETER_TYPE_WRONG = Het type {1} verschilt van het type {0} in de derivedFrom SearchParameter +SECURITY_STRING_CONTENT_ERROR = De string waarde bevat text die eruit ziet als HTML-tags, wat vanwege veiligheidsredenen niet is toegestaan in deze context +SECURITY_STRING_CONTENT_WARNING = De string waarde bevat text die eruit ziet als HTML-tags. Als deze content wordt weergegeven als HTML zonder de juiste nabewerking, dan houdt dit mogelijk een veiligheidsrisico in +SLICING_CANNOT_BE_EVALUATED = Slicing kan niet worden toegepast: {0} +SM_DEPENDENT_PARAM_MODE_MISMATCH = De parameter {0} verwijst naar de variabele {1} maar zijn mode is {2} wat niet hetzelfde is als de vereiste mode voor de groep {3} +SM_DEPENDENT_PARAM_NOT_FOUND = De {1} parameter ''{0}'' is niet gevonden +SM_DEPENDENT_PARAM_TYPE_MISMATCH = De parameter ''{0}'' verwijst naar de variabele ''{1}'' maar zijn type is ''{2}'' wat niet compatibele is met het vereist type voor de groep ''{3}'', welke is ''{4}'' (uit map ''{5}'') +SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = De groep {0} is al gebruikt met verschillende parameters, dus controle op type is mogelijk incorrect (andere = [{1}]; deze = [{2}]) +SM_GROUP_INPUT_DUPLICATE = De naam {0} wordt al gebruikt +SM_GROUP_INPUT_MODE_INVALID = De groep parameter {0} mode {1} is ongeldig +SM_GROUP_INPUT_MODE_MISMATCH = Het type ''{0}'' heeft mode ''{1}'' welke niet overeenkomt met de StructureDefinition mode {2} +SM_GROUP_INPUT_NO_TYPE = Groep {1} parameter {0} heeft geen type, dus de paden kunnen niet worden gevalideerd +SM_GROUP_INPUT_TYPE_NOT_DECLARED = Het type {0} is niet gedeclareerd en is onbekend +SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = Het type {0} die mapt op de canonical url {1} is onbekend, dus de paden kunnnen niet worden gevalideerd +SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = Het type {0} is onbekend, dus de paden kunnnen niet worden gevalideerd +SM_GROUP_NAME_DUPLICATE = De Groepnaam ''{0}'' wordt al gebruikt +SM_IMPORT_NOT_FOUND = Geen maps gevonden voor {0} - validatie kan fout zijn +SM_LIST_RULE_ID_ONLY_WHEN_SHARE = Een ruleId moet alleen worden gebruikt als de rule mode ''share'' is +SM_MATCHING_RULEGROUP_NOT_FOUND = Kon geen standaard rule vinden voor het typepaar bron={0} en doel={1} +SM_NAME_INVALID = De naam {0} is niet geldig +SM_NO_LIST_MODE_NEEDED = Een list mode moet niet worden gebruikt aangezien dit een regel is die slechts een keer kan worden uitgevoerd +SM_NO_LIST_RULE_ID_NEEDED = Een list ruleId moet niet worden gebruikt aangezien dit een regel is die slechts een keer kan worden uitgevoerd +SM_ORPHAN_GROUP = De groep {0} wordt niet succesvol gebruikt binnen dit mappingscript en heeft geen typen op zijn inputs, dus verificatie van type is niet mogelijk +SM_RULEGROUP_NOT_FOUND = De groep {0} kon niet worden gevonden +SM_RULEGROUP_PARAM_COUNT_MISMATCH = De groep {0} wordt aangeroepen met {1} parameters maar dat moeten er {2} zijn +SM_RULE_SOURCE_MAX_REDUNDANT = De maximumwaarde van {0} is redundant aangezien de geldige maximumwaarde {0} is +SM_RULE_SOURCE_MIN_REDUNDANT = De minimumwaarde van {0} is redundant aangezien de geldige minimumwaarde {0} is +SM_RULE_SOURCE_UNASSIGNED = Het bronstatement kent aan de bron geen variabele toe - controleer of dat de bedoeling is +SM_SOURCE_CONTEXT_UNKNOWN = De broncontext {0} is onbekend op dit punt +SM_SOURCE_PATH_INVALID = Het bronpad {0}.{1} verwijst naar het pad {2} welke onbekend is +SM_SOURCE_TYPE_INVALID = Het type {0} is ongeldig in de broncontext {1}. De mogelijke typen zijn [{2}] +SM_SOURCE_TYPE_NOT_FOUND = Geen brontype gevonden, dus de standaardgroep voor deze implicit dependent rule kon niet worden bepaald +SM_TARGET_CONTEXT_UNKNOWN = De doelcontext ''{0}'' is onbekend op dit punt +SM_TARGET_NO_TRANSFORM_NO_CHECKED = Als er geen transformatie is, kunnen er geen parameters voor worden gegeven +SM_TARGET_PATH_INVALID = Het doelpad {0}.{1} verwijst naar het pad {2} welke onbekend is +SM_TARGET_PATH_MULTIPLE_MATCHES = Het doelpad {0}.{1} verwijst naar het pad {2} wat een verwijzing naar meerdere elementen ({3}) zou kunnen zijn. Dit kan niet verder worden gecontroleerd +SM_TARGET_TRANSFORM_EXPRESSION_ERROR = De FHIRPath expressie in de evaluate parameter is ongeldig: {0} +SM_TARGET_TRANSFORM_MISSING_PARAMS = Een of meer parameters voor de translate-bewerking ontbreken (zou 3 moeten zijn, was {0}) +SM_TARGET_TRANSFORM_NOT_CHECKED = Transformatie {0} nog niet gecontroleerd +SM_TARGET_TRANSFORM_OP_INVALID_TYPE = De {1} variabele {0} type {2} is ongeldig - het moet een primitief zijn +SM_TARGET_TRANSFORM_OP_UNKNOWN_SOURCE = De {1} variabele {2} is onbekend voor de transformatie {0} +SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = Transformatie {0} heeft {1}-{2} parameter(s) nodig maar {3} gevonden +SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = Transformatie {0} heeft {1} parameter(s) nodig maar {2} gevonden +SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = De parameter op index {0} kon niet worden verwerkt (type = {1}) +SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = De waarde ''{0}'' voor de outputparameter is incorrect +SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = De map_uri ''{0}'' kon niet worden gevonden, dus kan de map net worden gecontroleerd +SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = Geen waarde voor {0} parameter gevonden +SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = De bronvariabele {0} is onbekend +SM_TARGET_TRANSFORM_TYPE_UNKNOWN = Het type ''{0}'' is onbekend +SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = De waarde van de type parameter voor {0} kon niet worden verwerkt +SM_TARGET_TRANSLATE_BINDING_SOURCE = De bronvariabele heeft geen required binding, dus deze conceptmap kan niet worden gecontroleerd +SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = De bronwaardelijst bevat een of meer codes die de map niet vertaalt: {0} +SM_TARGET_TRANSLATE_BINDING_TARGET = De doelvariable heeft geen required binding, dus deze conceptmap kan niet worden gecontroleerd +SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = De map produceert een of meer codes die niet in de doelwaardelijst staan: {0} +SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = Er was een fout bij de expansie van de bronwaardelijst, dus deze conceptmap kan niet worden gecontroleerd: ''{0}'' +SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = Er was een fout bij de expansie van de doelwaardelijst, dus deze conceptmap kan niet worden gecontroleerd: ''{0}'' +SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = De bronvariabele verwijst naar een onbekende waardelijst ''{0}'', dus deze conceptmap kan niet worden gecontroleerd +SM_TARGET_TRANSLATE_BINDING_VS_TARGET = De doelvariabele verwijst naar een onbekende waardelijst ''{0}'', dus deze conceptmap kan niet worden gecontroleerd +SM_TARGET_TYPE_MULTIPLE_POSSIBLE = Meerdere typen mogelijk hier ({0}) dus verdere controle op type niet mogelijk +SM_TARGET_TYPE_NOT_FOUND = Geen doeltype gevonden, dus de standaardgroep voor deze implicit dependent rule kon niet worden bepaald +SNAPSHOT_EXISTING_PROBLEM = De gegenereerde snapshot heeft een ander aantal elementen {1} dan de oorspronkelijke snapshot {0} +SNAPSHOT_IS_EMPTY = De snapshot voor profiel ''{0}'' is leeg. Meestal ligt dat aan een verwerkingsprobleem dat elders staat +STATUS_CODE_HINT = De code is {0} +STATUS_CODE_HINT_CODE = De code ''{1}'' is {0} +STATUS_CODE_WARNING = De code is ongeldig maar is {0} +STATUS_CODE_WARNING_CODE = De code ''{1}'' is geldig maar is {0} +Same_id_on_multiple_elements__in_ = Zelfde id ''{0}'' op meerdere elementen {1}/{2} in {3} +Slice_encountered_midway_through_set_path___id___ = Slice gevonden midden in de set (pad = {0}, id = {1}); {2} +Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - disciminator @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - volgorde @ {2} ({3}) +Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - regel @ {2} ({3}) +StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} in {1}: incorrect beperkt type {2} van {3} in {4} +TERMINOLOGY_TX_NOSVC_BOUND_EXT = Kan niet bevestigen dat de gevonden codes bestaan in de uitbreidbare waardelijst {0} omdat er geen terminologieservice is +TERMINOLOGY_TX_NOSVC_BOUND_REQ = Kan niet bevestigen dat de gevonden codes bestaan in de verplichte waardelijst {0} omdat er geen terminologieservice is +TERMINOLOGY_TX_OID_MULTIPLE_MATCHES = De oid ''{0}'' komt overeen met meerdere resources ({1}) +TERMINOLOGY_TX_OID_MULTIPLE_MATCHES_CHOSEN = De oid ''{0}'' komt overeen met meerdere resources ({2}); {1} is gekozen als meest relevante +TERMINOLOGY_TX_SYSTEM_HTTPS = De system URL ''{0}'' begint onterecht met https: in plaats van http: +TERMINOLOGY_TX_SYSTEM_NOT_USABLE = De definitie voor het CodeSystem met uri ''{0}'' heeft geen codes dus de code kan niet worden gecontroleerd +TERMINOLOGY_TX_SYSTEM_NO_CODE = Een code zonder system heeft geen gedefinieerde betekenis en kan niet worden gevalideerd. Er zou een system moeten zijn +TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = De codesysteemverwijzing {0} is incorrect - de codesysteemverwijzing kan niet naar build.fhir.org leiden. Mogelijk is dit de juiste verwijzing: {1} +TERMINOLOGY_TX_SYSTEM_WRONG_HTML = De codesysteemverwijzing {0} is incorrect - de codesysteemverwijzing kan niet naar een HTML-pagina leiden. Mogelijk is dit de juiste verwijzing: {1} +TERMINOLOGY_TX_UNKNOWN_OID = De oid ''{0}'' is onbekend dus de code kan niet worden gevalideerd +TX_GENERAL_CC_ERROR_MESSAGE = Er is geen geldige coding gevonden voor de waardelijst ''{0}'' +TX_SERVER_NO_BATCH_RESPONSE = De server gaf null terug voor een batch validatieverzoek +TYPE_CHECKS_FIXED_CC = De vaste waarde [system {0}, code {1} en display ''{2}''] gedefinieerd in het profiel {3} is niet gevonden. Issues: {4} +TYPE_CHECKS_FIXED_CC_US = De vaste waarde [system {0}, code {1}, display ''{2}'' en userselected {5}] gedefinieerd in het profiel {3} is niet gevonden. Issues: {4} +TYPE_CHECKS_PATTERN_CC = Het patroon [system {0}, code {1} en display ''{2}''] gedefinieerd in het profiel {3} is niet gevonden. Issues: {4} +TYPE_CHECKS_PATTERN_CC_US = Het patroon [system {0}, code {1}, display ''{2}'' en userselected {5}] gedefinieerd in het profiel {3} is niet gevonden. Issues: {4} +TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Canonical url''s moeten absolute url''s zijn, als het geen fragmentverwijzingen zijn ({0}) +TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Canonical url''s in contained resources moeten absolute url''s zijn indien aanwezig ({0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Attachments bevatten data en/of url, of ZOUDEN contentType en/of language MOETEN bevatten +TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = Attachment grootte kan niet worden gecontroleerd omdat de validator niet geconfigureerd is voor netwerktoegang (url = {0}) +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = Opgegeven Attachment grootte {0} komt niet overeen met werkelijke grootte van de bijlage {1} +TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = Opgegeven Attachment grootte {0} is niet geldig +TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = Attachment grootte is {0} bytes, wat groter is dan de ingestelde grenswaarde van {1} bytes +TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = Attachment grootte kan niet worden gecontroleerd omdat de validator niet weet hoe het toegang tot dit netwerk krijgt {0} +TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = Attachment grootte kan niet worden gecontroleerd omdat er een probleem was bij toegang tot {0}: {1} +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64 gecodeerde waarden mogen geen whitespace bevatten (per RFC 4648). Noot dat niet-validerende lezers wordt aanbevolen om whitespace toch te accepteren +TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64 gecodeerde waarden zouden geen whitespace mogen bevatten (per RFC 4648). Noot dat niet-validerende lezers wordt aanbevolen om whitespace toch te accepteren +TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64 grootte is {0} bytes, wat groter is dan de ingestelde grenswaarde van {1} bytes +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_MULTIPLE_POSSIBLE_VERSIONS = Er zijn meerdere potentiële matches voor de url ''{0}''. Het is mogelijk een goed idee om de juiste versie te koppelen om de kans op selectie van een verkeerde versie door een implementatie/implementer te verminderen. Gebruikt versie ''{1}'', gevonden versies: {2} +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' leidt nergens heen +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical url ''{0}'' bestaat, maar kan niet worden geladen, dus deze kan niet worden gecontroleerd op geldigheid +TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' verwijst naar een resource met het verkeerde type. Gevonden {1}, verwacht een van {2} +TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = {0} decimalen gevonden wat groter is dan de ingestelde grenswaarde van {1} cijfers +TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = als identifier.system ''urn:ietf:rfc:3986'' is, dan moet de identifier.value een volledige uri zijn (dus beginnen met een scheme), niet ''{0}'' +TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = De markdown bevat content die lijkt op een ingevoegde HTML tag beginnend bij ''{0}''. Dit zal (of ZOU MOETEN) worden overgeslagen in de presentatielaaag. De content moet worden gecontroleerd om te bevestigen dat dit het gewenste geedrag i +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = Fout bij evaluatie regex ''{0}'' op type {1}: {2} +TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_TYPE_ALT = Zowel de elementwaarde ''{0}'' als de opgemaakte waarde ''{1}'' komen niet overeen met {2} regex ''{3}'' +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = De maxValue in het profiel heeft een system code {0} welke verschilt van het system code in de waarde {1} dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = De maxValue in het profiel heeft geen code dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Kan waarde {0} niet converteren van eenheid {1} naar maxValue eenheid {2} gebaseerd op UCUM-definities; maximumwaarde is niet geldig +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = De maxValue in het profiel heeft geen systeem dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = De maxValue in het profiel heeft geen actuele waarde dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = Er is geen UCUM service en de UCUM codes zijn niet identiek dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = De maxValue in het profiel heeft een system {0} welke verschilt van het system in de waarde {1} dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = De waarde heeft geen code dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = De waarde heeft geen system dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = De hoeveelheid heeft geen actuele waarde dus kan de maximumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = De waarde in de instance ({2}) is groter dan de gespecificeerde maximumwaarde ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = De waarde in de instance ({0} {1}) is groter dan de gespecificeerde maxValue ({2} {3}) na UCUM-conversie +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = De minValue in het profiel heeft een system code {0} welke verschilt van de system code in de waarde {1} dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = De minValue in het profiel heeft geen code dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Kan waarde {0} niet converteren van eenheid {1} naar minValue eenheid {2} gebaseerd op UCUM-definities; minimumwaarde is niet geldig +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = De minValue in het profiel heeft geen system dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = De minValue in het profiel heeft geen actuele waarde dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = Er is geen UCUM service en de UCUM codes zijn niet identiek dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = De minValue in het profiel heeft een system {0} welke verschilt van het system in de waarde {1} dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = De waarde heeft geen code dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = De waarde heeft geen system dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = De hoeveelheid heeft geen actuele waarde dus kan de minimumwaarde niet worden gecontroleerd +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = De waarde in de instance ({2}) is kleiner dan de gespecificeerde minimumwaarde ({3}) +TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = De waaarde in de instance ({0} {1}) is kleiner dan de gespecificeerde minValue ({2} {3}) na UCUM-conversie +TYPE_SPECIFIC_CHECKS_DT_QTY_NO_QTY = {0} van type {2} gevonden in het profiel bij valideren van een Hoeveelheid (dus het moet een Quantity zijn) +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS = UCUM-codes met menselijk leesbare annotaties zoals {0} kunnen misleidend zijn (bijv. omdat ze worden genegeerd bij vergelijken van eenheden). Best practice is om niet afhankelijk te zijn van annotaties in de UCUM-code, dus controleer dit gebruik +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NOT_IN_UNIT = UCUM-codes met menselijk leesbare annotaties zoals {0} kunnen misleidend zijn (bijv. omdat ze worden genegeerd bij vergelijken van eenheden). Best practice is om niet afhankelijk te zijn van annotaties in de UCUM-code, dus controleer dit gebruik en de Quantity.unit ''{1}'' ZOU de annotatie MOETEN bevatten (is niet het geval) +TYPE_SPECIFIC_CHECKS_DT_QTY_UCUM_ANNOTATIONS_NO_UNIT = UCUM-codes met menselijk leesbare annotaties zoals {0} kunnen misleidend zijn (bijv. omdat ze worden genegeerd bij vergelijken van eenheden). Best practice is om niet afhankelijk te zijn van annotaties in de UCUM-code, dus controleer dit gebruik en de Quantity.unit ZOU de annotatie MOETEN bevatten +TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = Voorbeeld URL''s zijn niet toegestaan in deze context ({0}) +TYPE_SPECIFIC_CHECKS_DT_XHTML_MULTIPLE_MATCHES = Hyperlink ''{0}'' bij ''{1}'' voor ''{2}'' leidt naar meerdere doelen ({3}) +TYPE_SPECIFIER_ABSTRACT_TYPE = De Type specifier {1} specificeert een abstract type {0} +TYPE_SPECIFIER_ILLEGAL_TYPE = De Type specifier {1} specificeert een ongeldig type {0} +TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Geen matchende Type specifier en het onderliggende type {0} is niet abstract +TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Geen matchende Type specifier en het onderliggende type {0} is niet geldig +Terminology_PassThrough_TX_Message = {0} (voor ''{1}#{2}'') +Terminology_TX_Binding_CantCheck = Binding met URI reference kan niet worden gecontroleerd +Terminology_TX_Binding_Missing = Binding voor {0} ontbreekt (cc) +Terminology_TX_Binding_Missing2 = Binding voor {0} ontbreekt +Terminology_TX_Binding_NoServer = De waarde ([{0}]) kan niet worden gevalideerd zonder een terminologieserver +Terminology_TX_Binding_NoSource = Binding voor pad {0} heeft geen bron, dus kan niet worden gevalideerd +Terminology_TX_Binding_NoSource2 = Binding heeft geen bron, dus kan niet worden gevalideerd +Terminology_TX_Code_ValueSet = Geen code aanwezig en een code is verplicht uit waardelijst {0} is verplicht +Terminology_TX_Code_ValueSetMax = Geen code aanwezig en een code is verplicht uit de waardelijst {0} (max waardelijst {1}) +Terminology_TX_Code_ValueSet_Ext = Geen code aanwezig en een code is verplicht uit waardelijst {0} +Terminology_TX_Code_ValueSet_MISSING = Geen code aanwezig en een code is verplicht uit de waardelijst +Terminology_TX_Coding_Count = Verwacht {0}, maar gevonden {1} coding elementen +Terminology_TX_Confirm_1_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is verplicht (class = {1}) +Terminology_TX_Confirm_2_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) (class = {1}) +Terminology_TX_Confirm_3_CC = Kan niet bevestigen dat de gevonden codings bestaan in de waardelijst {0} en een coding uit deze waardelijst is aanbevolen (class = {1}) +Terminology_TX_Confirm_4a = De gevonden code ({2}) staat niet in waardelijst {0} en een code uit deze waardelijst is verplicht: {1} +Terminology_TX_Confirm_5 = De code ({1}) staat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht tenzij er geen relevante code is (de validator kan niet bepalen wat relevant is) +Terminology_TX_Confirm_6 = De code ({1}) staat niet in de waardelijst {0} en een code uit deze waardelijst is aanbevolen +Terminology_TX_Display_Wrong = Display moet zijn ''{0}'' +Terminology_TX_Error_CodeableConcept = Fout {0} bij valideren CodeableConcept +Terminology_TX_Error_CodeableConcept_Max = Fout {0} bij valideren CodeableConcept met maxValueSet +Terminology_TX_Error_Coding1 = Fout {0} bij valideren Coding +Terminology_TX_Error_Coding2 = Fout {0} bij valideren Coding: {1} +Terminology_TX_NoValid_10 = De gevonden code bestaat niet in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (code = {1}#{2}) +Terminology_TX_NoValid_11 = De gevonden code bestaat niet in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (code = {1}#{2}, fout = {3}) +Terminology_TX_NoValid_12 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht. {1} +Terminology_TX_NoValid_13 = De Coding ({2}) bestaat niet in de waardelijst {0} en een code zou uit deze waardelijst moeten komen tenzij er geen relevante code is (de validator kan niet bepalen wat relevant is). {1} +Terminology_TX_NoValid_14 = De Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is aanbevolen. {1} +Terminology_TX_NoValid_15 = De gevonden waarde (''{0}'') kan niet worden gevalideerd zonder een terminologieserver +Terminology_TX_NoValid_16 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code uit deze waardelijst is verplicht {2} +Terminology_TX_NoValid_17 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code zou uit deze waardelijst moeten komen tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) {2} +Terminology_TX_NoValid_18 = De gevonden waarde (''{0}'') bestaat niet in de waardelijst {1} en een code uit deze waardelijst is aanbevolen. {2} +Terminology_TX_NoValid_1_CC = Geen van de gevonden codings bestaan in waardelijst {0} en een coding uit deze waardelijst is verplicht (codes = {1}) +Terminology_TX_NoValid_2_CC = Geen van de gevonden codings bestaat in de waardelijst {0} en een coding uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) (codes = {1}) +Terminology_TX_NoValid_3_CC = Geen van de gevonden codings bestaat in de waardelijst {0} en een coding uit deze waardelijst is aanbevolen (codes = {1}) +Terminology_TX_NoValid_4 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht {1} +Terminology_TX_NoValid_5 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht tenzij deze geen relevante code bevat (de validator kan niet bepalen wat relevant is) {1} +Terminology_TX_NoValid_6 = De gevonden Coding ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is aanbevolen {1} +Terminology_TX_NoValid_7 = Geen van de gevonden codes kon worden gevalideerd tegen de maximum waardelijst {0}, (fout = {2}) +Terminology_TX_NoValid_8 = Geen van de gevonden codes bestaan in de maximum waardelijst {0} en een code uit deze waardelijst is verplicht (codes = {1}) +Terminology_TX_NoValid_9 = De gevonden code ({2}) kon niet worden gevalideerd tegen de maximum waardelijst {0}, (fout = {1}) +Terminology_TX_System_Invalid = Ongeldige system uri: {0} +Terminology_TX_System_Relative = Coding.system moet een absolute referentie zijn, geen lokale referentie +Terminology_TX_System_Unknown = Onbekend CodeSystem ''{0}'' +Terminology_TX_System_ValueSet = Ongeldige system uri: {0} - kan geen waardelijst URI gebruiken als system +Terminology_TX_System_ValueSet2 = De Coding verwijst naar een waardelijst in plaats van een codesysteem (''{0}'') +Terminology_TX_ValueSet_NotFound = ValueSet {0} niet gevonden +Terminology_TX_ValueSet_NotFound_CS = Referentie gevonden naar een CodeSystem ''{0}'' waar een ValueSet werd verwacht +Text_should_not_be_present = Er zou geen text moeten zijn (''{0}'') +The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = De basis-snapshot markeert een slicing als gesloten, maar de differential probeert hierop uit te breiden in {0} in {1} ({2}) +This__cannot_be_parsed_as_a_FHIR_object_no_namespace = Dit ''{0}'' kan niet worden verwerkt (namespace op xml rootelement ontbreekt) +This_base_property_must_be_an_Array_not_ = Deze basis-property moet een Array zijn, geen {0} +This_cannot_be_parsed_as_a_FHIR_object_no_name = Deze content kan niet worden verwerkt (geen naam) +This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Deze content kan niet worden verwerkt (onbekende of niet-herkende resourcenaam ''{0}'') +This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = Deze content kan niet worden verwerkt (onbekende of niet-herkende xml rootelement namespace/naam ''{0}::{1}'') +This_element_does_not_match_any_known_slice_ = Dit element komt niet overeen met een bekende slice {0} (mogelijk geen probleem, maar controleer of dat mogelijk toch de bedoeling was) +This_property_must_be__not_ = Deze property {2} moet {0} zijn, geen {1} (bij {3}) +This_property_must_be_a_Literal_not_ = Deze property moet een Literal zijn, geen {0} +This_property_must_be_a_URI_or_bnode_not_ = Deze property moet een URI of bnode zijn, geen {0} +This_property_must_be_an_Array_not_ = Deze property {1} moet een JSON Array zijn, geen {0} (bij {2}) +This_property_must_be_an_object_not_ = Deze property moet een object zijn, geen {0} ({1} bij {2}) +This_property_must_be_an_simple_value_not_ = Deze property moet een eenvoudige waarde zijn, geen {0} ({1} bij {2}) +Type_Specific_Checks_DT_Base64_Valid = De waarde ''{0}'' is geen geldige Base64 waarde +Type_Specific_Checks_DT_Boolean_Value = Boolean waarden moeten ''true'' of ''false'' zijn +Type_Specific_Checks_DT_Code_WS = De code ''{0}'' is ongeldig (regels voor whitespace) +Type_Specific_Checks_DT_DateTime_Reasonable = De waarde ''{0}'' valt buiten de redelijke waarden voor jaar - controleer op invoerfouten +Type_Specific_Checks_DT_DateTime_Regex = De instant ''{0}'' is niet geldig (op basis van regex) +Type_Specific_Checks_DT_DateTime_TZ = Als een datum een tijd bevat, dan moet deze ook een tijdzone bevatten +Type_Specific_Checks_DT_DateTime_Valid = Ongeldige datum/tijd ({0}) +Type_Specific_Checks_DT_Date_Valid = Ongeldige datum ({0}) +Type_Specific_Checks_DT_Decimal_GT = decimale waarde is groter dan de toegestane maximumwaarde {0} +Type_Specific_Checks_DT_Decimal_LT = decimale waarde is kleiner dan de toegestane minimumwaarde {0} +Type_Specific_Checks_DT_Decimal_Range = De waarde ''{0}'' valt buiten de ondersteunde, redelijke aantallen decimalen +Type_Specific_Checks_DT_Decimal_Valid = De waarde ''{0}'' is geen geldige decimaal +Type_Specific_Checks_DT_ID_Valid = id waarde ''{0}'' is ongeldig +Type_Specific_Checks_DT_Identifier_System = Identifier.system moet een absolute referentie zijn, geen lokale referentie +Type_Specific_Checks_DT_Instant_Valid = Ongeldige instant ({0}) Type_Specific_Checks_DT_Integer64_Valid = De waarde ''{0}'' is geen geldige integer64 -Type_Specific_Checks_DT_Integer_GT = waarde is groter dan toegestane maximumwaarde {0} -Type_Specific_Checks_DT_Integer_LT = waarde is kleiner dan toegestane minimumwaarde {0} +Type_Specific_Checks_DT_Integer_GT = integer waarde is groter dan toegestane maximumwaarde {0} +Type_Specific_Checks_DT_Integer_LT = integer waarde is kleiner dan toegestane minimumwaarde {0} Type_Specific_Checks_DT_Integer_LT0 = waarde is kleiner dan toegestane minimumwaarde 0 Type_Specific_Checks_DT_Integer_LT1 = waarde is kleiner dan toegestane minimumwaarde 1 Type_Specific_Checks_DT_Integer_Valid = De waarde ''{0}'' is geen geldige integer @@ -213,701 +864,244 @@ Type_Specific_Checks_DT_OID_Valid = OID''s moeten geldig zijn ({0}) Type_Specific_Checks_DT_Primitive_Length = waarde is langer dan toegestane maximumlengte {0} Type_Specific_Checks_DT_Primitive_NotEmpty = @value mag niet leeg zijn Type_Specific_Checks_DT_Primitive_Regex = Elementwaarde ''{0}'' komt niet overeen met regex ''{1}'' -TYPE_SPECIFIC_CHECKS_DT_PRIMITIVE_REGEX_EXCEPTION = Exception evaluating regex ''{0}'' on type {1}: {2} -Type_Specific_Checks_DT_Primitive_Regex_Type = Element value ''{0}'' does not meet {1} regex ''{2}'' +Type_Specific_Checks_DT_Primitive_Regex_Type = Elementwaarde ''{0}'' klopt niet met {1} regex ''{2}'' Type_Specific_Checks_DT_Primitive_ValueExt = Primitieve typen moeten een waarde of onderliggende extensies bevatten Type_Specific_Checks_DT_Primitive_WS = Primitieve typen mogen niet louter bestaan uit whitespace Type_Specific_Checks_DT_String_Length = waarde is groter dan toegestane maximumgrootte 1 MB (1048576 bytes) Type_Specific_Checks_DT_String_WS = waarde mag niet beginnen of eindigen met whitespace ''{0}'' -Type_Specific_Checks_DT_String_WS_ALL = value should not be all whitespace ''{0}'' +Type_Specific_Checks_DT_String_WS_ALL = waarde mag niet bestaan uit alleen whitespace ''{0}'' Type_Specific_Checks_DT_Time_Valid = Ongeldige tijd ({0}) Type_Specific_Checks_DT_URI_OID = URI-waarden kunnen niet beginnen met oid: Type_Specific_Checks_DT_URI_UUID = URI-waarden kunnen niet beginnen met uuid: Type_Specific_Checks_DT_URI_WS = URI-waarden kunnen geen whitespace bevatten (''{0}'') Type_Specific_Checks_DT_URL_Resolve = URL-waarde ''{0}'' komt nergens uit -Type_Specific_Checks_DT_UUID_Strat = UUID''s moet beginnen met urn:uuid: -Type_Specific_Checks_DT_UUID_Valid = UUIDs must be valid and lowercase ({0}) +Type_Specific_Checks_DT_UUID_Strat = Uuid''s moet beginnen met urn:uuid: +Type_Specific_Checks_DT_UUID_Valid = Uuid''s moeten valide zijn en onderkast ({0}) +Type_Specific_Checks_DT_XHTML_Resolve = Hyperlink ''{0}'' bij ''{1}'' voor ''{2}'' komt nergens uit +Type_Specific_Checks_DT_XHTML_Resolve_Img = Afbeelding-bron ''{0}'' bij ''{1}'' komt nergens uit +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = Kan niet controleren of de code in de waardelijst ''{0}'' staat +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_CS = Kan niet controleren of de code in de waardelijst ''{0}'' staat, omdat het codesysteem {1} niet is gevonden +UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_VS = Kan niet controleren of de code in de waardelijst ''{0}'' staat, omdat de waardelijst {1} niet is gevonden +UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV = De typen kunnen niet worden bepaald vanuit de extensie-context, dus kan de invariant niet worden gevalideerd (typen = {0}) +UNABLE_TO_HANDLE_SYSTEM__PROPERTY_FILTER_WITH_OP__ = Kan system {0} eigenschapfilter met op = {1} niet verwerken +UNABLE_TO_INFER_CODESYSTEM = De System URI kon niet worden bepaald voor de code ''{0}'' in de waardelijst ''{1}'' +UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = Kan de contentreferentie {0} op element {1} (pad = {2}) niet vinden in deze context +UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = Het codesysteem {1} waar naar wordt verwezen vanuit waardelijst {0} heeft een grammatica en de code zou hierin geldig kunen zijn +UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = De Unicode sequence heeft bidirectionele stuurtekens welke niet zijn toegestaan in deze context: {0} +UNICODE_BIDI_CONTROLS_CHARS_MATCH = De Unicode sequence heeft niet-beëindigde bidirectionele stuurtekens (zie CVE-2021-42574): {0} +UNICODE_XML_BAD_CHARS_one = Deze content bevat het teken {1} (hex-waarde). Dit is een ongeldig teken in de xml-versie van FHIR en er is in het algemeen geen geldig gebruik van zulke tekens +UNICODE_XML_BAD_CHARS_other = Deze content bevat de tekens {1} (hex-waarden). Dit zijn een ongeldig tekens in de xml-versie van FHIR en is in het algemeen geen geldig gebruik van zulke tekens +UNKNOWN_CODESYSTEM = De definitie voor CodeSystem ''{0}'' is niet gevonden, dus kan de code niet worden gevalideerd +UNKNOWN_CODESYSTEM_VERSION = De definitie voor CodeSystem {0} versie {1} is niet gevonden, dus kan de code niet worden gevalideerd. Geldige versies: {2} +UNKNOWN_CODE_IN_FRAGMENT = Onbekende code ‘’{0}’’ in system ‘’{1}’’ versie ‘’{2}’’ - merk op dat het codesysteem is gemarkeerd als fragment, waardoor deze mogelijk geldig is in een ander fragment +UNRECOGNISED_PROPERTY_TYPE = Ongeldig JSON type {0} voor het element {1}; geldige typen = {2} +UNRECOGNISED_PROPERTY_TYPE_WRONG = Ongeldig type {2} voor het element {1}; geldige typen = {3}, JSON type = {0} +UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Niet-ondersteund: geen eigenschappen met waarden gevonden op type {2} voor patroon voor discriminator ({0}) voor slice {1} +UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Niet-ondersteunde property {3} op type {2} voor patroon voor discriminator ({0}) voor slice {1} +Unable_to_connect_to_terminology_server = Kan niet verbinden met terminologieserver op {1}. Fout = {0} +Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Kan niet verbinden met terminologieserver op {1}. Gebruik parameter ''-tx n/a'' om te starten zonder terminologieservices voor validatie van LOINC, SNOMED, ICD-X etc. Fout = {0} +Unable_to_find__resolving_discriminator__from_ = Kan {0} niet vinden bij controle van discriminator {1} van {2} +Unable_to_find_base__for_ = Kan basis {0} voor {1} niet vinden +Unable_to_find_base_definition_for_logical_model__from_ = Kan geen basisdefinitie vinden voor logical model: {0} van {1} +Unable_to_find_element_ = Kan element {0} niet vinden +Unable_to_find_element__in_ = Kan element {0} niet vinden in {1} +Unable_to_find_element_with_id_ = Kan element met id ''{0}'' niet vinden +Unable_to_find_profile__at_ = Kan profiel ''{0}'' niet vinden in {1} +Unable_to_find_resourceType_property = Kan resourceType property niet vinden +Unable_to_find_resource__at__resolving_discriminator__from_ = Kan resource {0} niet vinden in {1} bij controle van discriminator {2} van {3} +Unable_to_handle_system__concept_filter_with_op__ = Kan system {0} concept filter met op = {1} niet verwerken +Unable_to_handle_system__filter_with_property__ = Kan system {0} filter met property = {1} niet verwerken, op = {2} +Unable_to_locate_the_profile__in_order_to_validate_against_it = Kan profiel ''{0}'' niet vinden om tegen te valideren +Unable_to_process_request_for_resource_for___ = Kan verzoek voor resource voor {0} / {1} niet verwerken +Unable_to_resolve_ = Kan {0} niet vinden +Unable_to_resolve_actual_type_ = Kan werkelijke type niet vinden {0} +Unable_to_resolve_element__in_profile_ = Kan element {0} niet vinden in profiel {1} +Unable_to_resolve_name_reference__at_path_ = Kan naamverwijzing {0} niet vinden op pad {1} +Unable_to_resolve_profile__in_element_ = Kan profiel {0} niet vinden in element {1} +Unable_to_resolve_reference_to_ = Kan reference naar {0} niet vinden +Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Kan slices niet koppelen aan definitie - geen vaste waarde of verplichte waardelijst +Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Kan slices niet koppelen aan definitie - slice op basis van waardelijst niet gedaan +Unable_to_resolve_system__no_value_set = Kan system niet vinden - geen waardelijst +Unable_to_resolve_system__value_set_expansion_has_multiple_systems = De system uri kan niet worden bepaald voor de code ''{0}'' in de waardelijst ''{1}'': waardelijst-expansie heeft meerdere systemen +Unable_to_resolve_system__value_set_has_imports = Kan system uri niet bepalen voor de code ''{0}'' in de ValueSet ''{1}'': waardelijst heeft imports +Unable_to_resolve_system__value_set_has_include_with_filter = Kan system uri niet bepalen voor de code ''{0}'' in de ValueSet ''{1}'': include #{2} heeft een filter op system {3}: {4} +Unable_to_resolve_system__value_set_has_include_with_no_system = Kan system niet vinden - waardelijst {0} include #{1} heeft geen system +Unable_to_resolve_system__value_set_has_include_with_unknown_system = Kan system uri niet bepalen voor de code ''{0}'' in de ValueSet ''{1}'': include #{2} heeft system {3} dat niet is gevonden en de server gaf foutmelding {4} +Unable_to_resolve_system__value_set_has_multiple_matches = Kan system uri niet bepalen voor de code ''{0}'' in de ValueSet ''{1}'': waardelijst-expansie heeft meerde matches: {2} +Unable_to_resolve_system__value_set_has_no_includes_or_expansion = Kan system uri niet bepalen voor de code ''{0}'' in de ValueSet ''{1}'': waardelijst heeft geen inclusies of expansie +Unable_to_resolve_value_Set_ = De definitie voor de waardelijst ''{0}'' is niet gevonden +Unable_to_validate_code_without_using_server = Kan code niet valideren zonder een server, omdat: {0} +Undefined_attribute__on__for_type__properties__ = Ongedefinieerd attribuut ''@{0}'' op {1} voor type {2} +Undefined_element_ = Ongedefinieerd element ''{0}'' op ''{1}'' +Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Onverwachte conditie in differential: impliciete slicenaam bevat geen geldig type (''{0}''?) bij {1}/{2} +Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Onverwachte situatie in differential: ongeldig type bij {0}/{1} +Unexpected_datatype_for_rdfstype = Onverwacht datatype voor rdfs:type +Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Niet-ondersteunde situatie: resource heeft profiel voor meerdere opties - kan profiel niet sorteren +Unknown_Code_in = Onbekende code ''{0}'' in het CodeSystem ''{1}'' +Unknown_Code_in_Version = Onbekende code ''{0}'' in het CodeSystem ''{1}'' versie ''{2}'' +Unknown_Data_format_ = Onbekend Data formaat ''{0}'' +Unknown_Date_format_ = Onbekend Date formaat ''{0}'' +Unknown_resource_type_missing_rdfstype = Onbekend resourcetype (rdfs:type ontbreekt) +Unknown_type__at_ = Onbekend type {0} in {1} +Unrecognised_extension_context_ = Niet-herkende extensiecontext {0} +Unrecognised_predicate_ = Niet-herkend predicaat ''{0}'' +Unrecognised_property_ = Niet-herkende eigenschap ''{0}'' +Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - extensies niet toegestaan - voor discriminator ({0}) voor slice {1} +Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - teminste een coding verplicht - voor discriminator ({0}) voor slice {1} +Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - gebruik van text - voor discriminator ({0}) voor slice {1} +Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Niet-ondersteund Identifier patroon - extensies niet toegestaan - voor discriminator ({0}) voor slice {1} +Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Niet-ondersteund vast patroontype voor discriminator ({0}) voor slice {1}: {2} +Unsupported_fixed_value_type_for_discriminator_for_slice__ = Niet-ondersteund type vaste waarde voor discriminator ({0}) voor slice {1}: {2} +Unsupported_version_R1 = Niet-ondersteunde versie R1 +Unsupported_version_R2 = Niet-ondersteunde versie R2 +Unsupported_version_R2B = Niet-ondersteunde versie R2B +Unxpected_internal_condition__no_source_on_diff_element = Onverwachte interne conditie - geen bron op diff element +VALIDATION_HL7_PUBLISHER_MISMATCH = De genoemde WG ''{0}'' betekent dat de publicerende partij ''{1}'' moet zijn maar gevonden is ''{2}'' +VALIDATION_HL7_PUBLISHER_MISMATCH2 = De genoemde WG ''{0}'' betekent dat de publisher ''{1}'' of ''{2}'' moet zijn maar gevonden is ''{3}'' +VALIDATION_HL7_PUBLISHER_MISSING = Als HL7 een resource publiceert, moet er een publisher zijn en de WG ''{0}'' zou ''{1}'' moeten zijn +VALIDATION_HL7_WG_NEEDED = Als HL7 een resource publiceert, moet het beherende commité zijn benoemd via de extensie {0} +VALIDATION_HL7_WG_UNKNOWN = De genoemde WG ''{0}''is onbekend +VALIDATION_HL7_WG_URL = De genoemde WG ''{0}'' betekent dat de contact url ''{1}'' moet zijn, maar deze is niet gevonden +VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = Global profiel reference ''{0}'' van IG {1} is niet gevonden, dus deze is niet gecontroleerd +VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Ongeldige inperking in profiel {0} bij pad {1} - kan type {2} niet inperken ten opzichte van basistypen {3} +VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = Profiel {1} identificeert {2} als afhankelijkheid (met de extensie http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), maar dit profiel is niet gevonden +VALIDATION_VAL_PROFILE_MINIMUM_MAGIC = {0}: magische LOINC-code {1} vereist maar niet gevonden (in {2}). Merk op dat andere Observation codes toegestaan zijn, naast deze verplichte magische code +VALIDATION_VAL_PROFILE_OTHER_VERSION = Profiel is voor een andere versie van FHIR ({0}) dus wordt genegeerd +VALIDATION_VAL_PROFILE_SIGNPOST = Valideer resource tegen profile {0} +VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Valideer resource tegen profiel +VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Valideer resource tegen profiel {0} - via bundle param +VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Valideer resource tegen profiel {0} (via http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) +VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Valideer resource tegen profiel {0} - een algemeen profiel in {1} +VALIDATION_VAL_PROFILE_SIGNPOST_META = Valideer resource tegen profiel {0} - zoals in meta +VALIDATION_VAL_PROFILE_SIGNPOST_OBS = Valideer Observation tegen het {1} profiel ({0}) welke verplicht is door de FHIR-specificaties omdat de {2} code {3} is gevonden +VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profiel voor deze versie van FHIR - alles in orde +VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profiel is voor deze versie van FHIR, maar heeft een onjuist type {0} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze niet is gevonden en ophalen ervan resulteerde in een fout {1} +VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze niet is gevonden en de host {1} niet kon worden gevonden +VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze niet is gevonden en de validator ingesteld is om onbekende profielen niet op te zoeken +VALIDATION_VAL_STATUS_INCONSISTENT = De resourcestatus ''{0}'' en de standaardstatus ''{1}'' zijn niet consistent +VALIDATION_VAL_STATUS_INCONSISTENT_HINT = De resourcestatus ''{0}'' en de standaardstatus ''{1}'' mogen niet inconsistent zijn en moeten worden gereviewed +VALUESET_BAD_FILTER_OP = De operation ''{0}'' is niet toegestaan voor eigenschap ''{1}'' in system ''{3}''. Toegestane op's: {2} +VALUESET_BAD_FILTER_VALUE_BOOLEAN = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet ''true'' of ''false'' zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODE = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een geldigecode zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODED = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet in het formaat system(|version)#code zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_CODED_INVALID = De waarde voor een filter gebaseerd op eigenschap ''{0}'' is ''{1}'' wat geen geldige code is ({2}) +VALUESET_BAD_FILTER_VALUE_DATETIME = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een geldige datum(/tijd) zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_DECIMAL = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een decimaal zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_HAS_COMMA = De filterwaarde heeft een komma maar de operation is anders dan ''in'' en ''not-in'', dus de komma zal worden geïnterpreteerd als deel van de {0} waarde +VALUESET_BAD_FILTER_VALUE_INTEGER = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een integer zijn, niet ''{1}'' +VALUESET_BAD_FILTER_VALUE_VALID_CODE = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een geldige code van system ''{2}'' en ''{1}'' is niet ''{3}'' +VALUESET_BAD_FILTER_VALUE_VALID_CODE_CHANGE = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een geldige code van system ''{2}'' en ''{1}'' is niet ''{3}''. Merk op dat dit voorheen anders was; van terminologieservers wordt verwacht dat ze dit filter blijven ondersteunen +VALUESET_BAD_FILTER_VALUE_VALID_REGEX = De waarde voor een filter gebaseerd op eigenschap ''{0}'' moet een geldige regex zijn, niet ''{1}'' (fout = ''{2}'') +VALUESET_BAD_PROPERTY_NO_REGEX = Kan geen regex filter op eigenschap ''{0}'' toepassen (regex filters werken meestal op codes, of een benoemde eigenschap van het codesysteem) +VALUESET_CIRCULAR_REFERENCE = Recursieve verwijzing {0} gevonden bij verwerking van ValueSet met pathway {1} +VALUESET_CONCEPT_DISPLAY_PRESENCE_MIXED = Deze inclusie heeft diverse concepten met weergaven en sommige zonder - controleer of dit de intentie was +VALUESET_CONCEPT_DISPLAY_SCT_TAG_MIXED = Deze SNOMED CT-gebaseerde inclusie heeft diverse concepten met semantische markeringen (FSN termen) en sommige zonder (voorkeurstermen) - controleer of dit de intentie was (voorbeelden voor FSN: {0} en voorbeelden zonder FSN: {1}) +VALUESET_EXAMPLE_SYSTEM_ERROR = Voorbeeld systeem ''{0}'' gespecificeerd, wat niet geldig is. Concepten en filters kunnen niet worden gecheckt +VALUESET_EXAMPLE_SYSTEM_HINT = Voorbeeld systeem ''{0}'' gespecificeerd, dus concepten en filters kunnen niet worden gecheckt +VALUESET_IMPORT_UNION_INTERSECTION = Deze waardelijst heeft een enkele include met meerdere geimporteerde waardelijsten. Per issue https://jira.hl7.org/browse/FHIR-25179, is er onduidelijkheid geweest over of deze waardelijsten samen moeten worden genomen of juist de doorsnede hiervan. Als deze waardelijst stond in een package van voor 31 maart 2022, dan wordt deze als bundeling, anders als doorsnede. Als je een bundeling wilt, verdeel dan de waardelijst imports over meerdere includes +VALUESET_INCLUDE_CSVER_CONTENT = De waardelijst verwijst naar CodeSystem ''{0}'' versie ''{2}'' met status ''{1}'' +VALUESET_INCLUDE_CSVER_MULTI_FOUND = Meerdere overeenkomstige contained codesystemen gevonden voor system ''{0}'' versie ''{1}'' +VALUESET_INCLUDE_CSVER_NOT_FOUND = Geen overeenkomstige contained codesystemen gevonden voor system ''{0}'' versie ''{1}'' +VALUESET_INCLUDE_CSVER_SUPPLEMENT = De waardelijst verwijst naar codesystem ''{0}'' versie ''{2}'' wat een supplement is. Het moet verwijzen naar het onderliggende codesysteem ''{1}'' en de extensie http://hl7.org/fhir/StructureDefinition/valueset-supplement gebruiken voor het supplement +VALUESET_INCLUDE_CS_CONTENT = De waardelijst verwijst naar codesysteem ''{0}'' met status ''{1}'' +VALUESET_INCLUDE_CS_MULTI_FOUND = Meerdere overeenkomstige contained codesystemen gevonden voor system ''{0}'' +VALUESET_INCLUDE_CS_NOT_CS = De inclusie voor system ''{0}'' is een verwijzing naar een contained resourced, maar de contained resource met dat id is geen CodeSystem, maar een {1} +VALUESET_INCLUDE_CS_NOT_FOUND = Geen overeenkomstig contained codesysteem gevonden voor system ''{0}'' +VALUESET_INCLUDE_CS_SUPPLEMENT = De waardelijst verwijst naar CodeSystem ''{0}'' wat een supplement is. Het moet verwijzen naar het onderliggende codesysteem ''{1}'' en de extensie http://hl7.org/fhir/StructureDefinition/valueset-supplement gebruiken voor het supplement +VALUESET_INCLUDE_INVALID_CONCEPT_CODE = De code ''{1}'' is niet geldig in het systeem {0} ({2}) +VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = De code ''{2}'' is niet geldig in het systeem {0} versie {1} ({2}) +VALUESET_INCLUDE_SYSTEM_ABSOLUTE = Uri-waarden in ValueSet.compose.include.system moeten absoluut zijn +VALUESET_INCLUDE_SYSTEM_ABSOLUTE_FRAG = Uri-waarden in ValueSet.compose.include.system moeten absoluut zijn. Om te verwijzen naar een contained codesysteem, gebruik je de volledige CodeSystem url en via de http://hl7.org/fhir/StructureDefinition/valueset-system extension +VALUESET_INC_TOO_MANY_CODES = De waardelijst-inclusie heeft teveel codes om te valideren ({0}), dus niet elke individuele code is gecontroleerd +VALUESET_NO_SYSTEM_WARNING = Geen System gespecificeerd, dus Concepten en Filters kunnen niet worden gecontroleerd +VALUESET_REFERENCE_INVALID_TYPE = De waardelijst-import {0} wijst naar een resource van type {1} wat niet geldig is +VALUESET_REFERENCE_UNKNOWN = De waardelijst-import {0} is niet gevonden dus kan niet worden gecontroleerd +VALUESET_SHAREABLE_EXTRA_MISSING = Gepubliceerde waardelijsten ZOUDEN zich MOETEN houden aan het ShareableValueSet profiel, wat zegt dat het element ValueSet.{0} aanwezig zou moeten zijn, maar het ontbreekt +VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = Door HL7 gepubliceerde waardelijsten MOETEN zich houden aan het ShareableValueSet profiel, wat zegt dat het element ValueSet.{0} aanwezig zou moeten zijn, maar het ontbreekt +VALUESET_SHAREABLE_MISSING = Gepubliceerde waardelijsten ZOUDEN zich MOETEN houden aan het ShareableValueSet profiel, wat zegt dat het element ValueSet.{0} aanwezig moet zijn, maar het ontbreekt +VALUESET_SHAREABLE_MISSING_HL7 = Door HL7 gepubliceerde waardelijsten MOETEN zich houden aan het ShareableValueSet profiel, wat zegt dat het element ValueSet.{0} aanwezig moet zijn, maar het ontbreekt +VALUESET_SUPPLEMENT_MISSING_one = Verplicht supplement niet gevonden: {1} +VALUESET_SUPPLEMENT_MISSING_other = Verplichte supplementen niet gevonden: {1} +VALUESET_TOO_COSTLY = De expansie van waardelijst ''{0}'' heeft teveel codes om weer te geven ({1}) +VALUESET_TOO_COSTLY_COUNT = De waardelijst ''{0}'' expansie heeft {2} codes, wat er teveel zijn om weer te geven ({1}) +VALUESET_TOO_COSTLY_TIME = De waardelijst ''{0}'' expansie duurde te lang om te verwerken (>{1}sec) +VALUESET_UNC_SYSTEM_WARNING = Onbekend system ''{0}'' gespecificeerd, dus Concepten en Filters kunnen niet worden gecontroleerd (Details: {1}) +VALUESET_UNC_SYSTEM_WARNING_VER = Onbekend systeem/versie ''{0}'' gespecificeerd, dus Concepten en Filters kunnen niet worden gecontroleerd (Details: {1}) +VALUESET_UNKNOWN_FILTER_PROPERTY = De eigenschap ''{0}'' is niet bekend voor system ''{1}'', dus wordt mogelijk niet begrepen door het terminologie-ecosysteem. Bekende eigenschappen voor dit systeem: {2} +VALUESET_UNKNOWN_FILTER_PROPERTY_NO_CS = Er is geen definitie gevonden voor het systeem {1} en de eigenschap ''{0}'' is geen algemeen bekende eigenschap, dus mogelijk is de eigenschap niet geldig en/of wordt deze niet begrepen door het terminologie-ecosysteem. Misschien nuttig: de lijst met algemeen bekende eigenschappen voor alle systemen is {2} Validation_BUNDLE_Message = De eerste entry in een message moet een MessageHeader Validation_VAL_Content_Unknown = Niet-herkende content {0} Validation_VAL_NoType = Onbekend type {0} Validation_VAL_Profile_MatchMultiple = Profiel {0}, element komt overeen met meer dan een slice - {1}, {2} -## for the next 4 messages, the available parameters are: 0: profile url, 1: ed.path, 2: ed.id, 3: ed.sliceName, 4: ed.label, 5: element.path, 6: ed.min and optionally 7: actual count Validation_VAL_Profile_Maximum_one = {3}: max toegestaan = {7}, maar gevonden {0} (uit {1}) Validation_VAL_Profile_Maximum_other = {3}: max toegestaan = {7}, maar gevonden {0} (uit {1}) Validation_VAL_Profile_Minimum_one = {3}: minimum vereist = {7}, maar gevonden {0} (uit {1}) Validation_VAL_Profile_Minimum_other = {3}: minimum vereist = {7}, maar gevonden {0} (uit {1}) +Validation_VAL_Profile_Minimum_SLICE_one = Slice ''{3}'': een matching slice is verplicht, maar niet gevonden (van {1}). Merk op dat andere slices zijn toegestaan naast de verplichte slice +Validation_VAL_Profile_Minimum_SLICE_other = Slice ''{3}'': minimum vereist = {0}, maar slechts {7} gevonden (van {1}) +Validation_VAL_Profile_MultipleMatches_one = Meerdere overeenkomende profielen gevonden in {0} keuze: {1} +Validation_VAL_Profile_MultipleMatches_other = Meerdere overeenkomende profielen gevonden in {0} keuzes: {1} Validation_VAL_Profile_NoCheckMax_one = {3}: {0} matches gevonden, maar kan max toegestaan niet controleren ({2}) vanwege missende slicing-validatie (uit {1}) Validation_VAL_Profile_NoCheckMax_other = {3}: {0} matches gevonden, maar kan max toegestaan niet controleren ({2}) vanwege missende slicing-validatie (uit {1}) Validation_VAL_Profile_NoCheckMin_one = {3}: {0} matches gevonden, maar kan min toegestaan niet controleren ({2}) vanwege missende slicing-validatie (uit {1}) Validation_VAL_Profile_NoCheckMin_other = {3}: {0} matches gevonden, maar kan min toegestaan niet controleren ({2}) vanwege missende slicing-validatie (uit {1}) -Validation_VAL_Profile_MultipleMatches_one = Meerdere overeenkomende profielen gevonden in {0} keuze: {1} -Validation_VAL_Profile_MultipleMatches_other = Meerdere overeenkomende profielen gevonden in {0} keuzes: {1} Validation_VAL_Profile_NoDefinition = Geen definitie gevonden voor resourcetype ''{0}'' Validation_VAL_Profile_NoMatch = Kan geen overeenkomstig profiel vinden in de opties: {0} Validation_VAL_Profile_NoSnapshot = StructureDefinition {0} heeft geen snapshot - validatie is tegen de snapshot, dus deze is verplicht -Validation_VAL_Profile_NoType = Het type element {0} is onbekend, wat illegaal is. Geldige typen op dit moment zijn {1} +Validation_VAL_Profile_NoType = Het type van element {0} is onbekend - het kon niet worden bepaald uit de beschikbare informatie. Geldige typen op dit punt zijn {1} Validation_VAL_Profile_NotAllowed = Dit element is niet geldig volgens het profiel {0} Validation_VAL_Profile_NotSlice = Dit element komt niet overeen met enige bekende slice {0} en slicing is GESLOTEN: {1} Validation_VAL_Profile_OutOfOrder = Volgens het profiel {0}, staat element ''{1}'' niet op de juiste plaats (gevonden na {2}) Validation_VAL_Profile_SliceOrder = Volgens het profiel {0}, staat element ''{1}'' niet op de juiste plaats in de slices (volgorde is specifiek) -Validation_VAL_Profile_Unknown = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze onbekend is -VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze onbekend is en de validator ingesteld is om onbekende profielen niet op te zoeken -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze onbekend is en ophalen ervan resulteerde in een fout {1} -VALIDATION_VAL_PROFILE_UNKNOWN_ERROR_NETWORK = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze onbekend is en de host {1} niet kon worden gevonden +Validation_VAL_Profile_Unknown = Profiel-referentie ''{0}'' is niet gecontroleerd omdat deze niet is gevonden +Validation_VAL_Profile_WrongType = Gespecificeerde profieltype was ''{0}'' in profiel ''{2}'', maar gevonden type ''{1}'' +Validation_VAL_Profile_WrongType2 = Type komt niet overeen bij verwerken van profiel {0} bij pad {1}: Het elementtype is {4}, maar het profiel {3} is voor een ander type {2} Validation_VAL_Unknown_Profile = Onbekend profiel {0} -VALIDATION_VAL_PROFILE_DEPENDS_NOT_RESOLVED = Profiel {1} identificeert {2} als afhankelijkheid (met de extensie http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies), maar dit profiel kon niet worden gevonden -XHTML_XHTML_Attribute_Illegal = Ongeldig attribuut in de XHTML (''{0}'' op ''{1}'') -XHTML_XHTML_Element_Illegal = Ongeldig element in de XHTML (''{0}'') -XHTML_XHTML_Entity_Illegal = Ongeldige entity in de XHTML (''{0}'') -XHTML_XHTML_Image_Reference_Illegal = Ongeldige afbeeldingreferentie in de XHTML (''{0}'') -XHTML_XHTML_NS_InValid = Verkeerde namespace op de XHTML (''{0}'', moet zijn ''{1}'') -XHTML_XHTML_Name_Invalid = Verkeerde naam in de XHTML (''{0}'') - moet beginnen met div -_DT_Fixed_Wrong = Waarde is ''{0}'' maar moet zijn ''{1}'' -All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod = Alle Observations zouden een effectiveDateTime of effectivePeriod moeten bevatten -All_observations_should_have_a_performer = Alle observations zouden een performer moeten bevatten -All_observations_should_have_a_subject = Alle observations zouden een subject moeten bevatten -Unable_to_resolve_slice_matching__no_fixed_value_or_required_value_set = Kan slices niet koppelen aan definitie - geen vaste waarde of verplichte waardelijst -Unable_to_resolve_slice_matching__slice_matching_by_value_set_not_done = Kan slices niet koppelen aan definitie - slice op basis van waardelijst niet gedaan -Problem_processing_expression__in_profile__path__ = Probleem bij verwerken van expressie {0} in profiel {1} pad {2}: {3} -Unable_to_find_element_with_id_ = Kan element met id ''{0}'' niet vinden -Slice_encountered_midway_through_set_path___id___ = Slice gevonden midden in de set (pad = {0}, id = {1}); {2} -Unable_to_resolve_actual_type_ = Kan werkelijke type niet vinden {0} -Unsupported_version_R1 = Niet-ondersteunde versie R1 -Unsupported_version_R2 = Niet-ondersteunde versie R2 -Unsupported_version_R2B = Niet-ondersteunde versie R2B -Unsupported_fixed_value_type_for_discriminator_for_slice__ = Niet-ondersteund type vaste waarde voor discriminator ({0}) voor slice {1}: {2} -Unsupported_CodeableConcept_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - extensies niet toegestaan - voor discriminator ({0}) voor slice {1} -Unsupported_CodeableConcept_pattern__must_have_at_least_one_coding__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - teminste een coding verplicht - voor discriminator ({0}) voor slice {1} -Unsupported_CodeableConcept_pattern__using_text__for_discriminator_for_slice_ = Niet-ondersteund CodeableConcept patroon - gebruik van text - voor discriminator ({0}) voor slice {1} -Unsupported_Identifier_pattern__extensions_are_not_allowed__for_discriminator_for_slice_ = Niet-ondersteund Identifier patroon - extensies niet toegestaan - voor discriminator ({0}) voor slice {1} -Unsupported_fixed_pattern_type_for_discriminator_for_slice__ = Niet-ondersteund vast patroontype voor discriminator ({0}) voor slice {1}: {2} -Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___ = Probleem bij controle van slicing-expressie voor element in profiel {0} pad {1} (fhirPath = {2}): {3} -Could_not_match_discriminator_for_slice_in_profile_one = Kan geen overeenkomende discriminator ({0}) bepalen voor slice {1} in profiel {2} - de discriminator {3} heeft geen vaste waarde, binding of aanwezigheidverplichtingen -Could_not_match_discriminator_for_slice_in_profile_other = Kan geen overeenkomende discriminators ({1}) bepalen voor slice {2} in profiel {3} - Geen van de {0} discriminators {4} hebben een vaste waarde, binding of aanwezigheidverplichtingen -Discriminator__is_based_on_element_existence_but_slice__neither_sets_min1_or_max0 = Discriminator ({0}) is gebaseerd op elementaanwezigheid, maar slice {1} heeft geen min>=1 of max=0 -Profile_based_discriminators_must_have_a_type_with_a_profile__in_profile_ = Profiel-gebaseerde discriminators moeten een type hebben met een profiel ({0} in profiel {1}) -#The following error cannot occur for a single item. _one case left intentionally blank. -Profile_based_discriminators_must_have_only_one_type__in_profile_one = -Profile_based_discriminators_must_have_only_one_type__in_profile_other = Profiel-gebaseerde discriminators moeten slechts een type bevatten ({1} in profile {2}). Gevonden {0} typen -Profile_based_discriminators_must_have_a_type__in_profile_ = Profiel-gebaseerde discriminators moeten een type hebben ({0} in profile {1}) -Discriminator__is_based_on_type_but_slice__in__has_no_types = Discriminator ({0}) is gebaseerd op type, maar slice {1} in {2} heeft geen typen -#The following error cannot occur for a single item. _one case left intentionally blank. -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_one = -Discriminator__is_based_on_type_but_slice__in__has_multiple_types_other = Discriminator ({1}) is gebaseerd op type, maar slice {2} in {3} heeft {0} typen: {4} -Found__items_for__resolving_discriminator__from_ = {0} items gevonden voor {1} bij controle van discriminator {2} van {3} -Unable_to_find__resolving_discriminator__from_ = Kan {0} niet vinden bij controle van discriminator {1} van {2} -Unable_to_find_resource__at__resolving_discriminator__from_ = Kan resource {0} niet vinden in {1} bij controle van discriminator {2} van {3} -No_reference_resolving_discriminator__from_ = Geen reference bij controle van discriminator {0} in {1} -Unable_to_resolve_element__in_profile_ = Kan element {0} niet vinden in profiel {1} -Unable_to_resolve_profile_ = Kan profiel {0} niet vinden -Resource_resolution_services_not_provided = Resource resolution functionaliteit wordt niet ondersteund -Unrecognised_extension_context_ = Niet-herkende extensiecontext {0} -Unable_to_locate_the_profile__in_order_to_validate_against_it = Kan profiel ''{0}'' niet vinden om tegen te valideren -Reference__refers_to_a__not_a_ValueSet = Reference {0} verwijst naar een {1} in plaats van een ValueSet -Not_done_yet_ValidatorHostServicesconformsToProfile_when_item_is_not_an_element = Nog niet gedaan (ValidatorHostServices.conformsToProfile), wanneer item geen element is -Not_supported_yet = Nog niet ondersteund -Unable_to_resolve_ = Kan {0} niet vinden -Not_done_yet__resolve__locally_2 = Nog niet gedaan - lokaal opzoeken van {0} (2) -Not_done_yet_ValidatorHostServicesexecuteFunction = Nog niet gedaan (ValidatorHostServices.executeFunction) -Not_done_yet_ValidatorHostServicescheckFunction = Nog niet gedaan (ValidatorHostServices.checkFunction) -Not_done_yet_ValidatorHostServicesresolveFunction_ = Nog niet gedaan (ValidatorHostServices.resolveFunction): {0} -Unable_to_find_base_definition_for_logical_model__from_ = Kan geen basisdefinitie vinden voor logical model: {0} van {1} -Same_id_on_multiple_elements__in_ = Zelfde id ''{0}'' op meerdere elementen {1}/{2} in {3} -No_path_on_element_Definition__in_ = Geen pad op elementdefinitie {0} in {1} -needs_a_snapshot = heeft snapshot nodig -not_the_right_kind_of_structure_to_generate_schematrons_for = niet de juiste structuur om schematrons voor te genereren -Not_handled_yet_sortElements_ = Nog niet ondersteund (sortElements: {0}:{1}) -Unable_to_resolve_profile__in_element_ = Kan profiel {0} niet vinden in element {1} -Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Kan geen onderliggende elementen hebben op een polymorf element - je moet deze eerst opdelen in slices per type (sortElements: {0}:{1}) -Unable_to_find_profile__at_ = Kan profiel ''{0}'' niet vinden in {1} -Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Niet-ondersteunde situatie: resource heeft profiel voor meerdere opties - kan profiel niet sorteren -Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_ = Interne recursiedetectie: find() loop pad recursie > {0} - controleer of paden geldig zijn (voor pad {1}/{2}) -Internal_error___type_not_known_ = Interne fout - type onbekend {0} -Unable_to_find_element_ = Kan element {0} niet vinden -Error_generating_table_for_profile__ = Fout bij maken van tabel voor profiel {0}: {1} -StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} in {1}: incorrect beperkt type {2} van {3} in {4} -Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Fout bij {0}#{1}: het doelprofiel {2} is geen geldige inperking op de basis ({3}) -Error_in_profile__at__Base_isSummary___derived_isSummary__ = Fout in profiel {0} in {1}: Basis isSummary = {2}, afgeleide isSummary = {3} -StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_ = StructureDefinition {0} in {1}: incorrecte poging om een binding te wijzigen van {2} in {3} -Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Onverwachte situatie in differential: ongeldig type bij {0}/{1} -Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Onverwachte conditie in differential: impliciete slicenaam bevat geen geldig type (''{0}''?) bij {1}/{2} -Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Poging om een snapshot van profiel ''{0}'' te gebruiken als {1} voordat deze is gegenereerd -null_min = null min -_has_children__for_type__in_profile__but_cant_find_type = {0} heeft onderliggende elementen ({1}) voor type {2} in profiel {3}, maar kan type niet vinden -_has_children__and_multiple_types__in_profile_ = {0} heeft onderliggende elementen ({1}) en meerdere typen ({2}) in profiel {3} -Adding_wrong_path = Verkeerd pad toegevoegd -Named_items_are_out_of_order_in_the_slice = Volgorde van benoemde items in de slice klopt niet -The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = De basis-snapshot markeert een slicing als gesloten, maar de differential probeert hierop uit te breiden in {0} in {1} ({2}) -Not_done_yet = Nog niet gedaan -Unknown_type__at_ = Onbekend type {0} in {1} -Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential gaat in ''{0} (@ {1})'', maar de basis doet dat niet en er is niet een enkelvoudig vast type. Het type is {2}. Dit wordt nog niet ondersteund -Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - regel @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - disciminator @ {2} ({3}) -Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicingregels op differential ({0}) komen niet overeen met die van de basis ({1}) - volgorde @ {2} ({3}) -not_done_yet__slicing__types__ = nog niet gedaan - slicing / typen @ {0} -Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Invalid slicing: there is more than one type slice at {0}, but one of them ({1}) has min = 1, so the other slices cannot exist -Did_not_find_type_root_ = Kan type root niet vinden: {0} -Error_at_path__Slice_for_type__has_wrong_type_ = Fout bij pad {0}: Slice voor type ''{1}'' heeft verkeerde type ''{2}'' -Error_at_path__Slice_for_type__has_more_than_one_type_ = Fout bij pad {0}: Slice voor type ''{1}'' heeft meerdere typen ''{2}'' -Error_at_path__Slice_name_must_be__but_is_ = Fout bij pad {0}: Slicenaam moet zijn ''{1}'' maar is ''{2}'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.path != ''$this'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.type != ''type'' -Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Fout bij pad {0} in {1}: Type slicing met slicing.discriminator.count() > 1 -Error_at_path__in__Type_slicing_with_slicingordered__true = Fout bij pad {0} in {1}: Type slicing met slicing.ordered = true -Adding_wrong_path_in_profile___vs_ = Verkeerd pad toegevoegd in profiel {0}: {1} versus {2} -_has_no_children__and_no_types_in_profile_ = {0} heeft geen onderliggende elementen ({1}) en geen typen in profiel {2} -Did_not_find_single_slice_ = Geen enkele slice gevonden: {0} -Differential_does_not_have_a_slice__b_of_____in_profile_ = Differential in profiel {5} heeft geen slice bij {6} (op {0}, positie {1} of {2} / {3} / {4}) -Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Poging tot slicen van een element dat niet herhaalt: {0}/{1} van {2} in {3}, bij element {4} (slice = {5}) -Unable_to_resolve_reference_to_ = Kan reference naar {0} niet vinden -Unable_to_find_element__in_ = Kan element {0} niet vinden in {1} -Unable_to_find_base__for_ = Kan basis {0} voor {1} niet vinden -Adding_wrong_path__outcomegetPath___resultPathBase__ = Verkeerd pad toegevoegd - outcome.getPath() = {0}, resultPathBase = {1} -Illegal_path__in_differential_in__illegal_characters_ = Onjuist pad ''{0}'' in differential in {1}: ongeldige tekens [] -Illegal_path__in_differential_in__illegal_character_ = Onjuist pad ''{0}'' in differential in {1}: ongeldige tekens ''{2}'' -Illegal_path__in_differential_in__no_unicode_whitespace = Onjuist pad ''{0}'' in differential in {1}: geen unicode whitespace -Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Onjuist pad ''{0}'' in differential in {1}: naamdeel is meer dan 64 tekens lang -Illegal_path__in_differential_in__name_portion_mising_ = Onjuist pad ''{0}'' in differential in {1}: naamdeel mist (''..'') -Illegal_path__in_differential_in__must_start_with_ = Onjuist pad ''{0}'' in differential in {1}: moet beginnen met {2}.{3} -No_path_value_on_element_in_differential_in_ = Geen padwaarde op element in differential in {0} -No_path_on_element_in_differential_in_ = Geen pad op element in differential in {0} -Unxpected_internal_condition__no_source_on_diff_element = Onverwachte interne conditie - geen bron op diff element -type_on_first_snapshot_element_for__in__from_ = type op eerste snapshotelement voor {0} in {1} van {2} -type_on_first_differential_element = type op eerste differential element! -Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Circulaire snapshot-references gedetecteerd; kan geen snapshot genereren (stack = {0}) -Base__Derived_profiles_have_different_types____vs___ = Basis & afgeleide profielen hebben verschillende typen ({0} = {1} vs {2} = {3}) -Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Afgeleid profiel {0} heeft geen waarde voor derivation en kan dus niet worden verwerkt -Derived_profile__has_no_type = Afgeleid profiel {0} heeft geen type -Base_profile__has_no_type = Basisprofiel {0} heeft geen type -no_derived_structure_provided = geen afgeleide structuur gevonden -no_base_profile_provided = geen basisprofiel gevonden -element_id__null__on_ = element id = null: {0} op {1} -element__null_ = element = null: {0} -getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList moet alleen worden aangeroepen als het element slicing heeft -Unable_to_resolve_name_reference__at_path_ = Kan naamverwijzing {0} niet vinden op pad {1} -Details_for__matching_against_Profile_ = Details voor {0} matching tegen profiel {1} -Does_not_match_slice_ = Komt niet overeen met slice ''{0}'' (discriminator: {1}) -Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profiel {0} komt niet overeen met {1} vanwege de volgende profielissues: {2} -This_element_does_not_match_any_known_slice_ = Dit element komt niet overeen met een bekende slice {0} -defined_in_the_profile = gedefinieerd in het profiel -This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Dit lijkt geen FHIR-resource te zijn (onbekende naam ''{0}'') -This_cannot_be_parsed_as_a_FHIR_object_no_name = Deze kan niet worden verwerkt als FHIR-object (geen naam) -This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = Dit lijkt geen FHIR-resource te zijn (onbekende namespace/naam ''{0}::{1}'') -This__cannot_be_parsed_as_a_FHIR_object_no_namespace = Dit ''{0}'' kan niet worden verwerkt als een FHIR-object (geen) -Unable_to_find_resourceType_property = Kan resourceType property niet vinden -Error_parsing_JSON_the_primitive_value_must_be_a_string = Fout bij verwerken JSON: de primitieve waarde moet een string zijn -Error_parsing_JSON_the_primitive_value_must_be_a_number = Fout bij verwerken JSON: de primitieve waarde moet een getal zijn -Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Fout bij verwerken JSON: de primitieve waarde moet een boolean zijn -Error_parsing_XHTML_ = Fout bij verwerken XHTML: {0} -This_property_must_be_an_object_not_ = Deze property moet een object zijn, geen {0} ({1} bij {2}) -This_property_must_be_an_simple_value_not_ = Deze property moet een eenvoudige waarde zijn, geen {0} ({1} bij {2}) -This_property_must_be__not_ = Deze property {2} moet {0} zijn, geen {1} (bij {3}) -This_property_must_be_an_Array_not_ = De property {1} moet een JSON Array zijn, geen {0} (bij {2}) -OBJECT_CANNOT_BE_KEYED_ARRAY_CHILD_COUNT = This object cannot be an keyed Array in Json because it does not have two children in the definitions (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_NAME = This object is defined as a keyed Array in Json but the definition does not name the first child element as the key (children = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_PROP_TYPE = This object is defined as a keyed Array in Json but the key property named in the definitions is not a primitive type (children = {0}, type = {1}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_CHOICE = This object is defined as a keyed Array in Json but the value property named in the definitions is a choice - this is not supported (value property = {0}) -OBJECT_CANNOT_BE_KEYED_ARRAY_NO_LIST = This object is defined as a keyed Array in Json but the value property named in the definitions is a list - this is not supported (value property = {0}) -Unrecognised_property_ = Niet-herkende property ''@{0}'' -Object_must_have_some_content = Object moet inhoud hebben -Error_parsing_JSON_ = Fout bij verwerken JSON: {0} -Node_type__is_not_allowed = Nodetype {0} is niet toegestaan -CDATA_is_not_allowed = CDATA is niet toegestaan -Undefined_element_ = Ongedefinieerd element ''{0}'' -Undefined_attribute__on__for_type__properties__ = Ongedefinieerd attribuut ''@{0}'' op {1} voor type {2} -Text_should_not_be_present = Er zou geen text moeten zijn (''{0}'') +Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Versies komen niet overeen. De context heeft versie {0} geladen en de nieuwe content die wordt geladen heeft versie {1} Wrong_namespace__expected_ = Verkeerde namespace - verwacht ''{0}'' -Element_must_have_some_content = Element moet inhoud hebben -No_processing_instructions_allowed_in_resources = Geen processing instructions toegestaan in resources -Unknown_resource_type_missing_rdfstype = Onbekend resourcetype (rdfs:type ontbreekt) -reference_to__cannot_be_resolved = reference naar {0} kan niet worden gevonden -This_property_must_be_a_URI_or_bnode_not_ = Deze property moet een URI of bnode zijn, geen {0} -This_property_must_be_a_Literal_not_ = Deze property moet een Literal zijn, geen {0} -Unrecognised_predicate_ = Niet-herkend predicaat ''{0}'' -Error_parsing_Turtle_ = Fout bij verwerken Turtle: {0} -Unexpected_datatype_for_rdfstype = Onverwacht datatype voor rdfs:type -Attempt_to_replace_element_name_for_a_nonchoice_type=Attempt to replace element name for a non-choice type Wrong_type_for_resource = Verkeerd type voor resource -Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Contained resource lijkt geen FHIR-type hebben (onbekende naam ''{0}'') -Unknown_Date_format_ = Onbekend Date formaat ''{0}'' -Unknown_Data_format_ = Onbekend Data formaat ''{0}'' -No_type_found_on_ = Geen type gevonden op ''{0}'' -error_writing_number__to_JSON = fout bij schrijven van getal ''{0}'' in JSON -Unable_to_process_request_for_resource_for___ = Kan verzoek voor resource voor {0} / {1} niet verwerken -Resource_type_mismatch_for___ = Resourcetype komt niet overeen voor {0} / {1} -not_done_yet_cant_fetch_ = nog niet gedaan: kan niet {0} ophalen -Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Poging om terminologieserver te gebruiken terwijl er geen terminologieserver beschikbaar is -No_ExpansionProfile_provided = Geen ExpansionProfile gevonden -Can_only_specify_profile_in_the_context = Kan alleen een profiel specificeren in de context -no_url_in_expand_value_set_2 = geen url in expand waardelijst 2 -no_url_in_expand_value_set = geen url in expand waardelijst -no_value_set = waardelijst heeft geen url property -No_Parameters_provided_to_expandVS = Geen Parameters gevonden voor expandVS -No_Expansion_Parameters_provided = Geen Expansion Parameters gevonden -Unable_to_resolve_value_Set_ = Kan waardelijst {0} niet vinden -Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited versies komen exact overeen met delimiter ''{0}'' : {1} vs {2} -Duplicate_Resource_ = Duplicaat resource {0} van type {3} (bestaande versie {2}, nieuwe versie {1}) -DUPLICATE_RESOURCE_VERSION = Duplicate Resource {0} Version {1} of type {2} -Error_expanding_ValueSet_running_without_terminology_services = Fout bij expansie van ValueSet: geen terminologieservices -Error_validating_code_running_without_terminology_services = Fout bij valideren van code: geen terminologieservices -Unable_to_validate_code_without_using_server = Kan code niet valideren zonder een server, omdat: {0} -UNABLE_TO_VALIDATE_LOCALLY = Unable to validate code locally: {0} -Profile___Error_generating_snapshot = Profiel {0} ({1}). Fout bij genereren snapshot -Profile___element__Error_generating_snapshot_ = Profiel {0} ({1}), element {2}. Fout bij genereren snapshot: {3} -Profile___base__could_not_be_resolved = Profiel {0} ({1}) basis {2} niet gevonden -Profile___has_no_base_and_no_snapshot = Profiel {0} ({1}) heeft geen basis en geen snapshot -No_validator_configured = Geen validator geconfigureerd -Parser_Type__not_supported = Parsertype {0} niet ondersteund -Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Versies komen niet overeen. De context heeft versie {0} geladen en de nieuwe content die wordt geladen heeft versie {1} -Error_reading__from_package__ = Fout bij lezen {0} uit package {1}#{2}: {3} -Error_parsing_ = Fout bij verwerken {0}:{1} -Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Kan niet verbinden met terminologieserver. Gebruik parameter ''-tx n/a'' om te starten zonder terminologieservices voor validatie van LOINC, SNOMED, ICD-X etc. Fout = {0} -Display_Name_for__should_be_one_of__instead_of_one = Verkeerde weergavenaam ''{4}'' voor {1}#{2} - moet zijn ''{3}'' (voor taal/talen ''{5}'') -Display_Name_for__should_be_one_of__instead_of_other = Verkeerde weergavenaam ''{4}'' voor {1}#{2} - moet een zijn van {0} keuzes: ''{3}'' voor de taal/talen ''{5}'' -Unknown_Code_in = Onbekende code {0} in {1} -Unknown_Code_in_Version = Onbekende code {0} in {1} versie {2} -UNKNOWN_CODE_IN_FRAGMENT = Onbekende code {0} in {1} - merk op dat het codesysteem is gemarkeerd als fragment, waardoor mogelijk geldig is in een ander fragment -Code_found_in_expansion_however_ = Code gevonden in expansion, echter: {0} -None_of_the_provided_codes_are_in_the_value_set_one = De opgegeven code {2} staat niet in de waardelijst ''{1}'' -None_of_the_provided_codes_are_in_the_value_set_other = Geen van de opgegeven codes {2} staan niet in de waardelijst ''{1}'' -Coding_has_no_system__cannot_validate = Coding heeft geen system - kan niet valideren -Unable_to_handle_system__concept_filter_with_op__ = Kan system {0} concept filter met op = {1} niet verwerken -Unable_to_handle_system__filter_with_property__ = Kan system {0} filter met property = {1} niet verwerken, op = {2} -Unable_to_resolve_system__value_set_has_include_with_no_system = Kan system niet vinden - waardelijst {0} include #{1} heeft geen system -UNABLE_TO_RESOLVE_SYSTEM_SYSTEM_IS_INDETERMINATE = The code system {1} referred to from value set {0} has a grammar, and the code might be valid in it -Unable_to_resolve_system__value_set_has_include_with_unknown_system = Unable to resolve system - value set {0} include #{1} has system {2} which is unknown, and the server return error {3} -Unable_to_resolve_system__value_set_has_include_with_filter = Unable to resolve system - value set {0} include #{1} has a filter on system {2} -Unable_to_resolve_system__value_set_has_imports = Kan system niet vinden - waardelijst heeft imports -Unable_to_resolve_system__value_set_has_multiple_matches = Unable to resolve system - value set expansion has multiple matches: {0} -Unable_to_resolve_system__value_set_has_no_includes_or_expansion = Kan system niet vinden - waardelijst {0} heeft geen include of expansion -Unable_to_resolve_system__no_value_set = Kan system niet vinden - geen waardelijst -This_base_property_must_be_an_Array_not_ = Deze basis-property moet een Array zijn, geen {0} -This_property_must_be_an_Array_not_ = Deze property {1} moet een JSON Array zijn, geen {0} (bij {2}) -documentmsg = (document) -xml_attr_value_invalid = Het XML attribuut {0} bevat een onjuist teken -xml_encoding_invalid = De XML encoding is onjuist (moet UTF-8 zijn) -xml_stated_encoding_invalid = De XML encoding in de header is onjuist (moet ''UTF-8'' zijn, indien gespecificeerd) -XHTML_URL_INVALID = De URL is ongeldig vanwege ''({1})'' : {0} -MEASURE_MR_GRP_NO_CODE = Group moet een code hebben die overeenkomt de group-definitie in de measure -MEASURE_MR_GRP_UNK_CODE = De code voor deze group komt niet overeen met de measure-definitie -MEASURE_MR_GRP_DUPL_CODE = De code voor deze group wordt gedupliceerd door een andere group -MEASURE_MR_GRP_MISSING_BY_CODE = Het MeasureReport bevat geen group voor de group {0} -MEASURE_MR_GRP_NO_USABLE_CODE = Geen van de gevonden codes zijn bruikbaar voor vergelijking - zowel system als code zijn vereist op tenminste een code -MEASURE_MR_GRP_NO_WRONG_CODE = De gevonden code ({0}) komt niet overeen met de code in het MeasureReport ({1}) -DUPLICATE_ID = Duplicaat id waarde ''{0}'' -TERMINOLOGY_TX_SYSTEM_NO_CODE = Een code zonder system heeft geen gedefinieerde betekenis. Een system is vereist -MEASURE_MR_GRP_POP_NO_CODE = Group zou een code moeten hebben die overeenkomt met de population-definitie van de group in de measure -MEASURE_MR_GRP_POP_UNK_CODE = De code van deze group population komt niet overeen met de measure-definitie -MEASURE_MR_GRP_POP_DUPL_CODE = De code van deze group population wordt gedupliceerd door een andere group -MEASURE_MR_GRP_POP_MISSING_BY_CODE = Het MeasureReport bevat geen population group voor population group {0} -MEASURE_MR_GRP_POP_COUNT_MISMATCH = Aantal {0} en aantal subjects {1} komen niet overeen -MEASURE_MR_GRP_POP_NO_SUBJECTS = Reports waar het type niet ''subject-list'' is, horen geen subjects te hebben -MEASURE_MR_GRP_POP_NO_COUNT = Aantal moet aanwezig zijn in reports waar type niet ''subject-list'' is -MEASURE_M_NO_GROUPS = Een measure moet tenminste een group bevatten -MEASURE_M_GROUP_CODE = Groups moeten een code hebben als er meer dan een group is -MEASURE_M_GROUP_POP = Measure groups moeten tenminste een population bevatten -MEASURE_M_GROUP_STRATA = Measure groups moeten tenminste een stratifier bevatten -MEASURE_M_GROUP_POP_NO_CODE = Een measure group population moeten een code bevatten als er meer dan een population is -MEASURE_M_GROUP_STRATA_NO_CODE = Een measure group stratifier moet een code bevatten als er meer dan een population is -MEASURE_M_GROUP_STRATA_COMP_NO_CODE = A measure group stratifier component should have a code when there is more than one population -MEASURE_M_LIB_UNKNOWN = De Library {0} is niet gevonden, dus validatie van expressies is mogelijk niet correct -TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = Canonical URL''s moeten absolute URL''s zijn, als het geen fragmentverwijzingen zijn ({0}) -TYPE_SPECIFIC_CHECKS_CANONICAL_CONTAINED = Canonical URLs in contained resources must be absolute URLs if present ({0}) -MEASURE_MR_SCORE_PROHIBITED_RT = Geen measureScore als het type report ''data-collection'' is -MEASURE_MR_SCORE_PROHIBITED_MS = Geen measureScore als de scoring van het bericht ''cohort'' is -MEASURE_MR_SCORE_REQUIRED = Een measureScore is verplicht als de Measure.scoring={0} -MEASURE_MR_M_SCORING_UNK = Het scoringsysteem in deze measure is onbekend, dus de measureScore waarden kunnen niet worden gecontroleerd -MEASURE_MR_SCORE_UNIT_PROHIBITED = Een measureScore voor deze Measure Scoring ({0}) zou geen eenheden moeten hebben -MEASURE_MR_SCORE_VALUE_REQUIRED = Een waarde is verplicht als de Measure.scoring = {0} is -MEASURE_MR_SCORE_VALUE_INVALID_01 = De waarde is ongeldig - deze moeten tussen 0 en 1 liggen -MEASURE_MR_SCORE_FIXED = Deze waarde is vastgezet door de Measure op ''{0}'' -MEASURE_MR_SCORE_UNIT_REQUIRED = Een eenheid is verplicht als het scoringtype {0} is -MEASURE_M_CRITERIA_UNKNOWN = De expressietaal {0} wordt niet ondersteund, dus deze kan niet worden gevalideerd -MEASURE_M_CQL_NOT_FOUND = Geen van de include CQL-bibliotheken definiren een functie {0} -MEASURE_M_CRITERIA_CQL_NO_LIB = Geen CQL-bibliotheken gevonden bij deze Measure -MEASURE_M_CRITERIA_CQL_ONLY_ONE_LIB = Als de CQL-expressie geen namespace heeft, dan kan er slechts een Library voor de measure zijn -MEASURE_M_CRITERIA_CQL_LIB_NOT_FOUND = Geen overeenkomstige bibliotheek gevonden voor de namespace {0} -MEASURE_M_CRITERIA_CQL_LIB_DUPL = Meerdere overeenkomstige bibiotheken voor de namespace {0} -MEASURE_M_CRITERIA_CQL_ERROR = Fout in {0}: ''{1}'' -MEASURE_M_CRITERIA_CQL_NO_ELM = Fout in {0}: Geen gecompileerde versie van CQL gevonden -MEASURE_M_CRITERIA_CQL_ELM_NOT_VALID = = Fout in {0}: Gecompileerde versie van CQL is niet geldig -MEASURE_M_CRITERIA_CQL_NOT_FOUND = De functie {1} bestaat niet in de bibliotheek {0} +XHTML_IDREF_NOT_FOUND = Het doel van HTML idref attribuut ''{0}'' is niet gevonden in de resource +XHTML_IDREF_NOT_MULTIPLE_MATCHES = Er zijn meerdere matches gevonden voor het HTML idref attribuut ''{0}'' in de resource +XHTML_URL_DATA_DATA_INVALID = De data moet geldige base64 content zijn voor een data: URL: {0} +XHTML_URL_DATA_DATA_INVALID_COMMA = Komma gevonden in data deel van data URL: {0} +XHTML_URL_DATA_MIMETYPE = Het mimetype-deel van de data: URL is ongeldig ({1}) in URL: {0} +XHTML_URL_DATA_NO_DATA = Geen data gevonden in data: URL XHTML_URL_EMPTY = URL is leeg +XHTML_URL_INVALID = De URL is ongeldig vanwege ''({1})'' : {0} XHTML_URL_INVALID_CHARS_one = URL bevat een ongeldig teken ({1}) XHTML_URL_INVALID_CHARS_other = URL bevat {0} ongeldige tekens ({1}) -TERMINOLOGY_TX_SYSTEM_HTTPS = De system URL ''{0}'' begint onterecht met https: in plaats van http: -CODESYSTEM_CS_NO_VS_NOTCOMPLETE = Review de ''alle codes'' ValueSet - incomplete CodeSystems moeten generiek geen waardelijst voor ''alle codes'' specificeren -TYPE_SPECIFIC_CHECKS_DT_IDENTIFIER_IETF_SYSTEM_VALUE = als identifier.system ''urn:ietf:rfc:3986'' is, dan moet de identifier.value een volledige URI zijn (dus beginnen met een scheme) -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_INVALID = Opgegeven Attachment grootte {0} is niet geldig -TYPE_SPECIFIC_CHECKS_DT_ATT_SIZE_CORRECT = Opgegeven Attachment grootte {0} komt niet overeen met werkelijke grootte van de bijlage {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_FETCHER = Attachment grootte kan niet worden gecontroleerd omdat de validator niet geconfigureerd is voor netwerktoegang (url = {0}) -TYPE_SPECIFIC_CHECKS_DT_ATT_UNKNOWN_URL_SCHEME = Attachment grootte kan niet worden gecontroleerd omdat de validator niet weet hoe het toegang tot dit netwerk krijgt {0} -TYPE_SPECIFIC_CHECKS_DT_ATT_URL_ERROR = Attachment grootte kan niet worden gecontroleerd omdat er een probleem was bij toegang tot {0}: {1} -TYPE_SPECIFIC_CHECKS_DT_ATT_TOO_LONG = Attachment grootte is {0} bytes, wat groter is dan de ingestelde grenswaarde van {1} bytes -TYPE_SPECIFIC_CHECKS_DT_ATT_NO_CONTENT = Attachments bevatten data en/of url, of ZOUDEN contentType en/of language MOETEN bevatten -TYPE_SPECIFIC_CHECKS_DT_BASE64_TOO_LONG = Base64 grootte is {0} bytes, wat groter is dan de ingestelde grenswaarde van {1} bytes -TYPE_SPECIFIC_CHECKS_DT_DECIMAL_CHARS = {0} decimalen gevonden wat groter is dan de ingestelde grenswaarde van {1} cijfers -Validation_VAL_Profile_WrongType = Gespecificeerde profieltype was ''{0}'' in profiel ''{2}'', maar gevonden type ''{1}'' -Validation_VAL_Profile_WrongType2 = Type komt niet overeen bij verwerken van profiel {0} bij pad {1}: Het elementtype is {4}, maar het profiel {3} is voor een ander type {2} -VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = Ongeldige inperking in profiel {0} bij pad {1} - kan type {2} niet inperken ten opzichte van basistypen {3} -EXTENSION_EXTP_CONTEXT_WRONG_XVER = The extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) -EXTENSION_EXTM_CONTEXT_WRONG_XVER = The modifier extension {0} from FHIR version {3} is not allowed to be used at this point (allowed = {1}; this element is [{2}; this is a warning since contexts may be renamed between FHIR versions) -SECURITY_STRING_CONTENT_ERROR = De string waarde bevat text die eruit ziet als HTML-tags, wat vanwege veiligheidsredenen niet is toegestaan in deze context -SECURITY_STRING_CONTENT_WARNING = De string waarde bevat text die eruit ziet als HTML-tags. Als deze content wordt weergegeven als HTML zonder de juiste nabewerking, dan houdt dit mogelijk een veiligheidsrisico in -ALL_OK = Alles OK -SEARCHPARAMETER_NOTFOUND = Kan de basis SearchParameter {0} niet vinden dus kan niet controleren of deze SearchParameter een correcte afleiding hiervan is -SEARCHPARAMETER_BASE_WRONG = Het resourcetype {1} is niet bekend als basis in de SearchParameter waar deze van is afgeleid ({0}) -SEARCHPARAMETER_TYPE_WRONG = Het type {1} verschilt van het type {0} in de derivedFrom SearchParameter -SEARCHPARAMETER_EXP_WRONG = De expressie ''{2}'' is niet compatibel met de expressie ''{1}'' in de derivedFrom SearchParameter {0} wat waarschijnlijk betekent dat de derivation-relatie ongeldig is -VALUESET_NO_SYSTEM_WARNING = Geen System gespecificeerd, dus Concepts en Filters kunnen niet worden gecontroleerd -VALUESET_INCLUDE_INVALID_CONCEPT_CODE = De code {1} is niet geldig in het systeem {0} -VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = De code {2} is niet geldig in het systeem {0} versie {1} -VALUESET_EXAMPLE_SYSTEM_HINT = Example System ''{0}'' specified, so Concepts and Filters can''t be checked -VALUESET_EXAMPLE_SYSTEM_ERROR = Example System ''{0}'' specified, which is illegal. Concepts and Filters can''t be checked -VALUESET_UNC_SYSTEM_WARNING = Onbekend system ''{0}'' gespecificeerd, dus Concepten en Filters kunnen niet worden gecontroleerd (Details: {1}) -VALUESET_UNC_SYSTEM_WARNING_VER = Onbekend systeem/versie ''{0}'' gespecificeerd, dus Concepten en Filters kunnen niet worden gecontroleerd (Details: {1}) -Extension_PROF_Type = De definitie voor profiel ''{0}'' is voor het type {1} maar gevonden type is {2} -TYPE_CHECKS_PATTERN_CC = Het patroon [system {0}, code {1}, en display ''{2}''] gedefinieerd in het profiel {3} is niet gevonden. Problemen: {4} -TYPE_CHECKS_PATTERN_CC_US = Het patroon [system {0}, code {1}, display ''{2}'' en userSelected {5}] gedefinieerd in het profiel {3} is niet gevonden. Problemen: {4} -TYPE_CHECKS_FIXED_CC = Het patroon [system {0}, code {1}, en display ''{2}''] gedefinieerd in het profiel {3} is niet gevonden. Problemen: {4} -TYPE_CHECKS_FIXED_CC_US = Het patroon [system {0}, code {1}, display ''{2}'' en userSelected {5}] gedefinieerd in het profiel {3} is niet gevonden. Problemen: {4} -VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = Global profiel reference ''{0}'' van IG {1} is niet gevonden, dus deze is niet gecontroleerd -VALIDATION_VAL_PROFILE_SIGNPOST_BASE = Validate resource against profile -VALIDATION_VAL_PROFILE_SIGNPOST = Valideer resource tegen profile {0} -VALIDATION_VAL_PROFILE_SIGNPOST_META = Valideer resource tegen profiel {0} - zoals in meta -VALIDATION_VAL_PROFILE_SIGNPOST_DEP = Validate resource against profile {0} (per http://hl7.org/fhir/StructureDefinition/structuredefinition-dependencies in {1}) -VALIDATION_VAL_PROFILE_SIGNPOST_BUNDLE_PARAM = Valideer resource tegen profiel {0} - via bundle param -VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = Valideer resource tegen profiel {0} - een global profiel in {1} -ERROR_GENERATING_SNAPSHOT = Fout bij genereren snapshot: {0} (dit komt meestal door een probleem in de differential) -SNAPSHOT_EXISTING_PROBLEM = De gegenereerde snapshot heeft een ander aantal elementen {1} dan de oorspronkelijke snapshot {0} -FHIRPATH_LOCATION = (bij {0}) -FHIRPATH_UNKNOWN_CONTEXT = Onbekende context bij toepassen FHIRPath expressie: {0} -FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = Onbekend contextelement bij toepassen FHIRPath expressie: {0} -FHIRPATH_ALIAS_COLLECTION = Poging voor een alias van een collectie, geen singleton bij toepasssen FHIRPath expressie -FHIRPATH_UNKNOWN_NAME = Fout bij evalueren FHIRPath expressie: De naam ''{0}'' is niet geldig voor een van de mogelijke typen: {1} -FHIRPATH_UNKNOWN_CONSTANT = Fout bij evalueren FHIRPath expressie: Ongeldige FHIR constante {0} -FHIRPATH_CANNOT_USE = Fout bij evalueren FHIRPath expressie: Kan {0} niet gebruiken in deze context omdat {1} -FHIRPATH_CANT_COMPARE = Fout bij evalueren FHIRPath expressie: Kan geen waarden vergelijken van type {0} en {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_LEFT_VALUE_one = -FHIRPATH_LEFT_VALUE_other = Fout bij evalueren FHIRPath expressie: linker operandus van {1} kan maar 1 waarde hebben, maar heeft {0} waarden -FHIRPATH_LEFT_VALUE_WRONG_TYPE = Fout bij evalueren FHIRPath expressie: linker operandus van {0} heeft het verkeerde type {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RIGHT_VALUE_one = -FHIRPATH_RIGHT_VALUE_other = Fout bij evalueren FHIRPath expressie: rechter operandus van {1} kan maar 1 waarde hebben, maar heeft {0} waarden -FHIRPATH_RIGHT_VALUE_WRONG_TYPE = Fout bij evalueren FHIRPath expressie: rechter operandus van {0} heeft het verkeerde type {1} -FHIRPATH_OP_INCOMPATIBLE = Fout bij evalueren FHIRPath expressie {0}: linker en rechter operandus hebben incompatibele of ongeldige typen ({1}, {2}) -FHIRPATH_HO_HOST_SERVICES = Interne fout bij evalueren FHIRPath expressie: er zijn geen host services gespecificeerd ({0}) -FHIRPATH_WRONG_PARAM_TYPE = Fout bij evalueren FHIRPath expressie: Het parametertype {2} is niet geldig voor {0} parameter {1}. verwacht {3} -FHIRPATH_ORDERED_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op collecties met een volgorde -FHIRPATH_REFERENCE_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een string, uri, canonical of Reference met volgorde maar gevonden {1} -FHIRPATH_CODED_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een string, code, uri, Coding, CodeableConcept met volgorde maar gevonden {1} -FHIRPATH_STRING_ORD_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on ordered collection of string, uri, code, id but found {1} -FHIRPATH_STRING_SING_ONLY = Error evaluating FHIRPath expression: The function {0} can only be used on string, uri, code, id but found {1} -FHIRPATH_NO_COLLECTION = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt op een singleton value maar gevonden {1} -FHIRPATH_NOT_IMPLEMENTED = Fout bij evalueren FHIRPath expressie: De functie {0} is niet geemplementeerd -FHIRPATH_PARAM_WRONG = Fout bij evalueren FHIRPath expressie: Het expressietype {0} wordt niet ondersteund voor parameter {1} op functie {2} -FHIRPATH_CHECK_FAILED = Fout bij evalueren FHIRPath expressie: Controle {0} is mislukt -FHIRPATH_NO_TYPE = Fout bij evalueren FHIRPath expressie: Het type ''{0}'' is onbekend of wordt niet ondersteund bij {1} -FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = Fout in discriminator bij {0}: sliced element gevonden bij opzoeken van de vaste waarde voor een van de slices -FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = Probleem in gebruik van resolve() - profiel {0} op {1} is niet gevonden -FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = onjuist gebruik van resolve() in discriminator - geen type op element {0} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES_other = onjuist gebruik van resolve() in discriminator - {0} mogelijke typen op {1} (kan er maar een zijn) -FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = onjuist gebruik van resolve() in discriminator - Type op {0} is niet Reference {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_one = -FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET_other = Onjuist gebruik van resolve() in discriminator - {0} mogelijke doeltypen op {1} (kan er maar een zijn) -FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = Probleem met gebruik van resolve() - profiel {0} op {1} is niet gevonden -FHIRPATH_DISCRIMINATOR_TYPE_NONE = onjuist gebruik van ofType() in discriminator - geen type op element {0} -FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = onjuist gebruik van ofType() in discriminator - Meerdere mogelijke typen op {0} -FHIRPATH_DISCRIMINATOR_NO_CODE = onjuist gebruik van ofType() in discriminator - Type heeft geen code op {0} -FHIRPATH_DISCRIMINATOR_BAD_NAME = ongeldige functienaam {0}() in discriminator -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = Onjuiste expressiesyntax in discriminator (group ''{0}'') -FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = onjuiste expressiesyntax in discriminator (const) -FHIRPATH_DISCRIMINATOR_CANT_FIND = Kan discriminator niet vinden in definities: {0} in profiel {1} op element {2}, kijkende in profiel {3} -FHIRPATH_DISCRIMINATOR_CANT_FIND_EXTENSION = Unable to resolve discriminator {0} on {2} found in the definitions because the extension {1} wasn''t found in the profile {3} -FHIRPATH_DISCRIMINATOR_NOTYPE = Fout in discriminator bij {0}: geen onderliggende elementen, geen type -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES_other = Fout in discriminator bij {1}: geen onderliggende elementen, {0} typen -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_one = -FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES_other = Fout in discriminator bij {1}: geen onderliggende elementen, {0} typeprofielen -FHIRPATH_UNABLE_BOOLEAN = Kan niet verwerken als een boolean: {0} +XHTML_XHTML_Attribute_Illegal = Ongeldig attribuut in de XHTML (''{0}'' op ''{1}'') XHTML_XHTML_DOCTYPE_ILLEGAL = Misvormde XHTML: DocType declaratie gevonden en deze zijn niet toegestaan (bescherming tegen XXE veiligheidsrisico) -PACKAGE_VERSION_MISMATCH = FHIR-versie incorrect in package {0}: versie is {2} moet moet zijn {1} (pad: {3}) -VALUESET_REFERENCE_UNKNOWN = De waardelijst-import {0} is niet gevonden dus kan niet worden gecontroleerd -VALUESET_REFERENCE_INVALID_TYPE = De waardelijst-import {0} wijst naar een resource van type {1} wat niet geldig is -SD_MUST_HAVE_DERIVATION = StructureDefinition {0} moet een derivation bevatten, aangezien er een baseDefinition is -VALIDATION_VAL_PROFILE_OTHER_VERSION = Profiel is voor een andere versie van FHIR ({0}) dus wordt genegeerd -VALIDATION_VAL_PROFILE_THIS_VERSION_OK = Profiel voor deze versie van FHIR - alles in orde -VALIDATION_VAL_PROFILE_THIS_VERSION_OTHER = Profiel is voor deze versie van FHIR, maar heeft een onjuist type {0} -RENDER_BUNDLE_HEADER_ROOT = Bundle {0} van type {1} -RENDER_BUNDLE_HEADER_ENTRY = Entry {0} -RENDER_BUNDLE_HEADER_ENTRY_URL = Entry {0} - Full URL = {1} -RENDER_BUNDLE_RESOURCE = Resource {0}: -RENDER_BUNDLE_SEARCH = Zoeken: -RENDER_BUNDLE_SEARCH_MODE = mode = {0} -RENDER_BUNDLE_SEARCH_SCORE = score = {0} -RENDER_BUNDLE_RESPONSE = Response: -RENDER_BUNDLE_LOCATION = Location = {0} -RENDER_BUNDLE_ETAG = ETag = {0} -RENDER_BUNDLE_LAST_MOD = LastModified = {0} -RENDER_BUNDLE_REQUEST = Request: -RENDER_BUNDLE_IF_NON_MATCH = If-None-Match = {0} -RENDER_BUNDLE_IF_MOD = If-Modified-Since = {0} -RENDER_BUNDLE_IF_MATCH = If-Match = {0} -RENDER_BUNDLE_IF_NONE = If-None-Exist = {0} -BUNDLE_RULE_NONE = Geen regel -BUNDLE_RULE_UNKNOWN = Bundle-regel wijst naar ongeldige resource {0} -BUNDLE_RULE_INVALID_INDEX = Index van Bundle-regels is ongeldig ({0}) -BUNDLE_RULE_PROFILE_UNKNOWN = Bundle-regels profiel {1} is onbekend voor {0} -RENDER_BUNDLE_DOCUMENT_CONTENT = Additional Document Content -RENDER_BUNDLE_HEADER_DOC_ENTRY_URD = {0}. {1} ({2}/{3}) -RENDER_BUNDLE_HEADER_DOC_ENTRY_U = {0}. {1} -RENDER_BUNDLE_HEADER_DOC_ENTRY_RD = {0}. {2}/{3} -UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = Kan niet bepalen of de gevonden codes {1} bestaan in de waardelijst {0} omdat de waardelijst of het codesysteem waarop deze is gebaseerd onbekend zijn voor de validator -TERMINOLOGY_TX_SYSTEM_WRONG_HTML = De codesysteemverwijzing {0} is incorrect - de codesysteemverwijzing kan niet naar een HTML-pagina leiden. Mogelijk is dit de juiste verwijzing: {1} -TERMINOLOGY_TX_SYSTEM_WRONG_BUILD = De codesysteemverwijzing {0} is incorrect - de codesysteemverwijzing kan niet naar build.fhir.org leiden. Mogelijk is dit de juiste verwijzing: {1} -FHIRPATH_BAD_DATE = Kan Date {0} niet verwerken -FHIRPATH_NUMERICAL_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt met integer, decimal of Quantity maar gevonden {1} -FHIRPATH_DECIMAL_ONLY = Fout bij evalueren FHIRPath expressie: De functie {0} kan alleen worden gebruikt met decimal maar gevonden {1} -FHIRPATH_CONTINUOUS_ONLY= Error evaluating FHIRPath expression: The function {0} can only be used on a decimal or date type but found {1} -#The following error cannot occur for a single item. _one case left intentionally blank. -FHIRPATH_FOCUS_one = -FHIRPATH_FOCUS_other = Fout bij evalueren FHIRPath expressie: focus voor {0} kan maar een warde hebben, maar heeft {0} waarden -REFERENCE_REF_SUSPICIOUS = De syntax van de reference ''{0}'' oogt incorrect en moeten worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_NO_ANNOTATIONS = UCUM-codes met menselijk leesbare annotaties zoals {0} kunnen misleidend zijn. Aanbevolen is om geen annotaties in de UCUM-code te gebruiken en in plaats daarvan te zorgen dat Quantity.unit goed leesbaar is XHTML_XHTML_ELEMENT_ILLEGAL_IN_PARA = Ongeldige elementnaam binnen een paragraph in de XHTML (''{0}'') -UNSUPPORTED_IDENTIFIER_PATTERN_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Niet-ondersteunde property {3} op type {2} voor patroon voor discriminator ({0}) voor slice {1} -UNSUPPORTED_IDENTIFIER_PATTERN_NO_PROPERTY_NOT_SUPPORTED_FOR_DISCRIMINATOR_FOR_SLICE = Niet-ondersteund: geen eigenschappen met waarden gevonden op type {2} voor patroon voor discriminator ({0}) voor slice {1} -SD_NESTED_MUST_SUPPORT_DIFF = Het element {0} heeft typen/profielen/targets gemarkeerd als mustSupport, maar het element zelf is niet gemarkeerd als mustSupport. De binnenste mustSupports worden genegeerd tenzij het element mustSupport = true overerft -SD_NESTED_MUST_SUPPORT_SNAPSHOT = Het element {0} heeft typen/profielen/targets gemarkeerd als mustSupport, maar het element zelf is niet gemarkeerd als mustSupport -Unable_to_connect_to_terminology_server = Kan niet verbinden met terminologieserver. Fout = {0} -SD_ED_TYPE_PROFILE_UNKNOWN = Kan profiel {0} niet vinden -SD_ED_TYPE_PROFILE_NOTYPE = Profiel {0} gevonden, maar kan niet bepalen op welke type deze van toepassing is -SD_ED_TYPE_PROFILE_WRONG = Profiel {0} is voor type {1}, met het {3} element heeft type {2} -SD_ED_TYPE_PROFILE_IS_MODIFIER = Profile {0} is for not for a modifier extension, but the {3} element is a modifier -SD_ED_TYPE_PROFILE_NOT_MODIFIER = Profile {0} is for a modifier extension, but the {3} element is not a modifier -SD_ED_TYPE_PROFILE_WRONG_TARGET = Profiel {0} is voor type {1}, wat geen {4} is (welke wordt vereist om het {3} element type {2} heeft) -SD_ED_TYPE_NO_TARGET_PROFILE = Type {0} laat geen target Profielen toe -TERMINOLOGY_TX_NOSVC_BOUND_REQ = Kan niet bevestigen dat de gevonden codes bestaan in de verplichte waardelijst {0} omdat er geen terminologieservice is -TERMINOLOGY_TX_NOSVC_BOUND_EXT = Kan niet bevestigen dat de gevonden codes bestaan in de uitbreidbare waardelijst {0} omdat er geen terminologieservice is -ARRAY_CANNOT_BE_EMPTY = Array kan niet leeg zijn - deze property moet niet aanwezig zijn als deze geen waarden bevat -XHTML_URL_DATA_NO_DATA = Geen data gevonden in data: URL -XHTML_URL_DATA_DATA_INVALID_COMMA = Komma gevonden in data deel van data URL: {0} -XHTML_URL_DATA_DATA_INVALID = De data moet geldige base64 content zijn voor een data: URL: {0} -XHTML_URL_DATA_MIMETYPE = Het mimetype-deel van de data: URL is ongeldig ({1}) in URL: {0} -SD_ED_SHOULD_BIND = Het element {0} heeft een type dat een binding ({1}) zou moeten hebben, maar er is geen binding gevonden -SD_ED_SHOULD_BIND_WITH_VS = Het element {0} heeft een type dat een binding ({1}) zou moeten hebben, maar de binding heeft geen waardelijst -SD_ED_BIND_UNKNOWN_VS = De waardelijst-reference {1} op element {0} is niet gevonden -SD_ED_BIND_NOT_VS = De waardelijst-reference {1} op element {0} wijst naar iets dat geen waardelijst is ({2}) -SD_ED_BIND_NO_BINDABLE = Het element {0} heeft een binding, maar er zijn geen typen gespecificeerd die een binding kunnen hebben {1} -SD_ED_BIND_MULTIPLE_TYPES = The element {0} has a binding, and has multiple types subject to bindings ({1}). The binding will apply to all the types -DISCRIMINATOR_BAD_PATH = Fout bij verwerken padexpressie voor discriminator: {0} (src = ''{1}'') -SLICING_CANNOT_BE_EVALUATED = Slicing kan niet worden toegepast: {0} -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE = Canonical URL ''{0}'' leidt nergens heen -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_RESOLVE_NC = Canonical URL ''{0}'' exists, but can''t be loaded, so it can''t be checked for validity -TYPE_SPECIFIC_CHECKS_DT_CANONICAL_TYPE = Canonical URL ''{0}'' verwijst naar een resource met het verkeerde type. Gevonden {1}, verwacht een van {2} -CODESYSTEM_CS_NO_SUPPLEMENT = CodeSystem {0} is een supplement, dus kan niet worden gebruikt als waarde in Coding.system -CODESYSTEM_CS_SUPP_CANT_CHECK = CodeSystem {0} kan niet worden gevonden, dus kan niet controleren of concepten geldig zijn -CODESYSTEM_CS_SUPP_INVALID_CODE = De code ''{1}'' is niet gedeclareerd in het basis CodeSystem {0} dus deze is ongeldig in het supplement -SD_VALUE_TYPE_IILEGAL = Het element {0} heeft een {1} van type {2}, welke niet in de lijst van toegestane typen staat ({3}) -SD_VALUE_TYPE_REPEAT_HINT = The repeating element has a {1}. The {1} will apply to all the repeats (this has not been clear to all users) -SD_VALUE_TYPE_REPEAT_WARNING_DOTNET = The repeating element has a {1} value for a primitive type. The DotNet validator will not apply this to all the repeats - this is an error -SD_NO_TYPES_OR_CONTENTREF = Het element {0} heeft geen toegekende typen en geen content-reference -CODESYSTEM_CS_UNK_EXPANSION = Het gevonden code ({2}) bestaat niet in de waardelijst {0} en een code uit deze waardelijst is verplicht. Het system {1} is onbekend. -BUNDLE_SEARCH_NOSELF = SearchSet Bundles moeten een self link bevatten die specificeert waarmee is gezocht -BUNDLE_SEARCH_SELF_NOT_UNDERSTOOD = er kunnen geen typen worden bepaald uit een de zoekstring, dus de typen kunnen niet worden gecontroleerd -BUNDLE_SEARCH_ENTRY_NO_RESOURCE = SearchSet Bundle Entries moeten resources bevatten -BUNDLE_SEARCH_ENTRY_TYPE_NOT_SURE = Kan niet bepalen of deze resource een geldige resource type is bij deze zoekactie -BUNDLE_SEARCH_ENTRY_NO_RESOURCE_ID = Zoekresultaten moeten id''s bevatten -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_MODE = Dit is geen overeenkomstig resourcetype voor de opgegeven zoekactie ({0} verwacht {1}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_OUTCOME = Dit is geen OperationOutcome ({0}) -BUNDLE_SEARCH_ENTRY_WRONG_RESOURCE_TYPE_NO_MODE = Dit is geen overeenkomstig resourcetype voor de opgegeven zoekactie (is een search.mode nodig?) ({0} verwacht {1}) -BUNDLE_SEARCH_NO_MODE = SearchSet bundles zouden search.mode op de entries moeten hebben -INV_FAILED = Regel {0} mislukt -PATTERN_CHECK_STRING = Het pattern [{0}] gedefinieerd in het profiel {1} is niet gevonden. Issues: {2} -TYPE_SPECIFIC_CHECKS_DT_URL_EXAMPLE = Voorbeeld URL''s zijn niet toegestaan in deze context ({0}) -UNICODE_BIDI_CONTROLS_CHARS_DISALLOWED = De Unicode sequence heeft bidirectionele stuurtekens welke niet zijn toegestaan in deze context: {1} -UNICODE_BIDI_CONTROLS_CHARS_MATCH = De Unicode sequence heeft niet-beeindigde bidirectionele stuurtekens (zie CVE-2021-42574): {1} -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHALL = HL7-gedefinieerde CodeSystems MOETEN een waarde hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is -CODESYSTEM_CS_HL7_MISSING_ELEMENT_SHOULD = HL7-gedefinieerde CodeSystems ZOUDEN een waarde MOETEN hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is -CODESYSTEM_CS_NONHL7_MISSING_ELEMENT = CodeSystems ZOUDEN een waarde MOETEN hebben voor het {0} element zodat de status en betekenis van het codesysteem voor gebruikers duidelijk is -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL = CodeSystems ZOUDEN GEEN waarde MOETEN hebben voor het {0} element als het een supplement betreft -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_WRONG = CodeSystem Supplements MOETEN de content-waarde ''supplement'' hebben -CODESYSTEM_CS_HL7_PRESENT_ELEMENT_SUPPL_MISSING = CodeSystem Supplements met content-waarde 'supplement' MOETEN een supplements element hebben waarin staat voor welk codesysteem het een supplement is -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_QTY = Gevonden {0} van type {2} in het profiel dat een Quantity valideert (dus het moet een Quantity zijn) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_SYSTEM_MISMATCH = De minValue in het profiel heeft een system {0} welke verschilt van het system in de waarde {1} dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_CODE_MISMATCH = De minValue in het profiel heeft een system code {0} welke verschilt van de system code in de waarde {1} dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_VALUE = De minValue in het profiel heeft geen actuele waarde dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_VALUE = De hoeveelheid heeft geen actuele waarde dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_SYSTEM = De minValue in het profiel heeft geen system dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_SYSTEM = De waarde heeft geen system dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CODE = De minValue in het profiel heeft geen code dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_NO_CODE = De waarde heeft geen code dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_NO_UCUM_SVC = Er is geen UCUM service en de UCUM codes zijn niet identiek dus kan de minimumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_MIN_NO_CONVERT = Kan waarde {0} niet converteren van eenheid {1} naar minValue eenheid {2} gebaseerd op UCUM-definities; minimumwaarde is niet geldig -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG = De waarde in de instance ({2}) is kleiner dan de gespecificeerde minimumwaarde ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MIN_VALUE_WRONG_UCUM = De waaarde in de instance ({0} {1}) is kleiner dan de gespecificeerde minValue ({2} {3}) na UCUM-conversie -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_QTY = Gevonden {0} van type {2} in het profiel die een Quantity valideert (het moet dus een Quantity zijn) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_SYSTEM_MISMATCH = De maxValue in het profiel heeft een system {0} welke verschilt van het system in de waarde {1} dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_CODE_MISMATCH = De maxValue in het profiel heeft een system code {0} welke verschilt van het system code in de waarde {1} dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_VALUE = De maxValue in het profiel heeft geen actuele waarde dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_VALUE = De hoeveelheid heeft geen actuele waarde dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_SYSTEM = De maxValue in het profiel heeft geen systeem dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_SYSTEM = De waarde heeft geen system dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CODE = De maxValue in het profiel heeft geen code dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_NO_CODE = De waarde heeft geen code dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_NO_UCUM_SVC = Er is geen UCUM service en de UCUM codes zijn niet identiek dus kan de maximumwaarde niet worden gecontroleerd -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_MIN_NO_CONVERT = Kan waarde {0} niet converteren van eenheid {1} naar maxValue eenheid {2} gebaseerd op UCUM-definities; maximumwaarde is niet geldig -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG = De waarde in de instance ({2}) is groter dan de gespecificeerde maximumwaarde ({3}) -TYPE_SPECIFIC_CHECKS_DT_QTY_MAX_VALUE_WRONG_UCUM = De waarde in de instance ({0} {1}) is groter dan de gespecificeerde maxValue ({2} {3}) na UCUM-conversie -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_ERROR = Base64 gecodeerde waarden mogen geen whitespace bevatten (per RFC 4648). Noot dat niet-validerende lezers wordt aanbevolen om whitespace toch te accepteren -TYPE_SPECIFIC_CHECKS_DT_BASE64_NO_WS_WARNING = Base64 gecodeerde waarden zouden geen whitespace mogen bevatten (per RFC 4648). Noot dat niet-validerende lezers wordt aanbevolen om whitespace toch te accepteren -SD_DERIVATION_KIND_MISMATCH = De StructureDefinition perkt soort {0} in, maar heeft een ander soort ({1}) -VALUESET_IMPORT_UNION_INTERSECTION = Deze waardelijst heeft een enkele include met meerdere geimporteerde waardelijsten. Per issue https://jira.hl7.org/browse/FHIR-25179, is er onduidelijkheid geweest over of deze waardelijsten samen moeten worden genomen of juist de doorsnede hiervan. Als deze waardelijst stond in een package van voor 31 maart 2022, dan wordt deze als bundeling, anders als doorsnede. Als je een bundeling wilt, verdeel dan de waardelijst imports over meerdere includes -TX_SERVER_NO_BATCH_RESPONSE = De server gaf null terug voor een batch validatieverzoek -BUNDLE_POSSSIBLE_MATCHES = De bundle bevat geen overeenkomsten voor {1} volgens de regels van Bundle referentie-oplossing, maar heeft meerdere resources die overeenkomen met {0} op basis van resource type en id -BUNDLE_BUNDLE_POSSIBLE_MATCH_NO_FU = Entry {0} komt overeen met de referentie {1} op basis van type en id maar niet met de fullUrl {2} volgens de regels van Bundle referentie-oplossing -BUNDLE_BUNDLE_POSSIBLE_MATCH_WRONG_FU = Entry {0} komt overeen met de referentie {1} op basis van type en id maar zijn fullUrl {2} komt niet overeen met de fullUrl {3} van het doel volgens de regels van Bundle referentie-oplossing -SD_ILLEGAL_CHARACTERISTICS = Dit element heeft een {0} maar de typen {1} maken dit type constraint niet relevant -SD_VALUE_COMPLEX_FIXED = Overweeg voor het the complex type {0} een pattern te gebruiken in plaats van een vaste waarde om te zware inperking van de instance te voorkomen -VALUESET_SHAREABLE_MISSING = Het ShareableValueSet profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Gepubliceerde waardelijsten ZOUDEN zich MOETEN houden aan het ShareableValueSet profiel -VALUESET_SHAREABLE_EXTRA_MISSING = Het ShareableValueSet profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Gepubliceerde waardelijsten ZOUDEN zich MOETEN houden aan het ShareableValueSet profiel -VALUESET_SHAREABLE_MISSING_HL7 = Het ShareableValueSet profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Door HL7 gepubliceerde waardelijsten MOETEN zich houden aan het ShareableValueSet profiel -VALUESET_SHAREABLE_EXTRA_MISSING_HL7 = Het ShareableValueSet profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Door HL7 gepubliceerde waardelijsten MOETEN zich houden aan het ShareableValueSet profiel -CODESYSTEM_SHAREABLE_MISSING = Het ShareableCodeSystem profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Gepubliceerde codesystemen ZOUDEN zich MOETEN houden aan het ShareableCodeSystem profiel -CODESYSTEM_SHAREABLE_EXTRA_MISSING = Het ShareableCodeSystem profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Gepubliceerde codesystemen ZOUDEN zich MOETEN houden aan het ShareableCodeSystem profiel -CODESYSTEM_SHAREABLE_MISSING_HL7 = Het ShareableCodeSystem profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Door HL7 gepubliceerde codesystemen MOETEN zich houden aan het ShareableCodeSystem profiel -CODESYSTEM_SHAREABLE_EXTRA_MISSING_HL7 = Het ShareableCodeSystem profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Door HL7 gepubliceerde codesystemen MOETEN zich houden aan het ShareableCodeSystem profiel -CONCEPTMAP_SHAREABLE_MISSING = Het ShareableConceptMap profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Gepubliceerde conceptmaps ZOUDEN zich MOETEN houden aan het ShareableConceptMap profiel -CONCEPTMAP_SHAREABLE_EXTRA_MISSING = Het ShareableConceptMap profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Gepubliceerde conceptmaps ZOUDEN zich MOETEN houden aan het ShareableConceptMap profiel -CONCEPTMAP_SHAREABLE_MISSING_HL7 = Het ShareableConceptMap profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Door HL7 gepubliceerde conceptmaps MOETEN zich houden aan het ShareableConceptMap profiel -CONCEPTMAP_SHAREABLE_EXTRA_MISSING_HL7 = Het ShareableConceptMap profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Door HL7 gepubliceerde conceptmaps MOETEN zich houden aan het ShareableConceptMap profiel -MEASURE_SHAREABLE_MISSING = Het ShareableMeasure profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Gepubliceerde measures ZOUDEN zich MOETEN houden aan het ShareableMeasure profiel -MEASURE_SHAREABLE_EXTRA_MISSING = Het ShareableMeasure profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Gepubliceerde measures ZOUDEN zich MOETEN houden aan het ShareableMeasure profiel -MEASURE_SHAREABLE_MISSING_HL7 = Het ShareableMeasure profiel zegt dat het {0} element verplicht is, maar het ontbreekt. Door HL7 gepubliceerde measures MOETEN zich houden aan het ShareableMeasure profiel -MEASURE_SHAREABLE_EXTRA_MISSING_HL7 = Het ShareableMeasure profiel beveelt aan om het {0} element een waarde te geven, maaar het ontbreekt. Door HL7 gepubliceerde measures MOETEN zich houden aan het ShareableMeasure profiel -TYPE_SPECIFIC_CHECKS_DT_MARKDOWN_HTML = De markdown bevat content die lijkt op een ingevoegde HTML tag beginnend bij ''{0}''. Dit zal (of ZOU MOETEN) worden overgeslagen in de presentatielaaag. De content moet worden gecontroleerd om te bevestigen dat dit het gewenste geedrag i -TYPE_SPECIFIER_ILLEGAL_TYPE = De Type specifier {1} specificeert een ongeldig type {0} -TYPE_SPECIFIER_ABSTRACT_TYPE = De Type specifier {1} specificeert een abstract type {0} -TYPE_SPECIFIER_NM_ILLEGAL_TYPE = Geen matchende Type specifier en het onderliggende type {0} is niet geldig -TYPE_SPECIFIER_NM_ABSTRACT_TYPE = Geen matchende Type specifier en het onderliggende type {0} is niet abstract -ELEMENT_CANNOT_BE_NULL = Het element mag niet ''null'' zijn -#The following error cannot occur for a single item. _one case left intentionally blank. -MULTIPLE_LOGICAL_MODELS_other = {0} logische modellen gevonden in de aangegeven profielen, dus niet in staat logische model te verwerken (kan er maar een zijn, gevonden {1}) -UNRECOGNISED_PROPERTY_TYPE = Ongeldig JSON type {0} voor het element {1}; geldige typen = {2} -UNRECOGNISED_PROPERTY_TYPE_WRONG = Ongeldig type {2} voor het element {1}; geldige typen = {3}, JSON type = {0} -SD_TYPE_MISSING = Geen type gevonden -SD_TYPE_NOT_MATCH_NS = De type namespace {0} ZOU overeen MOETEN komen met de url namespace {1} voor de definitie van het type -SD_TYPE_NOT_DERIVED = Het type {0} kan alleen als type worden gebruikt bij het inperken van de basisdefinitie van het type -SD_TYPE_NOT_LOCAL = Het type {0} is niet geldig omdat deze niet is gedefinieerd in de FHIR-specificatie. Andere typen moeten een namespace hebben -SD_TYPE_NOT_LOGICAL = Het type {0} kan alleen worden gedefinieerd als het soort (kind) 'logical' is, niet {1} -SD_CONSTRAINED_TYPE_NO_MATCH = Het type {0} moet hetzelfde zijn als het type in de basisstructuur {1} die wordt ingeperkt -SD_SPECIALIZED_TYPE_MATCHES = Het type {0} moet niet hetzelfde zijn als het type in de basisstructuur {1} die wordt gespecialiseerd -SD_CONSTRAINED_KIND_NO_MATCH = Het soort {0} (kind) moet hetzelfde zijn als de soort {1} in de basisstructuur {3} (basistype = {2}) -SD_PATH_TYPE_MISMATCH = Het pad {1} moet beginnen met het structuurtype {0} -UNABLE_TO_RESOLVE_CONTENT_REFERENCE = Kan de contentreferentie {0} op element {1} (pad = {2}) niet vinden -UNABLE_TO_RESOLVE_CONTENT_REFERENCE_IN_THIS_CONTEXT = Kan de contentreferentie {0} op element {1} (pad = {2}) niet vinden in deze context -RESOURCETYPE_PROPERTY_WRONG_TYPE = Het JSON element ''resourceType'' heeft het verkeerde JSON type: {0} -DUPLICATE_JSON_PROPERTY = De JSON property ''{0}'' is een duplicaat en wordt genegeerd -DUPLICATE_JSON_PROPERTY_KEY = De JSON property ''{0}'' is een duplicaat en wordt genegeerd -JSON_PROPERTY_NO_QUOTES = De JSON property ''{0}'' heeft geen aanhalingstekens rondom de naam van de property -JSON_PROPERTY_VALUE_NO_QUOTES = De JSON property ''{0}'' heeft geen aanhalingstekens rondom de waarde van de property ''{1}'' -JSON_COMMA_MISSING = Er ontbreekt een comma in de JSON -JSON_COMMA_EXTRA = Er is een extrra comma aan het einde van de {0} in de JSON -JSON_COMMENTS_NOT_ALLOWED = Commentaar is niet toegestaan in JSON -BUNDLE_LINK_UNKNOWN = Het link relatietype ''{0}'' is onbekend en niet toegestaan deze context -BUNDLE_LINK_SEARCH_PROHIBITED = Het link relatietype ''{0}'', in gebruik in zoeksets, is in deze context verboden -BUNDLE_LINK_SEARCH_NO_DUPLICATES = Het link relatietype ''{0}'' kan slechts een keer voorkomen -BUNDLE_LINK_STYELSHEET_EXTERNAL = Externe Stylesheets anders dan https://hl7.org/fhir/fhir.css ZOUDEN NIET MOETEN worden gebruikt -BUNDLE_LINK_STYELSHEET_INSECURE = De stylesheet-referentie is niet veilig -BUNDLE_LINK_STYELSHEET_LINKABLE = De stylesheet-referentie kan niet worden gevonden -BUNDLE_LINK_STYELSHEET_NOT_FOUND = De stylesheet-referentie is niet gevonden in deze bundel -EXT_VER_URL_NO_MATCH = Extensie URL''s hebben geen versies. De validator kon deze url niet bereiken, met of zonder versie-gebaseerde verwijzing -EXT_VER_URL_IGNORE = Extensie URL''s hebben geen versies. De validator heeft de versie genegeerd en de extensie toch verwerkt -EXT_VER_URL_MISLEADING = De extension URL bevat een '|' waardoor deze op een geversioneerde url lijkt. Dat is het niet en dit is verwarrend voor implementers -EXT_VER_URL_NOT_ALLOWED = De extensie URL mag geen versie bevatten -EXT_VER_URL_REVERSION = De extensie URL mag geen versie bevatten. De extensie is gevalideerd tegen versie {0} van de extensie -ILLEGAL_COMMENT_TYPE = De fhir_comments property moet een array van strings zijn -SD_NO_SLICING_ON_ROOT = Slicing is niet toegestaan aan de root van een profiel -REFERENCE_REF_QUERY_INVALID = Het query deel van de conditionele referentie is geen geldige querystring ({0}) -SM_RULEGROUP_NOT_FOUND = De groep {0} kon niet worden gevonden -SM_NAME_INVALID = De naam {0} is niet geldig -SM_GROUP_NAME_DUPLICATE = De Group naam ''{0}'' wordt al gebruikt -SM_GROUP_INPUT_DUPLICATE = De naam {0} wordt al gebruikt -SM_GROUP_INPUT_MODE_INVALID = De group parameter {0} mode {1} is niet geldig -SM_GROUP_INPUT_NO_TYPE = De group parameter {0} heeft geen type, dus de paden kunnen niet worden gevalideerd -SM_GROUP_INPUT_TYPE_NOT_DECLARED = Het type {0} is niet gedeclareerd en is onbekend -SM_GROUP_INPUT_MODE_MISMATCH = Het type {0} heeft mode {1} welke niet overeenkomt met de StructureDefinition {2} -SM_GROUP_INPUT_TYPE_UNKNOWN_STRUCTURE = Het type {0} die mapt op de canonical url {1} is onbekend, dus de paden kunnnen niet worden gevalideerd -SM_GROUP_INPUT_TYPE_UNKNOWN_TYPE = Het type {0} is onbekend, dus de paden kunnnen niet worden gevalideerd -SM_SOURCE_CONTEXT_UNKNOWN = De broncontext {0} is onbekend op dit punt -SM_SOURCE_PATH_INVALID = Het bronpad {0}.{1} verwijst naar het pad {2} welke onbekend is -SM_RULE_SOURCE_MIN_REDUNDANT = De minimumwaarde van {0} is redundant aangezien de geldige minimumwaarde {0} is -SM_RULE_SOURCE_MAX_REDUNDANT = De maximumwaarde van {0} is redundant aangezien de geldige maximumwaarde {0} is -SM_RULE_SOURCE_LISTMODE_REDUNDANT = De listMode waarde {0} is redundant aangezien de geldige maximumwaarde {0} is -SM_TARGET_CONTEXT_UNKNOWN = De doelcontext ''{0}'' is onbekend op dit punt -SM_TARGET_PATH_INVALID = Het doelpad {0}.{1} verwijst naar het pad {2} welke onbekend is -SM_NO_LIST_MODE_NEEDED = Een list mode moet niet worden gebruikt aangezien dit een regel is die slechts een keer kan worden uitgevoerd -SM_NO_LIST_RULE_ID_NEEDED = Een list ruleId moet niet worden gebruikt aangezien dit een regel is die slechts een keer kan worden uitgevoerd -SM_LIST_RULE_ID_ONLY_WHEN_SHARE = Een ruleId moet alleen worden gebruikt als de rule mode ''share'' is -SM_RULE_SOURCE_UNASSIGNED = Het bronstatement kent aan de bron geen variabele toe - controleer of dat de bedoeling is -SM_TARGET_PATH_MULTIPLE_MATCHES = Het doelpad {0}.{1} verwijst naar het pad {2} wat een verwijzing naar meerdere elementen ({3}) zou kunnen zijn. Dit kan niet verder worden gecontroleerd -SM_SOURCE_TYPE_INVALID = Het type {0} is ongeldig in de broncontext {1}. De mogelijke typen zijn [{2}] -SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE = Transformatie {0} heeft {1}-{2} parameter(s) nodig maar {3} gevonden -SM_TARGET_TRANSFORM_PARAM_COUNT_SINGLE = Transformatie {0} heeft {1} parameter(s) nodig maar {2} gevonden -SM_TARGET_TRANSFORM_NOT_CHECKED = Transformatie {0} nog niet gecontroleerd -SM_TARGET_NO_TRANSFORM_NO_CHECKED = Als er geen transformatie is, kunnen er geen parameters voor worden gegeven -SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE = De waarde van de type parameter voor {0} kon niet worden verwerkt -SM_TARGET_TRANSFORM_PARAM_UNPROCESSIBLE = De parameter op index {0} kon niet worden verwerkt (type = {1}) -SM_TARGET_TRANSFORM_EXPRESSION_ERROR = De FHIRPath expressie in de evaluate parameter is ongeldig: {0} -SM_IMPORT_NOT_FOUND = Geen maps gevonden voor {0} - validatie kan fout zijn -SM_TARGET_TYPE_MULTIPLE_POSSIBLE = Meerdere typen mogelijk hier ({0}) dus verdere controle op type niet mogelijk -SM_DEPENDENT_PARAM_MODE_MISMATCH = De parameter {0} verwijst naar de variabele {1} maar zijn mode is {2} wat niet hetzelfde is als de vereiste mode voor de groep {3} -SM_DEPENDENT_PARAM_TYPE_MISMATCH = De parameter ''{0}'' verwijst naar de variabele ''{1}'' maar zijn type is ''{2}'' wat niet compatibele is met het vereist type voor de groep ''{3}'', welke is ''{4}'' (uit map ''{5}'') -SM_ORPHAN_GROUP = De group {0} wordt niet gebruikt binnen dit mappingscript en heeft geen typen op zijn inputs, dus verificatie van type is niet mogelijk -SM_SOURCE_TYPE_NOT_FOUND = Geen brontype gevonden, dus de standaardgroep voor deze implicit dependent rule kon niet worden bepaald -SM_TARGET_TYPE_NOT_FOUND = Geen doeltype gevonden, dus de standaardgroep voor deze implicit dependent rule kon niet worden bepaald -SM_MATCHING_RULEGROUP_NOT_FOUND = Kon geen standaard rule vinden voor het typepaar bron={0} en doel={1} -SM_TARGET_TRANSFORM_MISSING_PARAMS = Een of meer parameters voor de translate-bewerking ontbreken (zou 3 moeten zijn, was {0}) -SM_TARGET_TRANSFORM_TRANSLATE_NO_PARAM = Geen waarde voor {0} parameter gevonden -SM_TARGET_TRANSFORM_TRANSLATE_UNKNOWN_SOURCE = De bronvariabele {0} is onbekend -SM_TARGET_TRANSFORM_TRANSLATE_CM_NOT_FOUND = De map_uri ''{0}'' kon niet worden gevonden, dus kan de map net worden gecontroleerd -SM_TARGET_TRANSFORM_TRANSLATE_CM_BAD_MODE = De waarde ''{0}'' voor de outputparameter is incorrect -SM_TARGET_TRANSLATE_BINDING_SOURCE = De bronvariabele heeft geen required binding, dus deze conceptmap kan niet worden gecontroleerd -SM_TARGET_TRANSLATE_BINDING_VS_SOURCE = De bronvariabele verwijst naar een onbekende waardelijst ''{0}'', dus deze conceptmap kan niet worden gecontroleerd -SM_TARGET_TRANSLATE_BINDING_VSE_SOURCE = Er was een fout bij de expansie van de bronwaardelijst, dus deze conceptmap kan niet worden gecontroleerd: ''{0}'' -SM_TARGET_TRANSLATE_BINDING_SOURCE_UNMAPPED = De bronwaardelijst bevat een of meer codes die de map niet vertaalt: {0} -SM_TARGET_TRANSLATE_BINDING_TARGET = De doelvariable heeft geen required binding, dus deze conceptmap kan niet worden gecontroleerd -SM_TARGET_TRANSLATE_BINDING_VS_TARGET = De doelvariabele verwijst naar een onbekende waardelijst ''{0}'', dus deze conceptmap kan niet worden gecontroleerd -SM_TARGET_TRANSLATE_BINDING_VSE_TARGET = Er was een fout bij de expansie van de doelwaardelijst, dus deze conceptmap kan niet worden gecontroleerd: ''{0}'' -SM_TARGET_TRANSLATE_BINDING_TARGET_WRONG = De map produceert een of meer codes die niet in de doelwaardelijst staan: {0} -CONCEPTMAP_GROUP_SOURCE_MISSING = Geen bron CodeSystem, dus de bron-codes kunnen niet worden gecontroleerd -CONCEPTMAP_GROUP_SOURCE_UNKNOWN = Onbekend bron CodeSystem {0}, dus de bron-codes kunnen niet worden gecontroleerd -CONCEPTMAP_GROUP_TARGET_MISSING = Geen doel CodeSystem, dus de doel-codes kunnen niet worden gecontroleerd -CONCEPTMAP_GROUP_TARGET_UNKNOWN = Onbekend doel CodeSystem {0}, dus de doel-codes kunnen niet worden gecontroleerd -CONCEPTMAP_GROUP_SOURCE_CODE_INVALID = De bron-code ''{0}'' is niet geldig in het codesysteem {1} -CONCEPTMAP_GROUP_SOURCE_DISPLAY_INVALID = De bron-code ''{0}'' is niet geldig. Mogelijke codes {1} -CONCEPTMAP_GROUP_TARGET_CODE_INVALID =De doel-code ''{0}'' is niet geldig in het codesysteem {1} -CONCEPTMAP_GROUP_TARGET_DISPLAY_INVALID = De doel-weergave ''{0}'' is niet geldig. Mogelijke weergaven {1} -CONCEPTMAP_GROUP_TARGET_PROPERTY_INVALID = De property code ''{0}'' is onbekend -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_MISMATCH = Het type van deze property zou moeten {1} zijn, niet {0} -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_NO_SYSTEM = Aangezien er geen system is gespecifceerd, kan een eenvoudige code niet worden gebruikt -CONCEPTMAP_GROUP_TARGET_PROPERTY_CODE_INVALID = De code {0} is niet geldig in het systeem {1} -CONCEPTMAP_GROUP_TARGET_PROPERTY_TYPE_UNKNOWN_SYSTEM = Het system {0} is onbekend, dus codes kunnen niet worden gecontroleerd -SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE = De groep {0} heeft alr -CONCEPTMAP_GROUP_SOURCE_INCOMPLETE = Bron CodeSystem {0} heeft niet alle content (content = {1}), dus de broncodes kunnen niet worden gecontroleerd -CONCEPTMAP_GROUP_TARGET_INCOMPLETE = Doel CodeSystem {0} heeft niet alle content (content = {1}), dus de doelcodes kunnen niet worden gecontroleerd -SD_NO_TYPE_CODE_ON_CODE = Snapshot voor {1} element {0} heeft type.code zonder een waarde -UNKNOWN_CODESYSTEM = Het CodeSystem {0} is onbekend -UNKNOWN_CODESYSTEM_VERSION = De CodeSystem {0} versie {1} is onbekend. Geldige versies: {2} -UNABLE_TO_INFER_CODESYSTEM = De System URI kon niet worden bepaald voor de code {0} in de waardelijst {1} -VALUESET_TOO_COSTLY = De waardelijst {0} heeft teveel codes om weer te geven ({1}) -NO_VALID_DISPLAY_FOUND_one = Er zijn geen geldige weergavenamen gevonden voor {1}#{2} in de taal {3} -NO_VALID_DISPLAY_FOUND_other = Er zijn geen geldige weergavenamen gevonden voor {1}#{2} in de talen {3} -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_one = -PRIMITIVE_VALUE_ALTERNATIVES_MESSAGE_other = +XHTML_XHTML_Element_Illegal = Ongeldig element in de XHTML (''{0}'') +XHTML_XHTML_Entity_Illegal = Ongeldige entity in de XHTML (''{0}'') +XHTML_XHTML_Image_Reference_Illegal = Ongeldige afbeeldingreferentie in de XHTML (''{0}'') +XHTML_XHTML_NS_InValid = Verkeerde namespace op de XHTML (''{0}'', moet zijn ''{1}'') +XHTML_XHTML_Name_Invalid = Verkeerde naam in de XHTML (''{0}'') - moet beginnen met div +XSI_TYPE_UNNECESSARY = xsi:type is niet nodig op dit punt +XSI_TYPE_WRONG = De xsi:type waarde ''{0}'' is verkeerd (moet zijn ''{1}''). Merk op dat xsi:type niet nodig is op dit punt +_DT_Fixed_Wrong = Waarde is ''{0}'' maar moet zijn ''{1}''{2} +_has_children__and_multiple_types__in_profile_ = {0} heeft onderliggende elementen ({1}) en meerdere typen ({2}) in profiel {3} +_has_children__for_type__in_profile__but_cant_find_type = {0} heeft onderliggende elementen ({1}) voor type {2} in profiel {3}, maar kan type niet vinden +_has_no_children__and_no_types_in_profile_ = {0} heeft geen onderliggende elementen ({1}) en geen typen in profiel {2} +defined_in_the_profile = Gedefinieerd in het profiel +documentmsg = (document) +element__null_ = Element = null: {0} +element_id__null__on_ = Element id = null: {0} op {1} +error_writing_number__to_JSON = Fout bij schrijven van getal ''{0}'' in JSON +getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList moet alleen worden aangeroepen als het element slicing heeft +needs_a_snapshot = Heeft snapshot nodig +no_base_profile_provided = Geen basisprofiel gevonden +no_derived_structure_provided = Geen afgeleide structuur gevonden +no_url_in_expand_value_set = Geen url in expand waardelijst +no_url_in_expand_value_set_2 = Geen url in expansie waardelijst 2 +no_value_set = Waardelijst heeft geen url property +not_done_yet_cant_fetch_ = Nog niet gedaan: kan niet {0} ophalen +not_the_right_kind_of_structure_to_generate_schematrons_for = Niet de juiste structuur om schematrons voor te genereren +null_min = Null min +reference_to__cannot_be_resolved = reference naar {0} kan niet worden gevonden +type_on_first_differential_element = Type op eerste differential-element! +type_on_first_snapshot_element_for__in__from_ = Type op eerste snapshot-element voor {0} in {1} van {2} +xml_attr_value_invalid = Het XML attribuut {0} bevat een onjuist teken +xml_encoding_invalid = De XML encoding is onjuist (moet UTF-8 zijn) diff --git a/exec/pack/Messages_pt-BR.properties b/exec/pack/Messages_pt-BR.properties new file mode 100644 index 000000000..1988d5980 --- /dev/null +++ b/exec/pack/Messages_pt-BR.properties @@ -0,0 +1 @@ +# InstanceValidator = one,other diff --git a/exec/pack/lang.dat b/exec/pack/lang.dat index bd6c7376e..c0f4a3abb 100644 --- a/exec/pack/lang.dat +++ b/exec/pack/lang.dat @@ -377,6 +377,7 @@ Subtag: hy Description: Armenian Added: 2005-10-16 Suppress-Script: Armn +Comments: see also hyw %% Type: language Subtag: hz @@ -385,7 +386,8 @@ Added: 2005-10-16 %% Type: language Subtag: ia -Description: Interlingua (International Auxiliary Language Association) +Description: Interlingua (International Auxiliary Language + Association) Added: 2005-10-16 %% Type: language @@ -523,6 +525,7 @@ Suppress-Script: Latn %% Type: language Subtag: km +Description: Khmer Description: Central Khmer Added: 2005-10-16 Suppress-Script: Khmr @@ -589,6 +592,7 @@ Suppress-Script: Latn Type: language Subtag: lg Description: Ganda +Description: Luganda Added: 2005-10-16 %% Type: language @@ -706,7 +710,7 @@ Suppress-Script: Latn %% Type: language Subtag: nb -Description: Norwegian Bokmål +Description: Norwegian BokmÃ¥l Added: 2005-10-16 Suppress-Script: Latn Macrolanguage: no @@ -955,6 +959,7 @@ Subtag: sr Description: Serbian Added: 2005-10-16 Macrolanguage: sh +Comments: see cnr for Montenegrin %% Type: language Subtag: ss @@ -1104,7 +1109,7 @@ Suppress-Script: Latn %% Type: language Subtag: vo -Description: Volapük +Description: Volapük Added: 2005-10-16 %% Type: language @@ -1176,7 +1181,7 @@ Added: 2009-07-29 %% Type: language Subtag: aae -Description: Arbëreshë Albanian +Description: Arbëreshë Albanian Added: 2009-07-29 Macrolanguage: sq %% @@ -1219,7 +1224,7 @@ Preferred-Value: aas %% Type: language Subtag: aan -Description: Anambé +Description: Anambé Added: 2009-07-29 %% Type: language @@ -1230,7 +1235,7 @@ Macrolanguage: ar %% Type: language Subtag: aap -Description: Pará Arára +Description: Pará Arára Added: 2009-07-29 %% Type: language @@ -1240,7 +1245,7 @@ Added: 2009-07-29 %% Type: language Subtag: aas -Description: Aasáx +Description: Aasáx Added: 2009-07-29 %% Type: language @@ -1277,7 +1282,7 @@ Added: 2009-07-29 %% Type: language Subtag: aba -Description: Abé +Description: Abé Added: 2009-07-29 %% Type: language @@ -1409,7 +1414,7 @@ Added: 2009-07-29 %% Type: language Subtag: acb -Description: Áncá +Description: Ãncá Added: 2009-07-29 %% Type: language @@ -1476,7 +1481,7 @@ Added: 2009-07-29 %% Type: language Subtag: acs -Description: Acroá +Description: Acroá Added: 2009-07-29 %% Type: language @@ -1524,11 +1529,12 @@ Added: 2005-10-16 %% Type: language Subtag: adb -Description: Adabe +Description: Atauran Added: 2009-07-29 %% Type: language Subtag: add +Description: Lidzonka Description: Dzodinka Added: 2009-07-29 %% @@ -1966,7 +1972,7 @@ Added: 2009-07-29 %% Type: language Subtag: ahn -Description: Àhàn +Description: Àhàn Added: 2009-07-29 %% Type: language @@ -2089,6 +2095,8 @@ Type: language Subtag: ais Description: Nataoran Amis Added: 2009-07-29 +Deprecated: 2019-04-16 +Comments: see ami, szy %% Type: language Subtag: ait @@ -2112,7 +2120,7 @@ Added: 2009-07-29 %% Type: language Subtag: aja -Description: Aja (Sudan) +Description: Aja (South Sudan) Added: 2009-07-29 %% Type: language @@ -2122,7 +2130,7 @@ Added: 2009-07-29 %% Type: language Subtag: aji -Description: Ajië +Description: Ajië Added: 2009-07-29 %% Type: language @@ -2134,12 +2142,21 @@ Type: language Subtag: ajp Description: South Levantine Arabic Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: apc Macrolanguage: ar %% Type: language +Subtag: ajs +Description: Algerian Jewish Sign Language +Added: 2022-02-25 +%% +Type: language Subtag: ajt Description: Judeo-Tunisian Arabic Added: 2009-07-29 +Deprecated: 2022-02-25 +Preferred-Value: aeb Macrolanguage: jrb %% Type: language @@ -2389,7 +2406,7 @@ Scope: collection %% Type: language Subtag: alw -Description: Alaba-K’abeena +Description: Alaba-K’abeena Description: Wanbasana Added: 2009-07-29 %% @@ -2410,7 +2427,7 @@ Added: 2009-07-29 %% Type: language Subtag: ama -Description: Amanayé +Description: Amanayé Added: 2009-07-29 %% Type: language @@ -2550,7 +2567,7 @@ Added: 2009-07-29 %% Type: language Subtag: ane -Description: Xârâcùù +Description: Xârâcùù Added: 2009-07-29 %% Type: language @@ -2626,6 +2643,7 @@ Added: 2009-07-29 Type: language Subtag: ant Description: Antakarinya +Description: Antikarinya Added: 2009-07-29 %% Type: language @@ -2697,6 +2715,7 @@ Type: language Subtag: aoh Description: Arma Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: aoi @@ -2710,7 +2729,7 @@ Added: 2009-07-29 %% Type: language Subtag: aok -Description: Arhö +Description: Arhö Added: 2009-07-29 %% Type: language @@ -2720,7 +2739,7 @@ Added: 2009-07-29 %% Type: language Subtag: aom -Description: Ömie +Description: Ömie Added: 2009-07-29 %% Type: language @@ -2772,7 +2791,7 @@ Added: 2009-07-29 %% Type: language Subtag: apc -Description: North Levantine Arabic +Description: Levantine Arabic Added: 2009-07-29 Macrolanguage: ar %% @@ -2804,7 +2823,7 @@ Added: 2009-07-29 %% Type: language Subtag: api -Description: Apiaká +Description: Apiaká Added: 2009-07-29 %% Type: language @@ -2829,7 +2848,7 @@ Added: 2009-07-29 %% Type: language Subtag: apn -Description: Apinayé +Description: Apinayé Added: 2009-07-29 %% Type: language @@ -2864,7 +2883,7 @@ Added: 2009-07-29 %% Type: language Subtag: apu -Description: Apurinã +Description: Apurinã Added: 2009-07-29 %% Type: language @@ -2884,7 +2903,7 @@ Added: 2009-07-29 %% Type: language Subtag: apy -Description: Apalaí +Description: Apalaí Added: 2009-07-29 %% Type: language @@ -2914,6 +2933,11 @@ Description: Arigidi Added: 2009-07-29 %% Type: language +Subtag: aqk +Description: Aninka +Added: 2021-02-20 +%% +Type: language Subtag: aql Description: Algic languages Added: 2009-07-29 @@ -2936,12 +2960,12 @@ Added: 2009-07-29 %% Type: language Subtag: aqr -Description: Arhâ +Description: Arhâ Added: 2009-07-29 %% Type: language Subtag: aqt -Description: Angaité +Description: Angaité Added: 2014-02-28 %% Type: language @@ -2988,7 +3012,7 @@ Added: 2009-07-29 %% Type: language Subtag: ark -Description: Arikapú +Description: Arikapú Added: 2009-07-29 %% Type: language @@ -3037,8 +3061,8 @@ Scope: collection %% Type: language Subtag: aru -Description: Aruá (Amazonas State) -Description: Arawá +Description: Aruá (Amazonas State) +Description: Arawá Added: 2009-07-29 %% Type: language @@ -3053,7 +3077,7 @@ Added: 2005-10-16 %% Type: language Subtag: arx -Description: Aruá (Rodonia State) +Description: Aruá (Rodonia State) Added: 2009-07-29 %% Type: language @@ -3087,6 +3111,8 @@ Type: language Subtag: asd Description: Asas Added: 2009-07-29 +Deprecated: 2019-04-16 +Preferred-Value: snz %% Type: language Subtag: ase @@ -3095,6 +3121,7 @@ Added: 2009-07-29 %% Type: language Subtag: asf +Description: Auslan Description: Australian Sign Language Added: 2009-07-29 %% @@ -3130,7 +3157,7 @@ Added: 2009-07-29 %% Type: language Subtag: asn -Description: Xingú Asuriní +Description: Xingú Asuriní Added: 2009-07-29 %% Type: language @@ -3234,7 +3261,7 @@ Scope: collection %% Type: language Subtag: ati -Description: Attié +Description: Attié Added: 2009-07-29 %% Type: language @@ -3344,7 +3371,7 @@ Added: 2009-07-29 %% Type: language Subtag: aue -Description: =/Kx'au//'ein +Description: Ç‚KxʼauÇʼein Added: 2009-07-29 Deprecated: 2015-02-12 Preferred-Value: ktz @@ -3439,7 +3466,7 @@ Added: 2009-07-29 %% Type: language Subtag: aux -Description: Aurá +Description: Aurá Added: 2009-07-29 %% Type: language @@ -3511,7 +3538,7 @@ Added: 2009-07-29 %% Type: language Subtag: avv -Description: Avá-Canoeiro +Description: Avá-Canoeiro Added: 2009-07-29 %% Type: language @@ -3537,7 +3564,7 @@ Scope: collection %% Type: language Subtag: awe -Description: Awetí +Description: Awetí Added: 2009-07-29 %% Type: language @@ -3587,7 +3614,7 @@ Added: 2009-07-29 %% Type: language Subtag: awt -Description: Araweté +Description: Araweté Added: 2009-07-29 %% Type: language @@ -3627,7 +3654,7 @@ Added: 2012-08-12 %% Type: language Subtag: axg -Description: Mato Grosso Arára +Description: Mato Grosso Arára Added: 2009-07-29 %% Type: language @@ -3647,7 +3674,7 @@ Added: 2009-07-29 %% Type: language Subtag: axx -Description: Xârâgurè +Description: Xârâgurè Added: 2009-07-29 %% Type: language @@ -3757,6 +3784,7 @@ Type: language Subtag: ayy Description: Tayabas Ayta Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: ayz @@ -3828,7 +3856,7 @@ Added: 2009-07-29 %% Type: language Subtag: bab -Description: Bainouk-Gunyuño +Description: Bainouk-Gunyuño Added: 2009-07-29 %% Type: language @@ -3844,7 +3872,7 @@ Scope: collection %% Type: language Subtag: bae -Description: Baré +Description: Baré Added: 2009-07-29 %% Type: language @@ -3989,7 +4017,7 @@ Added: 2009-07-29 %% Type: language Subtag: bbj -Description: Ghomálá' +Description: Ghomálá' Added: 2009-07-29 %% Type: language @@ -4014,8 +4042,8 @@ Added: 2009-07-29 %% Type: language Subtag: bbo -Description: Northern Bobo Madaré -Description: Konabéré +Description: Northern Bobo Madaré +Description: Konabéré Added: 2009-07-29 %% Type: language @@ -4072,6 +4100,7 @@ Type: language Subtag: bbz Description: Babalia Creole Arabic Added: 2009-07-29 +Deprecated: 2020-03-28 Macrolanguage: ar %% Type: language @@ -4117,7 +4146,7 @@ Added: 2009-07-29 %% Type: language Subtag: bci -Description: Baoulé +Description: Baoulé Added: 2009-07-29 %% Type: language @@ -4127,7 +4156,7 @@ Added: 2009-07-29 %% Type: language Subtag: bck -Description: Bunaba +Description: Bunuba Added: 2009-07-29 %% Type: language @@ -4213,7 +4242,7 @@ Added: 2009-07-29 %% Type: language Subtag: bdc -Description: Emberá-Baudó +Description: Emberá-Baudó Added: 2009-07-29 %% Type: language @@ -4238,7 +4267,7 @@ Added: 2009-07-29 %% Type: language Subtag: bdh -Description: Baka (Sudan) +Description: Baka (South Sudan) Added: 2009-07-29 %% Type: language @@ -4248,6 +4277,7 @@ Added: 2009-07-29 %% Type: language Subtag: bdj +Description: Bai (South Sudan) Description: Bai Added: 2009-07-29 %% @@ -4421,7 +4451,7 @@ Added: 2009-07-29 %% Type: language Subtag: bet -Description: Guiberoua Béte +Description: Guiberoua Béte Added: 2009-07-29 %% Type: language @@ -4431,7 +4461,7 @@ Added: 2009-07-29 %% Type: language Subtag: bev -Description: Daloa Bété +Description: Daloa Bété Added: 2009-07-29 %% Type: language @@ -4513,7 +4543,7 @@ Added: 2009-07-29 %% Type: language Subtag: bfl -Description: Banda-Ndélé +Description: Banda-Ndélé Added: 2009-07-29 %% Type: language @@ -4861,6 +4891,8 @@ Type: language Subtag: bic Description: Bikaru Added: 2009-07-29 +Deprecated: 2021-02-20 +Preferred-Value: bir %% Type: language Subtag: bid @@ -4886,6 +4918,8 @@ Type: language Subtag: bij Description: Vaghat-Ya-Bijim-Legeri Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see dkg, jbm, tyy %% Type: language Subtag: bik @@ -5082,7 +5116,7 @@ Added: 2009-07-29 %% Type: language Subtag: bjw -Description: Bakwé +Description: Bakwé Added: 2009-07-29 %% Type: language @@ -5180,7 +5214,7 @@ Added: 2009-07-29 %% Type: language Subtag: bkq -Description: Bakairí +Description: Bakairí Added: 2009-07-29 %% Type: language @@ -5262,6 +5296,8 @@ Type: language Subtag: blg Description: Balau Added: 2009-07-29 +Deprecated: 2021-02-20 +Preferred-Value: iba %% Type: language Subtag: blh @@ -5291,7 +5327,7 @@ Added: 2009-07-29 %% Type: language Subtag: blm -Description: Beli (Sudan) +Description: Beli (South Sudan) Added: 2009-07-29 %% Type: language @@ -5332,6 +5368,7 @@ Added: 2009-07-29 %% Type: language Subtag: blv +Description: Kibala Description: Bolo Added: 2009-07-29 %% @@ -5382,7 +5419,7 @@ Added: 2009-07-29 %% Type: language Subtag: bmf -Description: Bom +Description: Bom-Kim Added: 2009-07-29 %% Type: language @@ -5648,7 +5685,7 @@ Added: 2009-07-29 %% Type: language Subtag: boi -Description: Barbareño +Description: Barbareño Added: 2009-07-29 %% Type: language @@ -5678,7 +5715,7 @@ Added: 2009-07-29 %% Type: language Subtag: boo -Description: Tiemacèwè Bozo +Description: Tiemacèwè Bozo Added: 2009-07-29 %% Type: language @@ -5693,7 +5730,7 @@ Added: 2009-07-29 %% Type: language Subtag: bor -Description: Borôro +Description: Borôro Added: 2009-07-29 %% Type: language @@ -5728,7 +5765,7 @@ Added: 2009-07-29 %% Type: language Subtag: boz -Description: Tiéyaxo Bozo +Description: Tiéyaxo Bozo Added: 2009-07-29 %% Type: language @@ -5740,6 +5777,12 @@ Type: language Subtag: bpb Description: Barbacoas Added: 2009-07-29 +Deprecated: 2020-03-28 +%% +Type: language +Subtag: bpc +Description: Mbuk +Added: 2022-02-25 %% Type: language Subtag: bpd @@ -5747,6 +5790,11 @@ Description: Banda-Banda Added: 2009-07-29 %% Type: language +Subtag: bpe +Description: Bauni +Added: 2021-02-20 +%% +Type: language Subtag: bpg Description: Bonggo Added: 2009-07-29 @@ -5769,7 +5817,7 @@ Added: 2009-07-29 Type: language Subtag: bpk Description: Orowe -Description: 'Ôrôê +Description: 'Ôrôê Added: 2009-07-29 %% Type: language @@ -5895,7 +5943,7 @@ Added: 2009-07-29 %% Type: language Subtag: bqk -Description: Banda-Mbrès +Description: Banda-Mbrès Added: 2009-07-29 %% Type: language @@ -5981,6 +6029,7 @@ Added: 2005-10-16 %% Type: language Subtag: brb +Description: Brao Description: Lave Added: 2009-07-29 %% @@ -5996,7 +6045,7 @@ Added: 2009-07-29 %% Type: language Subtag: brf -Description: Bera +Description: Bira Added: 2009-07-29 %% Type: language @@ -6202,7 +6251,7 @@ Added: 2009-07-29 %% Type: language Subtag: bsv -Description: Baga Sobané +Description: Baga Sobané Added: 2009-07-29 %% Type: language @@ -6254,7 +6303,7 @@ Added: 2009-07-29 %% Type: language Subtag: btg -Description: Gagnoa Bété +Description: Gagnoa Bété Added: 2009-07-29 %% Type: language @@ -6651,7 +6700,7 @@ Added: 2009-07-29 %% Type: language Subtag: bwj -Description: Láá Láá Bwamu +Description: Láá Láá Bwamu Added: 2009-07-29 %% Type: language @@ -6687,7 +6736,7 @@ Added: 2009-07-29 %% Type: language Subtag: bwq -Description: Southern Bobo Madaré +Description: Southern Bobo Madaré Added: 2009-07-29 %% Type: language @@ -6920,7 +6969,7 @@ Added: 2009-07-29 %% Type: language Subtag: bym -Description: Bidyara +Description: Bidjara Added: 2009-07-29 %% Type: language @@ -7104,7 +7153,7 @@ Added: 2009-07-29 %% Type: language Subtag: bzx -Description: K?l?ngaxo Bozo +Description: KÉ›lÉ›ngaxo Bozo Added: 2009-07-29 %% Type: language @@ -7119,7 +7168,7 @@ Added: 2009-07-29 %% Type: language Subtag: caa -Description: Chortí +Description: Chortí Added: 2009-07-29 %% Type: language @@ -7150,7 +7199,7 @@ Added: 2009-07-29 %% Type: language Subtag: cag -Description: Nivaclé +Description: Nivaclé Added: 2009-07-29 %% Type: language @@ -7166,7 +7215,7 @@ Scope: collection %% Type: language Subtag: caj -Description: Chané +Description: Chané Added: 2009-07-29 %% Type: language @@ -7182,7 +7231,7 @@ Added: 2009-07-29 %% Type: language Subtag: cam -Description: Cemuhî +Description: Cemuhî Added: 2009-07-29 %% Type: language @@ -7192,7 +7241,7 @@ Added: 2009-07-29 %% Type: language Subtag: cao -Description: Chácobo +Description: Chácobo Added: 2009-07-29 %% Type: language @@ -7212,7 +7261,7 @@ Added: 2005-10-16 %% Type: language Subtag: cas -Description: Tsimané +Description: Tsimané Added: 2009-07-29 %% Type: language @@ -7223,7 +7272,7 @@ Scope: collection %% Type: language Subtag: cav -Description: Cavineña +Description: Cavineña Added: 2009-07-29 %% Type: language @@ -7254,7 +7303,7 @@ Scope: collection %% Type: language Subtag: cbb -Description: Cabiyarí +Description: Cabiyarí Added: 2009-07-29 %% Type: language @@ -7359,6 +7408,7 @@ Type: language Subtag: cca Description: Cauca Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: ccc @@ -7465,6 +7515,7 @@ Type: language Subtag: cdg Description: Chamari Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: cdh @@ -7550,10 +7601,15 @@ Added: 2009-07-29 %% Type: language Subtag: cet -Description: Centúúm +Description: Centúúm Added: 2009-07-29 %% Type: language +Subtag: cey +Description: Ekai Chin +Added: 2019-04-16 +%% +Type: language Subtag: cfa Description: Dijim-Bwilim Added: 2009-07-29 @@ -7625,7 +7681,7 @@ Added: 2009-07-29 %% Type: language Subtag: chj -Description: Ojitlán Chinantec +Description: Ojitlán Chinantec Added: 2009-07-29 %% Type: language @@ -7672,7 +7728,7 @@ Added: 2005-10-16 %% Type: language Subtag: cht -Description: Cholón +Description: Cholón Added: 2009-07-29 %% Type: language @@ -7692,7 +7748,7 @@ Added: 2005-10-16 %% Type: language Subtag: chz -Description: Ozumacín Chinantec +Description: Ozumacín Chinantec Added: 2009-07-29 %% Type: language @@ -7748,8 +7804,8 @@ Added: 2009-07-29 Type: language Subtag: cir Description: Tiri -Description: Haméa -Description: Méa +Description: Haméa +Description: Méa Added: 2009-07-29 %% Type: language @@ -7800,12 +7856,12 @@ Added: 2009-07-29 %% Type: language Subtag: cjo -Description: Ashéninka Pajonal +Description: Ashéninka Pajonal Added: 2009-07-29 %% Type: language Subtag: cjp -Description: Cabécar +Description: Cabécar Added: 2009-07-29 %% Type: language @@ -7855,6 +7911,11 @@ Description: Cibak Added: 2009-07-29 %% Type: language +Subtag: ckm +Description: Chakavian +Added: 2020-03-28 +%% +Type: language Subtag: ckn Description: Kaang Chin Added: 2013-09-10 @@ -7906,7 +7967,7 @@ Added: 2009-07-29 %% Type: language Subtag: ckz -Description: Cakchiquel-Quiché Mixed Language +Description: Cakchiquel-Quiché Mixed Language Added: 2009-07-29 %% Type: language @@ -8008,7 +8069,7 @@ Added: 2009-07-29 %% Type: language Subtag: cmi -Description: Emberá-Chamí +Description: Emberá-Chamí Added: 2009-07-29 %% Type: language @@ -8066,7 +8127,7 @@ Added: 2009-07-29 %% Type: language Subtag: cnc -Description: Côông +Description: Côông Added: 2009-07-29 %% Type: language @@ -8082,7 +8143,7 @@ Added: 2009-07-29 %% Type: language Subtag: cni -Description: Asháninka +Description: Asháninka Added: 2009-07-29 %% Type: language @@ -8101,6 +8162,25 @@ Description: Con Added: 2009-07-29 %% Type: language +Subtag: cnp +Description: Northern Ping Chinese +Description: Northern Pinghua +Added: 2020-03-28 +Macrolanguage: zh +%% +Type: language +Subtag: cnq +Description: Chung +Added: 2022-02-25 +%% +Type: language +Subtag: cnr +Description: Montenegrin +Added: 2018-01-23 +Macrolanguage: sh +Comments: see sr for Serbian +%% +Type: language Subtag: cns Description: Central Asmat Added: 2009-07-29 @@ -8189,7 +8269,7 @@ Added: 2009-07-29 %% Type: language Subtag: con -Description: Cofán +Description: Cofán Added: 2009-07-29 %% Type: language @@ -8251,12 +8331,12 @@ Added: 2009-07-29 %% Type: language Subtag: cpb -Description: Ucayali-Yurúa Ashéninka +Description: Ucayali-Yurúa Ashéninka Added: 2009-07-29 %% Type: language Subtag: cpc -Description: Ajyíninka Apurucayali +Description: Ajyíninka Apurucayali Added: 2009-07-29 %% Type: language @@ -8304,7 +8384,7 @@ Added: 2009-07-29 %% Type: language Subtag: cpu -Description: Pichis Ashéninka +Description: Pichis Ashéninka Added: 2009-07-29 %% Type: language @@ -8315,7 +8395,7 @@ Macrolanguage: zh %% Type: language Subtag: cpy -Description: South Ucayali Ashéninka +Description: South Ucayali Ashéninka Added: 2009-07-29 %% Type: language @@ -8370,7 +8450,7 @@ Added: 2005-10-16 %% Type: language Subtag: cri -Description: Sãotomense +Description: Sãotomense Added: 2009-07-29 %% Type: language @@ -8455,7 +8535,7 @@ Added: 2009-07-29 %% Type: language Subtag: crz -Description: Cruzeño +Description: Cruzeño Added: 2009-07-29 %% Type: language @@ -8471,7 +8551,7 @@ Added: 2005-10-16 Type: language Subtag: csc Description: Catalan Sign Language -Description: Lengua de señas catalana +Description: Lengua de señas catalana Description: Llengua de Signes Catalana Added: 2009-07-29 %% @@ -8537,6 +8617,13 @@ Description: Sochiapan Chinantec Added: 2009-07-29 %% Type: language +Subtag: csp +Description: Southern Ping Chinese +Description: Southern Pinghua +Added: 2020-03-28 +Macrolanguage: zh +%% +Type: language Subtag: csq Description: Croatia Sign Language Added: 2009-07-29 @@ -8574,6 +8661,11 @@ Added: 2009-07-29 Macrolanguage: cr %% Type: language +Subtag: csx +Description: Cambodian Sign Language +Added: 2021-02-20 +%% +Type: language Subtag: csy Description: Siyin Chin Added: 2009-07-29 @@ -8630,7 +8722,7 @@ Added: 2009-07-29 %% Type: language Subtag: cto -Description: Emberá-Catío +Description: Emberá-Catío Added: 2009-07-29 %% Type: language @@ -8655,6 +8747,11 @@ Description: Chol Added: 2009-07-29 %% Type: language +Subtag: cty +Description: Moundadan Chetty +Added: 2021-02-20 +%% +Type: language Subtag: ctz Description: Zacatepec Chatino Added: 2009-07-29 @@ -8676,8 +8773,11 @@ Added: 2009-07-29 %% Type: language Subtag: cug +Description: Chungmboko Description: Cung Added: 2009-07-29 +Deprecated: 2022-02-25 +Comments: see bpc, cnq %% Type: language Subtag: cuh @@ -8719,7 +8819,7 @@ Added: 2009-07-29 %% Type: language Subtag: cup -Description: Cupeño +Description: Cupeño Added: 2009-07-29 %% Type: language @@ -8764,6 +8864,11 @@ Description: Tepeuxila Cuicatec Added: 2009-07-29 %% Type: language +Subtag: cuy +Description: Cuitlatec +Added: 2018-03-08 +%% +Type: language Subtag: cvg Description: Chug Added: 2009-07-29 @@ -8806,6 +8911,11 @@ Description: Kuwaataay Added: 2009-07-29 %% Type: language +Subtag: cxh +Description: Cha'ari +Added: 2023-03-17 +%% +Type: language Subtag: cya Description: Nopala Chatino Added: 2009-07-29 @@ -8849,7 +8959,7 @@ Added: 2009-07-29 %% Type: language Subtag: daa -Description: Dangaléat +Description: Dangaléat Added: 2009-07-29 %% Type: language @@ -9285,6 +9395,7 @@ Macrolanguage: doi Type: language Subtag: dgr Description: Dogrib +Description: Tłı̨chÇ« Added: 2005-10-16 %% Type: language @@ -9301,6 +9412,7 @@ Type: language Subtag: dgu Description: Degaru Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: dgw @@ -9416,6 +9528,7 @@ Added: 2009-07-29 Type: language Subtag: dif Description: Dieri +Description: Diyari Added: 2009-07-29 %% Type: language @@ -9492,6 +9605,8 @@ Type: language Subtag: dit Description: Dirari Added: 2009-07-29 +Deprecated: 2019-04-29 +Preferred-Value: dif %% Type: language Subtag: diu @@ -9537,6 +9652,7 @@ Added: 2009-07-29 Type: language Subtag: djd Description: Djamindjung +Description: Ngaliwurru Added: 2009-07-29 %% Type: language @@ -9580,6 +9696,7 @@ Added: 2009-07-29 %% Type: language Subtag: djn +Description: Jawoyn Description: Djauan Added: 2009-07-29 %% @@ -9609,6 +9726,11 @@ Description: Dakpakha Added: 2009-07-29 %% Type: language +Subtag: dkg +Description: Kadung +Added: 2021-02-20 +%% +Type: language Subtag: dkk Description: Dakka Added: 2009-07-29 @@ -9682,6 +9804,11 @@ Description: Dugwor Added: 2009-07-29 %% Type: language +Subtag: dmf +Description: Medefaidrin +Added: 2020-03-28 +%% +Type: language Subtag: dmg Description: Upper Kinabatangan Added: 2009-07-29 @@ -9786,10 +9913,16 @@ Added: 2009-07-29 %% Type: language Subtag: dnn -Description: Dzùùngoo +Description: Dzùùngoo Added: 2009-07-29 %% Type: language +Subtag: dno +Description: Ndrulo +Description: Northern Lendu +Added: 2018-10-28 +%% +Type: language Subtag: dnr Description: Danaru Added: 2009-07-29 @@ -9816,7 +9949,7 @@ Added: 2009-07-29 %% Type: language Subtag: dny -Description: Dení +Description: Dení Added: 2009-07-29 %% Type: language @@ -9892,7 +10025,7 @@ Added: 2009-07-29 %% Type: language Subtag: dos -Description: Dogosé +Description: Dogosé Added: 2009-07-29 %% Type: language @@ -9997,6 +10130,8 @@ Type: language Subtag: drr Description: Dororo Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kzk %% Type: language Subtag: drs @@ -10047,6 +10182,11 @@ Description: Disa Added: 2009-07-29 %% Type: language +Subtag: dsk +Description: Dokshi +Added: 2023-03-17 +%% +Type: language Subtag: dsl Description: Danish Sign Language Added: 2009-07-29 @@ -10067,6 +10207,11 @@ Description: Tadaksahak Added: 2009-07-29 %% Type: language +Subtag: dsz +Description: Mardin Sign Language +Added: 2022-02-25 +%% +Type: language Subtag: dta Description: Daur Added: 2009-07-29 @@ -10103,7 +10248,7 @@ Added: 2009-07-29 %% Type: language Subtag: dtn -Description: Daats'íin +Description: Daatsʼíin Added: 2016-05-30 %% Type: language @@ -10162,6 +10307,8 @@ Type: language Subtag: dud Description: Hun-Saare Added: 2009-07-29 +Deprecated: 2019-04-16 +Comments: see uth, uss %% Type: language Subtag: due @@ -10284,6 +10431,11 @@ Description: Diri Added: 2009-07-29 %% Type: language +Subtag: dwk +Description: Dawik Kui +Added: 2020-03-28 +%% +Type: language Subtag: dwl Description: Walo Kumbe Dogon Added: 2009-07-29 @@ -10316,6 +10468,11 @@ Description: Dhuwaya Added: 2016-05-30 %% Type: language +Subtag: dwz +Description: Dewas Rai +Added: 2018-10-28 +%% +Type: language Subtag: dya Description: Dyan Added: 2009-07-29 @@ -10348,6 +10505,7 @@ Added: 2009-07-29 Type: language Subtag: dyn Description: Dyangadi +Description: Dhanggatti Added: 2009-07-29 %% Type: language @@ -10356,12 +10514,18 @@ Description: Jola-Fonyi Added: 2009-07-29 %% Type: language +Subtag: dyr +Description: Dyarim +Added: 2023-03-17 +%% +Type: language Subtag: dyu Description: Dyula Added: 2005-10-16 %% Type: language Subtag: dyy +Description: Djabugay Description: Dyaabugay Added: 2009-07-29 %% @@ -10374,7 +10538,6 @@ Type: language Subtag: dzd Description: Daza Added: 2009-07-29 -Deprecated: 2015-02-12 %% Type: language Subtag: dze @@ -10402,6 +10565,11 @@ Description: Karenggapa Added: 2013-09-10 %% Type: language +Subtag: ebc +Description: Beginci +Added: 2020-03-28 +%% +Type: language Subtag: ebg Description: Ebughu Added: 2009-07-29 @@ -10419,7 +10587,7 @@ Added: 2009-07-29 %% Type: language Subtag: ebr -Description: Ebrié +Description: Ebrié Added: 2009-07-29 %% Type: language @@ -10474,6 +10642,11 @@ Description: Emilian Added: 2009-07-29 %% Type: language +Subtag: egm +Description: Benamanga +Added: 2022-02-25 +%% +Type: language Subtag: ego Description: Eggon Added: 2009-07-29 @@ -10490,6 +10663,11 @@ Description: Egyptian (Ancient) Added: 2005-10-16 %% Type: language +Subtag: ehs +Description: Miyakubo Sign Language +Added: 2021-02-20 +%% +Type: language Subtag: ehu Description: Ehueun Added: 2009-07-29 @@ -10523,6 +10701,7 @@ Type: language Subtag: ekc Description: Eastern Karnic Added: 2013-09-10 +Deprecated: 2020-03-28 %% Type: language Subtag: eke @@ -10672,10 +10851,15 @@ Deprecated: 2014-02-28 %% Type: language Subtag: emp -Description: Northern Emberá +Description: Northern Emberá Added: 2009-07-29 %% Type: language +Subtag: emq +Description: Eastern Minyag +Added: 2021-02-20 +%% +Type: language Subtag: ems Description: Pacific Gulf Yupik Added: 2009-07-29 @@ -10701,6 +10885,11 @@ Description: Epigraphic Mayan Added: 2009-07-29 %% Type: language +Subtag: emz +Description: Mbessa +Added: 2021-02-20 +%% +Type: language Subtag: ena Description: Apali Added: 2009-07-29 @@ -10769,7 +10958,7 @@ Added: 2009-07-29 %% Type: language Subtag: env -Description: Enwan (Edu State) +Description: Enwan (Edo State) Added: 2009-07-29 %% Type: language @@ -10784,7 +10973,7 @@ Added: 2014-02-28 %% Type: language Subtag: eot -Description: Beti (Côte d'Ivoire) +Description: Beti (Côte d'Ivoire) Added: 2009-07-29 %% Type: language @@ -10972,6 +11161,11 @@ Description: Semimi Added: 2009-07-29 %% Type: language +Subtag: eud +Description: Eudeve +Added: 2023-03-17 +%% +Type: language Subtag: euq Description: Basque (family) Added: 2009-07-29 @@ -11085,7 +11279,7 @@ Added: 2005-10-16 %% Type: language Subtag: fap -Description: Palor +Description: Paloor Added: 2009-07-29 %% Type: language @@ -11162,6 +11356,11 @@ Description: Fyer Added: 2009-07-29 %% Type: language +Subtag: fif +Description: Faifi +Added: 2020-06-08 +%% +Type: language Subtag: fil Description: Filipino Description: Pilipino @@ -11180,6 +11379,7 @@ Added: 2009-07-29 Type: language Subtag: fit Description: Tornedalen Finnish +Description: Meänkieli Added: 2009-07-29 %% Type: language @@ -11195,7 +11395,7 @@ Added: 2009-07-29 %% Type: language Subtag: fkk -Description: Kirya-Konz?l +Description: Kirya-KonzÉ™l Added: 2012-08-12 %% Type: language @@ -11338,7 +11538,7 @@ Added: 2005-10-16 Type: language Subtag: frp Description: Arpitan -Description: Francoprovençal +Description: Francoprovençal Added: 2009-07-29 %% Type: language @@ -11376,7 +11576,7 @@ Added: 2009-07-29 Type: language Subtag: fss Description: Finland-Swedish Sign Language -Description: finlandssvenskt teckenspråk +Description: finlandssvenskt teckensprÃ¥k Description: suomenruotsalainen viittomakieli Added: 2009-07-29 %% @@ -11433,7 +11633,7 @@ Added: 2009-07-29 %% Type: language Subtag: fun -Description: Fulniô +Description: Fulniô Added: 2009-07-29 %% Type: language @@ -11475,7 +11675,7 @@ Added: 2009-07-29 %% Type: language Subtag: fwa -Description: Fwâi +Description: Fwâi Added: 2009-07-29 %% Type: language @@ -11638,7 +11838,7 @@ Comments: see wny, wrk %% Type: language Subtag: gbd -Description: Karadjeri +Description: Karajarri Added: 2009-07-29 %% Type: language @@ -11828,6 +12028,7 @@ Added: 2009-07-29 Type: language Subtag: gdh Description: Gadjerawang +Description: Gajirrabeng Added: 2009-07-29 %% Type: language @@ -11917,6 +12118,11 @@ Description: Gade Added: 2009-07-29 %% Type: language +Subtag: gef +Description: Gerai +Added: 2020-03-28 +%% +Type: language Subtag: geg Description: Gengle Added: 2009-07-29 @@ -12000,7 +12206,7 @@ Added: 2009-07-29 %% Type: language Subtag: gfx -Description: Mangetti Dune !Xung +Description: Mangetti Dune ǃXung Added: 2012-08-12 Deprecated: 2015-02-12 Preferred-Value: vaj @@ -12022,7 +12228,7 @@ Added: 2009-07-29 %% Type: language Subtag: gge -Description: Guragone +Description: Gurr-goni Added: 2009-07-29 %% Type: language @@ -12079,7 +12285,7 @@ Added: 2009-07-29 %% Type: language Subtag: gha -Description: Ghadamès +Description: Ghadamès Added: 2009-07-29 %% Type: language @@ -12135,7 +12341,7 @@ Added: 2009-07-29 %% Type: language Subtag: gia -Description: Kitja +Description: Kija Added: 2009-07-29 %% Type: language @@ -12154,6 +12360,12 @@ Description: Gidar Added: 2009-07-29 %% Type: language +Subtag: gie +Description: GaÉ“ogbo +Description: Guébie +Added: 2017-02-23 +%% +Type: language Subtag: gig Description: Goaria Added: 2009-07-29 @@ -12164,6 +12376,11 @@ Description: Githabul Added: 2013-09-10 %% Type: language +Subtag: gii +Description: Girirra +Added: 2021-02-20 +%% +Type: language Subtag: gil Description: Gilbertese Added: 2005-10-16 @@ -12239,6 +12456,8 @@ Type: language Subtag: gji Description: Geji Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see gyz, zbu %% Type: language Subtag: gjk @@ -12272,6 +12491,11 @@ Description: Guya Added: 2009-07-29 %% Type: language +Subtag: gkd +Description: Magɨ (Madang Province) +Added: 2018-03-08 +%% +Type: language Subtag: gke Description: Ndai Added: 2009-07-29 @@ -12294,11 +12518,15 @@ Macrolanguage: kpe %% Type: language Subtag: gku -Description: ?Ungkue -Description: =/Ungkue +Description: Ç‚Ungkue Added: 2015-02-12 %% Type: language +Subtag: glb +Description: Belning +Added: 2021-02-20 +%% +Type: language Subtag: glc Description: Bon Gula Added: 2009-07-29 @@ -12318,6 +12546,8 @@ Type: language Subtag: gli Description: Guliguli Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kzk %% Type: language Subtag: glj @@ -12371,7 +12601,7 @@ Added: 2009-07-29 %% Type: language Subtag: gmd -Description: Mághdì +Description: Mághdì Added: 2009-07-29 %% Type: language @@ -12382,7 +12612,7 @@ Scope: collection %% Type: language Subtag: gmg -Description: Mag?yi +Description: Magɨyi Added: 2014-02-28 %% Type: language @@ -12413,6 +12643,12 @@ Added: 2009-07-29 Scope: collection %% Type: language +Subtag: gmr +Description: Mirning +Description: Mirniny +Added: 2020-03-28 +%% +Type: language Subtag: gmu Description: Gumalu Added: 2009-07-29 @@ -12484,9 +12720,13 @@ Description: Gooniyandi Added: 2009-07-29 %% Type: language +Subtag: gnj +Description: Ngen +Added: 2018-03-08 +%% +Type: language Subtag: gnk -Description: //Gana -Description: ?Gana +Description: ÇGana Added: 2009-07-29 %% Type: language @@ -12532,7 +12772,7 @@ Added: 2009-07-29 %% Type: language Subtag: gnw -Description: Western Bolivian Guaraní +Description: Western Bolivian Guaraní Added: 2009-07-29 Macrolanguage: gn %% @@ -12558,7 +12798,7 @@ Added: 2009-07-29 %% Type: language Subtag: god -Description: Godié +Description: Godié Added: 2009-07-29 %% Type: language @@ -12649,6 +12889,11 @@ Description: Gavar Added: 2009-07-29 %% Type: language +Subtag: gov +Description: Goo +Added: 2022-02-25 +%% +Type: language Subtag: gow Description: Gorowa Added: 2009-07-29 @@ -12870,7 +13115,7 @@ Suppress-Script: Latn %% Type: language Subtag: gta -Description: Guató +Description: Guató Added: 2009-07-29 %% Type: language @@ -12892,7 +13137,7 @@ Added: 2009-07-29 %% Type: language Subtag: gub -Description: Guajajára +Description: Guajajára Added: 2009-07-29 %% Type: language @@ -12902,12 +13147,12 @@ Added: 2009-07-29 %% Type: language Subtag: gud -Description: Yocoboué Dida +Description: Yocoboué Dida Added: 2009-07-29 %% Type: language Subtag: gue -Description: Gurinji +Description: Gurindji Added: 2009-07-29 %% Type: language @@ -12917,7 +13162,7 @@ Added: 2009-07-29 %% Type: language Subtag: gug -Description: Paraguayan Guaraní +Description: Paraguayan Guaraní Added: 2009-07-29 Macrolanguage: gn %% @@ -12928,7 +13173,7 @@ Added: 2009-07-29 %% Type: language Subtag: gui -Description: Eastern Bolivian Guaraní +Description: Eastern Bolivian Guaraní Added: 2009-07-29 Macrolanguage: gn %% @@ -12949,7 +13194,7 @@ Added: 2009-07-29 %% Type: language Subtag: gun -Description: Mbyá Guaraní +Description: Mbyá Guaraní Added: 2009-07-29 Macrolanguage: gn %% @@ -12965,7 +13210,7 @@ Added: 2009-07-29 %% Type: language Subtag: guq -Description: Aché +Description: Aché Added: 2009-07-29 %% Type: language @@ -12980,12 +13225,12 @@ Added: 2009-07-29 %% Type: language Subtag: gut -Description: Maléku Jaíka +Description: Maléku Jaíka Added: 2009-07-29 %% Type: language Subtag: guu -Description: Yanomamö +Description: Yanomamö Added: 2009-07-29 %% Type: language @@ -13002,7 +13247,7 @@ Added: 2009-07-29 %% Type: language Subtag: gux -Description: Gourmanchéma +Description: Gourmanchéma Added: 2009-07-29 %% Type: language @@ -13033,7 +13278,7 @@ Added: 2009-07-29 %% Type: language Subtag: gvj -Description: Guajá +Description: Guajá Added: 2009-07-29 %% Type: language @@ -13053,12 +13298,12 @@ Added: 2009-07-29 %% Type: language Subtag: gvo -Description: Gavião Do Jiparaná +Description: Gavião Do Jiparaná Added: 2009-07-29 %% Type: language Subtag: gvp -Description: Pará Gavião +Description: Pará Gavião Added: 2009-07-29 %% Type: language @@ -13088,6 +13333,7 @@ Added: 2009-07-29 %% Type: language Subtag: gwc +Description: Gawri Description: Kalami Added: 2009-07-29 %% @@ -13113,13 +13359,12 @@ Added: 2009-07-29 %% Type: language Subtag: gwi -Description: Gwich'in +Description: Gwichʼin Added: 2005-10-16 %% Type: language Subtag: gwj -Description: /Gwi -Description: |Gwi +Description: Ç€Gwi Added: 2009-07-29 %% Type: language @@ -13159,7 +13404,7 @@ Added: 2009-07-29 %% Type: language Subtag: gxx -Description: Wè Southern +Description: Wè Southern Added: 2009-07-29 %% Type: language @@ -13205,7 +13450,7 @@ Added: 2009-07-29 %% Type: language Subtag: gym -Description: Ngäbere +Description: Ngäbere Added: 2009-07-29 %% Type: language @@ -13214,6 +13459,11 @@ Description: Guyanese Creole English Added: 2009-07-29 %% Type: language +Subtag: gyo +Description: Gyalsumdo +Added: 2018-03-08 +%% +Type: language Subtag: gyr Description: Guarayu Added: 2009-07-29 @@ -13224,6 +13474,12 @@ Description: Gunya Added: 2009-07-29 %% Type: language +Subtag: gyz +Description: Geji +Description: Gyaazi +Added: 2021-02-20 +%% +Type: language Subtag: gza Description: Ganza Added: 2009-07-29 @@ -13313,7 +13569,7 @@ Added: 2009-07-29 %% Type: language Subtag: hao -Description: Hakö +Description: Hakö Added: 2009-07-29 %% Type: language @@ -13421,7 +13677,7 @@ Macrolanguage: hmn %% Type: language Subtag: hed -Description: Herdé +Description: Herdé Added: 2009-07-29 %% Type: language @@ -13446,8 +13702,7 @@ Added: 2009-07-29 %% Type: language Subtag: hgm -Description: Hai//om -Description: Hai?om +Description: HaiÇom Added: 2009-07-29 %% Type: language @@ -13534,7 +13789,7 @@ Added: 2009-07-29 %% Type: language Subtag: hir -Description: Himarimã +Description: Himarimã Added: 2009-07-29 %% Type: language @@ -13549,7 +13804,7 @@ Added: 2009-07-29 %% Type: language Subtag: hix -Description: Hixkaryána +Description: Hixkaryána Added: 2009-07-29 %% Type: language @@ -13569,11 +13824,22 @@ Description: Hunde Added: 2009-07-29 %% Type: language +Subtag: hkh +Description: Khah +Description: Poguli +Added: 2021-02-20 +%% +Type: language Subtag: hkk Description: Hunjara-Kaina Ke Added: 2009-07-29 %% Type: language +Subtag: hkn +Description: Mel-Khaonh +Added: 2018-03-08 +%% +Type: language Subtag: hks Description: Hong Kong Sign Language Description: Heung Kong Sau Yue @@ -13737,7 +14003,7 @@ Added: 2009-07-29 %% Type: language Subtag: hmv -Description: Hmong Dô +Description: Hmong Dô Added: 2009-07-29 %% Type: language @@ -13784,9 +14050,13 @@ Description: Chhattisgarhi Added: 2009-07-29 %% Type: language +Subtag: hng +Description: Hungu +Added: 2020-03-28 +%% +Type: language Subtag: hnh -Description: //Ani -Description: ?Ani +Description: ÇAni Added: 2009-07-29 %% Type: language @@ -13850,7 +14120,7 @@ Added: 2009-07-29 %% Type: language Subtag: hoh -Description: Hobyót +Description: Hobyót Added: 2009-07-29 %% Type: language @@ -13904,7 +14174,7 @@ Added: 2009-07-29 Type: language Subtag: hot Description: Hote -Description: Malê +Description: Malê Added: 2009-07-29 %% Type: language @@ -13983,7 +14253,7 @@ Preferred-Value: jal %% Type: language Subtag: hrt -Description: Hértevin +Description: Hértevin Added: 2009-07-29 %% Type: language @@ -14065,8 +14335,8 @@ Added: 2009-07-29 %% Type: language Subtag: huc -Description: =/Hua -Description: ?Hua +Description: Ç‚Hua +Description: ǂʼAmkhoe Added: 2009-07-29 %% Type: language @@ -14168,12 +14438,12 @@ Added: 2009-07-29 %% Type: language Subtag: hux -Description: Nüpode Huitoto +Description: Nüpode Huitoto Added: 2009-07-29 %% Type: language Subtag: huy -Description: Hulaulá +Description: Hulaulá Added: 2009-07-29 %% Type: language @@ -14203,12 +14473,12 @@ Added: 2009-07-29 %% Type: language Subtag: hvv -Description: Santa María Del Mar Huave +Description: Santa María Del Mar Huave Added: 2009-07-29 %% Type: language Subtag: hwa -Description: Wané +Description: Wané Added: 2009-07-29 %% Type: language @@ -14228,6 +14498,12 @@ Description: Hya Added: 2009-07-29 %% Type: language +Subtag: hyw +Description: Western Armenian +Added: 2018-03-08 +Comments: see also hy +%% +Type: language Subtag: hyx Description: Armenian (family) Added: 2009-07-29 @@ -14280,6 +14556,11 @@ Description: Ibanag Added: 2009-07-29 %% Type: language +Subtag: ibh +Description: Bih +Added: 2017-02-23 +%% +Type: language Subtag: ibi Description: Ibilo Added: 2009-07-29 @@ -14381,7 +14662,7 @@ Added: 2009-07-29 %% Type: language Subtag: idt -Description: Idaté +Description: Idaté Added: 2009-07-29 %% Type: language @@ -14402,7 +14683,7 @@ Added: 2009-07-29 %% Type: language Subtag: ife -Description: Ifè +Description: Ifè Added: 2009-07-29 %% Type: language @@ -14544,6 +14825,11 @@ Added: 2009-07-29 Macrolanguage: iu %% Type: language +Subtag: ikh +Description: Ikhin-Arokho +Added: 2023-03-17 +%% +Type: language Subtag: iki Description: Iko Added: 2009-07-29 @@ -14716,6 +15002,11 @@ Description: Marsian Added: 2009-07-29 %% Type: language +Subtag: imt +Description: Imotong +Added: 2022-02-25 +%% +Type: language Subtag: imy Description: Milyan Added: 2009-07-29 @@ -14774,7 +15065,7 @@ Added: 2009-07-29 %% Type: language Subtag: inp -Description: Iñapari +Description: Iñapari Added: 2009-07-29 %% Type: language @@ -14789,7 +15080,7 @@ Added: 2009-07-29 %% Type: language Subtag: inz -Description: Ineseño +Description: Ineseño Added: 2009-07-29 %% Type: language @@ -14845,6 +15136,7 @@ Added: 2009-07-29 %% Type: language Subtag: iri +Description: Rigwe Description: Irigwe Added: 2009-07-29 %% @@ -14855,7 +15147,7 @@ Added: 2009-07-29 %% Type: language Subtag: irn -Description: Irántxe +Description: Irántxe Added: 2009-07-29 %% Type: language @@ -15037,7 +15329,7 @@ Added: 2009-07-29 %% Type: language Subtag: itz -Description: Itzá +Description: Itzá Added: 2009-07-29 %% Type: language @@ -15113,6 +15405,11 @@ Deprecated: 2013-09-10 Comments: see eza, gmz, iqw, izz %% Type: language +Subtag: izm +Description: Kizamani +Added: 2023-03-17 +%% +Type: language Subtag: izr Description: Izere Added: 2009-07-29 @@ -15124,7 +15421,7 @@ Added: 2013-09-10 %% Type: language Subtag: jaa -Description: Jamamadí +Description: Jamamadí Added: 2009-07-29 %% Type: language @@ -15226,6 +15523,7 @@ Macrolanguage: ms Type: language Subtag: jay Description: Yan-nhangu +Description: Nhangu Added: 2009-07-29 %% Type: language @@ -15254,6 +15552,11 @@ Description: Barikewa Added: 2012-08-12 %% Type: language +Subtag: jbm +Description: Bijim +Added: 2021-02-20 +%% +Type: language Subtag: jbn Description: Nafusi Added: 2009-07-29 @@ -15270,7 +15573,7 @@ Added: 2009-07-29 %% Type: language Subtag: jbt -Description: Jabutí +Description: Jabutí Added: 2009-07-29 %% Type: language @@ -15322,6 +15625,8 @@ Type: language Subtag: jeg Description: Jeng Added: 2009-07-29 +Deprecated: 2017-02-23 +Preferred-Value: oyb %% Type: language Subtag: jeh @@ -15410,7 +15715,7 @@ Added: 2009-07-29 %% Type: language Subtag: jid -Description: Bu +Description: Bu (Kaduna State) Added: 2009-07-29 %% Type: language @@ -15420,6 +15725,7 @@ Added: 2009-07-29 %% Type: language Subtag: jig +Description: Jingulu Description: Djingili Added: 2009-07-29 %% @@ -15511,6 +15817,11 @@ Description: Koro (India) Added: 2012-08-12 %% Type: language +Subtag: jks +Description: Amami Koniya Sign Language +Added: 2021-02-20 +%% +Type: language Subtag: jku Description: Labir Added: 2009-07-29 @@ -15632,7 +15943,7 @@ Added: 2015-05-27 %% Type: language Subtag: jor -Description: Jorá +Description: Jorá Added: 2009-07-29 %% Type: language @@ -15684,12 +15995,12 @@ Added: 2009-07-29 %% Type: language Subtag: jrt -Description: Jorto +Description: Jakattoe Added: 2009-07-29 %% Type: language Subtag: jru -Description: Japrería +Description: Japrería Added: 2009-07-29 %% Type: language @@ -15699,7 +16010,7 @@ Added: 2009-07-29 %% Type: language Subtag: jua -Description: Júma +Description: Júma Added: 2009-07-29 %% Type: language @@ -15719,7 +16030,7 @@ Added: 2009-07-29 %% Type: language Subtag: juh -Description: Hõne +Description: Hõne Added: 2009-07-29 %% Type: language @@ -15754,12 +16065,12 @@ Added: 2009-07-29 %% Type: language Subtag: jup -Description: Hupdë +Description: Hupdë Added: 2009-07-29 %% Type: language Subtag: jur -Description: Jurúna +Description: Jurúna Added: 2009-07-29 %% Type: language @@ -15779,7 +16090,7 @@ Added: 2009-07-29 %% Type: language Subtag: juw -Description: Wãpha +Description: Wãpha Added: 2009-07-29 %% Type: language @@ -15821,6 +16132,7 @@ Added: 2009-07-29 Type: language Subtag: kaa Description: Kara-Kalpak +Description: Karakalpak Added: 2005-10-16 %% Type: language @@ -15903,7 +16215,7 @@ Scope: collection %% Type: language Subtag: kav -Description: Katukína +Description: Katukína Added: 2009-07-29 %% Type: language @@ -15918,7 +16230,7 @@ Added: 2009-07-29 %% Type: language Subtag: kay -Description: Kamayurá +Description: Kamayurá Added: 2009-07-29 %% Type: language @@ -15928,12 +16240,12 @@ Added: 2009-07-29 %% Type: language Subtag: kbb -Description: Kaxuiâna +Description: Kaxuiâna Added: 2009-07-29 %% Type: language Subtag: kbc -Description: Kadiwéu +Description: Kadiwéu Added: 2009-07-29 %% Type: language @@ -15959,7 +16271,7 @@ Added: 2009-07-29 %% Type: language Subtag: kbh -Description: Camsá +Description: Camsá Added: 2009-07-29 %% Type: language @@ -15999,7 +16311,7 @@ Added: 2009-07-29 %% Type: language Subtag: kbp -Description: Kabiyè +Description: Kabiyè Added: 2009-07-29 %% Type: language @@ -16070,7 +16382,7 @@ Added: 2009-07-29 %% Type: language Subtag: kcd -Description: Ngkâlmpw Kanum +Description: Ngkâlmpw Kanum Added: 2009-07-29 %% Type: language @@ -16231,8 +16543,8 @@ Added: 2009-07-29 %% Type: language Subtag: kdk -Description: Numèè -Description: Kwényi +Description: Numèè +Description: Kwényi Added: 2009-07-29 %% Type: language @@ -16316,7 +16628,7 @@ Added: 2009-07-29 %% Type: language Subtag: keb -Description: Kélé +Description: Kélé Added: 2009-07-29 %% Type: language @@ -16361,7 +16673,7 @@ Added: 2009-07-29 %% Type: language Subtag: kek -Description: Kekchí +Description: Kekchí Added: 2009-07-29 %% Type: language @@ -16511,7 +16823,7 @@ Added: 2009-07-29 %% Type: language Subtag: kfo -Description: Koro (Côte d'Ivoire) +Description: Koro (Côte d'Ivoire) Added: 2009-07-29 %% Type: language @@ -16567,7 +16879,7 @@ Added: 2009-07-29 %% Type: language Subtag: kfz -Description: Koromfé +Description: Koromfé Added: 2009-07-29 %% Type: language @@ -16591,6 +16903,8 @@ Type: language Subtag: kgd Description: Kataang Added: 2009-07-29 +Deprecated: 2017-02-23 +Comments: see ncq, sct %% Type: language Subtag: kge @@ -16626,7 +16940,7 @@ Added: 2009-07-29 %% Type: language Subtag: kgk -Description: Kaiwá +Description: Kaiwá Added: 2009-07-29 %% Type: language @@ -16636,8 +16950,10 @@ Added: 2009-07-29 %% Type: language Subtag: kgm -Description: Karipúna +Description: Karipúna Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: plu %% Type: language Subtag: kgn @@ -16708,7 +17024,7 @@ Comments: as of 2008-04-21 this subtag does not include Lyngngam; see %% Type: language Subtag: khb -Description: Lü +Description: Lü Added: 2009-07-29 %% Type: language @@ -16718,7 +17034,7 @@ Added: 2009-07-29 %% Type: language Subtag: khd -Description: Bädi Kanum +Description: Bädi Kanum Added: 2009-07-29 %% Type: language @@ -16976,8 +17292,9 @@ Added: 2009-07-29 %% Type: language Subtag: kjf -Description: Khalaj +Description: Khalaj [Indo-Iranian] Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: kjg @@ -17011,7 +17328,7 @@ Added: 2009-07-29 %% Type: language Subtag: kjm -Description: Kháng +Description: Kháng Added: 2009-07-29 %% Type: language @@ -17111,7 +17428,7 @@ Added: 2009-07-29 %% Type: language Subtag: kkh -Description: Khün +Description: Khün Added: 2009-07-29 %% Type: language @@ -17152,11 +17469,12 @@ Added: 2009-07-29 Type: language Subtag: kkp Description: Gugubera +Description: Koko-Bera Added: 2009-07-29 %% Type: language Subtag: kkq -Description: Kaiku +Description: Kaeku Added: 2009-07-29 %% Type: language @@ -17196,6 +17514,7 @@ Added: 2009-07-29 %% Type: language Subtag: kky +Description: Guugu Yimidhirr Description: Guguyimidjir Added: 2009-07-29 %% @@ -17251,7 +17570,7 @@ Added: 2009-07-29 %% Type: language Subtag: klj -Description: Turkic Khalaj +Description: Khalaj Added: 2009-07-29 %% Type: language @@ -17317,6 +17636,7 @@ Added: 2009-07-29 %% Type: language Subtag: klw +Description: Tado Description: Lindu Added: 2009-07-29 %% @@ -17367,7 +17687,7 @@ Added: 2009-07-29 %% Type: language Subtag: kmg -Description: Kâte +Description: Kâte Added: 2009-07-29 %% Type: language @@ -17443,7 +17763,7 @@ Added: 2009-07-29 %% Type: language Subtag: kmv -Description: Karipúna Creole French +Description: Karipúna Creole French Added: 2009-07-29 %% Type: language @@ -17525,7 +17845,7 @@ Added: 2009-07-29 %% Type: language Subtag: knm -Description: Kanamarí +Description: Kanamarí Added: 2009-07-29 %% Type: language @@ -17561,7 +17881,7 @@ Added: 2009-07-29 %% Type: language Subtag: knt -Description: Panoan Katukína +Description: Panoan Katukína Added: 2009-07-29 %% Type: language @@ -17592,7 +17912,7 @@ Added: 2009-07-29 %% Type: language Subtag: knz -Description: Kalamsé +Description: Kalamsé Added: 2009-07-29 %% Type: language @@ -17612,7 +17932,7 @@ Added: 2009-07-29 %% Type: language Subtag: koe -Description: Kacipo-Balesi +Description: Kacipo-Bale Suri Added: 2009-07-29 %% Type: language @@ -17760,7 +18080,7 @@ Added: 2009-07-29 %% Type: language Subtag: kpj -Description: Karajá +Description: Karajá Added: 2009-07-29 %% Type: language @@ -17780,7 +18100,7 @@ Added: 2009-07-29 %% Type: language Subtag: kpn -Description: Kepkiriwát +Description: Kepkiriwát Added: 2009-07-29 %% Type: language @@ -17923,7 +18243,7 @@ Added: 2009-07-29 %% Type: language Subtag: kqp -Description: Kimré +Description: Kimré Added: 2009-07-29 %% Type: language @@ -17998,7 +18318,7 @@ Added: 2009-07-29 %% Type: language Subtag: kre -Description: Panará +Description: Panará Added: 2009-07-29 %% Type: language @@ -18035,6 +18355,8 @@ Type: language Subtag: krm Description: Krim Added: 2009-07-29 +Deprecated: 2017-02-23 +Preferred-Value: bmf %% Type: language Subtag: krn @@ -18049,12 +18371,12 @@ Scope: collection %% Type: language Subtag: krp -Description: Korop +Description: Durop Added: 2009-07-29 %% Type: language Subtag: krr -Description: Kru'ng 2 +Description: Krung Added: 2009-07-29 %% Type: language @@ -18102,6 +18424,8 @@ Type: language Subtag: ksa Description: Shuwa-Zamani Added: 2009-07-29 +Deprecated: 2023-03-17 +Comments: see izm, rsw %% Type: language Subtag: ksb @@ -18135,7 +18459,7 @@ Added: 2009-07-29 %% Type: language Subtag: ksh -Description: Kölsch +Description: Kölsch Added: 2009-07-29 %% Type: language @@ -18196,7 +18520,7 @@ Added: 2009-07-29 %% Type: language Subtag: kst -Description: Winyé +Description: Winyé Added: 2009-07-29 %% Type: language @@ -18247,6 +18571,7 @@ Added: 2009-07-29 Type: language Subtag: ktd Description: Kokata +Description: Kukatha Added: 2009-07-29 %% Type: language @@ -18296,7 +18621,7 @@ Added: 2009-07-29 %% Type: language Subtag: ktn -Description: Karitiâna +Description: Karitiâna Added: 2009-07-29 %% Type: language @@ -18348,18 +18673,18 @@ Added: 2009-07-29 %% Type: language Subtag: ktx -Description: Kaxararí +Description: Kaxararí Added: 2009-07-29 %% Type: language Subtag: kty -Description: Kango (Bas-Uélé District) +Description: Kango (Bas-Uélé District) Added: 2009-07-29 %% Type: language Subtag: ktz -Description: Ju/'hoan -Description: Ju|'hoan +Description: Juǀʼhoan +Description: Juǀʼhoansi Added: 2009-07-29 %% Type: language @@ -18399,7 +18724,8 @@ Added: 2009-07-29 %% Type: language Subtag: kui -Description: Kuikúro-Kalapálo +Description: Kuikúro-Kalapálo +Description: Kalapalo Added: 2009-07-29 %% Type: language @@ -18621,7 +18947,7 @@ Added: 2009-07-29 %% Type: language Subtag: kwa -Description: Dâw +Description: Dâw Added: 2009-07-29 %% Type: language @@ -18728,7 +19054,7 @@ Added: 2009-07-29 %% Type: language Subtag: kwv -Description: Sara Kaba Náà +Description: Sara Kaba Náà Added: 2009-07-29 %% Type: language @@ -18811,6 +19137,8 @@ Type: language Subtag: kxl Description: Nepali Kurux Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kru %% Type: language Subtag: kxm @@ -18824,7 +19152,7 @@ Added: 2009-07-29 %% Type: language Subtag: kxo -Description: Kanoé +Description: Kanoé Added: 2009-07-29 %% Type: language @@ -18834,7 +19162,7 @@ Added: 2009-07-29 %% Type: language Subtag: kxq -Description: Smärky Kanum +Description: Smärky Kanum Added: 2009-07-29 %% Type: language @@ -18856,6 +19184,8 @@ Type: language Subtag: kxu Description: Kui (India) Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see dwk, uki %% Type: language Subtag: kxv @@ -18969,7 +19299,7 @@ Added: 2009-07-29 %% Type: language Subtag: kyr -Description: Kuruáya +Description: Kuruáya Added: 2009-07-29 %% Type: language @@ -19009,7 +19339,7 @@ Added: 2009-07-29 %% Type: language Subtag: kyz -Description: Kayabí +Description: Kayabí Added: 2009-07-29 %% Type: language @@ -19130,7 +19460,7 @@ Added: 2009-07-29 %% Type: language Subtag: kzw -Description: Karirí-Xocó +Description: Karirí-Xocó Added: 2009-07-29 %% Type: language @@ -19180,7 +19510,7 @@ Added: 2009-07-29 %% Type: language Subtag: lag -Description: Langi +Description: Rangi Added: 2009-07-29 %% Type: language @@ -19203,6 +19533,8 @@ Type: language Subtag: lak Description: Laka (Nigeria) Added: 2009-07-29 +Deprecated: 2022-02-25 +Preferred-Value: ksp %% Type: language Subtag: lal @@ -19268,6 +19600,7 @@ Type: language Subtag: lba Description: Lui Added: 2009-07-29 +Deprecated: 2019-04-16 %% Type: language Subtag: lbb @@ -19323,7 +19656,7 @@ Added: 2009-07-29 %% Type: language Subtag: lbn -Description: Lamet +Description: Rmeet Added: 2009-07-29 %% Type: language @@ -19373,6 +19706,7 @@ Added: 2009-07-29 %% Type: language Subtag: lby +Description: Lamalama Description: Lamu-Lamu Added: 2009-07-29 %% @@ -19441,7 +19775,7 @@ Added: 2013-09-10 %% Type: language Subtag: ldb -Description: Duya +Description: DÅ©ya Added: 2009-07-29 %% Type: language @@ -19487,7 +19821,7 @@ Added: 2009-07-29 %% Type: language Subtag: ldn -Description: Láadan +Description: Láadan Added: 2009-07-29 %% Type: language @@ -19527,7 +19861,7 @@ Added: 2009-07-29 %% Type: language Subtag: lee -Description: Lyélé +Description: Lyélé Added: 2009-07-29 %% Type: language @@ -19691,10 +20025,16 @@ Added: 2009-07-29 %% Type: language Subtag: lgn +Description: T'apo Description: Opuuo Added: 2009-07-29 %% Type: language +Subtag: lgo +Description: Lango (South Sudan) +Added: 2022-02-25 +%% +Type: language Subtag: lgq Description: Logba Added: 2009-07-29 @@ -19705,6 +20045,12 @@ Description: Lengo Added: 2009-07-29 %% Type: language +Subtag: lgs +Description: Guinea-Bissau Sign Language +Description: Língua Gestual Guineense +Added: 2023-03-17 +%% +Type: language Subtag: lgt Description: Pahi Added: 2009-07-29 @@ -19756,7 +20102,7 @@ Added: 2009-07-29 %% Type: language Subtag: lhs -Description: Mlahsö +Description: Mlahsö Added: 2009-07-29 %% Type: language @@ -19941,7 +20287,7 @@ Added: 2009-07-29 %% Type: language Subtag: lkd -Description: Lakondê +Description: Lakondê Added: 2009-07-29 %% Type: language @@ -19989,7 +20335,7 @@ Macrolanguage: luy %% Type: language Subtag: lkr -Description: Päri +Description: Päri Added: 2009-07-29 %% Type: language @@ -20088,6 +20434,8 @@ Type: language Subtag: llo Description: Khlor Added: 2009-07-29 +Deprecated: 2019-04-16 +Preferred-Value: ngt %% Type: language Subtag: llp @@ -20136,7 +20484,7 @@ Added: 2009-07-29 %% Type: language Subtag: lme -Description: Pévé +Description: Pévé Added: 2009-07-29 %% Type: language @@ -20235,6 +20583,7 @@ Type: language Subtag: lmz Description: Lumbee Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: lna @@ -20289,8 +20638,10 @@ Added: 2009-07-29 %% Type: language Subtag: lno -Description: Lango (Sudan) +Description: Lango (South Sudan) Added: 2009-07-29 +Deprecated: 2022-02-25 +Comments: see imt, lgo, lqr, oie %% Type: language Subtag: lns @@ -20344,12 +20695,13 @@ Added: 2009-07-29 %% Type: language Subtag: loh +Description: Laarim Description: Narim Added: 2009-07-29 %% Type: language Subtag: loi -Description: Loma (Côte d'Ivoire) +Description: Loma (Côte d'Ivoire) Added: 2009-07-29 %% Type: language @@ -20394,7 +20746,7 @@ Added: 2009-07-29 %% Type: language Subtag: lor -Description: Téén +Description: Téén Added: 2009-07-29 %% Type: language @@ -20463,6 +20815,11 @@ Description: Lopit Added: 2009-07-29 %% Type: language +Subtag: lqr +Description: Logir +Added: 2022-02-25 +%% +Type: language Subtag: lra Description: Rara Bakati' Added: 2009-07-29 @@ -20542,6 +20899,18 @@ Description: Lasgerdi Added: 2009-07-29 %% Type: language +Subtag: lsb +Description: Burundian Sign Language +Description: Langue des Signes Burundaise +Added: 2021-02-20 +%% +Type: language +Subtag: lsc +Description: Albarradas Sign Language +Description: Lengua de señas Albarradas +Added: 2022-02-25 +%% +Type: language Subtag: lsd Description: Lishana Deni Added: 2009-07-29 @@ -20555,6 +20924,7 @@ Type: language Subtag: lsg Description: Lyons Sign Language Added: 2009-07-29 +Deprecated: 2018-03-08 %% Type: language Subtag: lsh @@ -20579,6 +20949,11 @@ Added: 2009-07-29 Macrolanguage: luy %% Type: language +Subtag: lsn +Description: Tibetan Sign Language +Added: 2019-04-16 +%% +Type: language Subtag: lso Description: Laos Sign Language Added: 2009-07-29 @@ -20586,7 +20961,7 @@ Added: 2009-07-29 Type: language Subtag: lsp Description: Panamanian Sign Language -Description: Lengua de Señas Panameñas +Description: Lengua de Señas Panameñas Added: 2009-07-29 %% Type: language @@ -20605,6 +20980,18 @@ Description: Trinidad and Tobago Sign Language Added: 2009-07-29 %% Type: language +Subtag: lsv +Description: Sivia Sign Language +Added: 2019-04-16 +%% +Type: language +Subtag: lsw +Description: Seychelles Sign Language +Description: Lalang Siny Seselwa +Description: Langue des Signes Seychelloise +Added: 2022-02-25 +%% +Type: language Subtag: lsy Description: Mauritian Sign Language Added: 2010-03-11 @@ -20621,13 +21008,18 @@ Added: 2010-03-11 Macrolanguage: lv %% Type: language +Subtag: lth +Description: Thur +Added: 2017-02-23 +%% +Type: language Subtag: lti Description: Leti (Indonesia) Added: 2009-07-29 %% Type: language Subtag: ltn -Description: Latundê +Description: Latundê Added: 2009-07-29 %% Type: language @@ -20768,11 +21160,21 @@ Description: Maku'a Added: 2009-07-29 %% Type: language +Subtag: lvi +Description: Lavi +Added: 2019-04-16 +%% +Type: language Subtag: lvk Description: Lavukaleve Added: 2009-07-29 %% Type: language +Subtag: lvl +Description: Lwel +Added: 2023-03-17 +%% +Type: language Subtag: lvs Description: Standard Latvian Added: 2010-03-11 @@ -20821,6 +21223,11 @@ Description: Luwo Added: 2009-07-29 %% Type: language +Subtag: lws +Description: Malawian Sign Language +Added: 2018-03-08 +%% +Type: language Subtag: lwt Description: Lewotobi Added: 2009-07-29 @@ -20836,6 +21243,11 @@ Description: Lewo Added: 2009-07-29 %% Type: language +Subtag: lxm +Description: Lakurumau +Added: 2021-02-20 +%% +Type: language Subtag: lya Description: Layakha Added: 2009-07-29 @@ -20873,8 +21285,9 @@ Added: 2009-07-29 %% Type: language Subtag: maa -Description: San Jerónimo Tecóatl Mazatec +Description: San Jerónimo Tecóatl Mazatec Added: 2009-07-29 +Comments: see also pbm %% Type: language Subtag: mab @@ -20909,7 +21322,7 @@ Suppress-Script: Deva %% Type: language Subtag: maj -Description: Jalapa De Díaz Mazatec +Description: Jalapa De Díaz Mazatec Added: 2009-07-29 %% Type: language @@ -20937,7 +21350,7 @@ Scope: collection %% Type: language Subtag: maq -Description: Chiquihuitlán Mazatec +Description: Chiquihuitlán Mazatec Added: 2009-07-29 %% Type: language @@ -20957,7 +21370,7 @@ Added: 2009-07-29 %% Type: language Subtag: mav -Description: Sateré-Mawé +Description: Sateré-Mawé Added: 2009-07-29 %% Type: language @@ -21018,7 +21431,7 @@ Added: 2009-07-29 %% Type: language Subtag: mbj -Description: Nadëb +Description: Nadëb Added: 2009-07-29 %% Type: language @@ -21028,7 +21441,7 @@ Added: 2009-07-29 %% Type: language Subtag: mbl -Description: Maxakalí +Description: Maxakalí Added: 2009-07-29 %% Type: language @@ -21038,7 +21451,7 @@ Added: 2009-07-29 %% Type: language Subtag: mbn -Description: Macaguán +Description: Macaguán Added: 2009-07-29 %% Type: language @@ -21058,7 +21471,7 @@ Added: 2009-07-29 %% Type: language Subtag: mbr -Description: Nukak Makú +Description: Nukak Makú Added: 2009-07-29 %% Type: language @@ -21128,7 +21541,7 @@ Added: 2009-07-29 %% Type: language Subtag: mcf -Description: Matsés +Description: Matsés Added: 2009-07-29 %% Type: language @@ -21173,7 +21586,7 @@ Added: 2009-07-29 %% Type: language Subtag: mco -Description: Coatlán Mixe +Description: Coatlán Mixe Added: 2009-07-29 %% Type: language @@ -21333,7 +21746,7 @@ Added: 2009-07-29 %% Type: language Subtag: mdv -Description: Santa Lucía Monteverde Mixtec +Description: Santa Lucía Monteverde Mixtec Added: 2009-07-29 %% Type: language @@ -21353,7 +21766,7 @@ Added: 2009-07-29 %% Type: language Subtag: mdz -Description: Suruí Do Pará +Description: Suruí Do Pará Added: 2009-07-29 %% Type: language @@ -21368,7 +21781,7 @@ Added: 2009-07-29 %% Type: language Subtag: mec -Description: Mara +Description: Marra Added: 2009-07-29 %% Type: language @@ -21437,7 +21850,7 @@ Macrolanguage: ms %% Type: language Subtag: mep -Description: Miriwung +Description: Miriwoong Added: 2009-07-29 %% Type: language @@ -21574,7 +21987,7 @@ Added: 2009-07-29 %% Type: language Subtag: mfr -Description: Marithiel +Description: Marrithiyel Added: 2009-07-29 %% Type: language @@ -21818,7 +22231,7 @@ Added: 2009-07-29 %% Type: language Subtag: mhn -Description: Mócheno +Description: Mócheno Added: 2009-07-29 %% Type: language @@ -21886,7 +22299,7 @@ Added: 2009-07-29 %% Type: language Subtag: mib -Description: Atatláhuca Mixtec +Description: Atatláhuca Mixtec Added: 2009-07-29 %% Type: language @@ -21922,7 +22335,7 @@ Added: 2009-07-29 %% Type: language Subtag: mii -Description: Chigmecatitlán Mixtec +Description: Chigmecatitlán Mixtec Added: 2009-07-29 %% Type: language @@ -21938,7 +22351,7 @@ Added: 2009-07-29 %% Type: language Subtag: mil -Description: Peñoles Mixtec +Description: Peñoles Mixtec Added: 2009-07-29 %% Type: language @@ -21964,7 +22377,7 @@ Added: 2009-07-29 %% Type: language Subtag: miq -Description: Mískito +Description: Mískito Added: 2009-07-29 %% Type: language @@ -22393,7 +22806,7 @@ Added: 2009-07-29 %% Type: language Subtag: mmc -Description: Michoacán Mazahua +Description: Michoacán Mazahua Added: 2009-07-29 %% Type: language @@ -22418,7 +22831,7 @@ Added: 2009-07-29 %% Type: language Subtag: mmh -Description: Mehináku +Description: Mehináku Added: 2009-07-29 %% Type: language @@ -22524,7 +22937,7 @@ Added: 2005-10-16 %% Type: language Subtag: mnd -Description: Mondé +Description: Mondé Added: 2009-07-29 %% Type: language @@ -22649,7 +23062,7 @@ Added: 2009-07-29 %% Type: language Subtag: moc -Description: Mocoví +Description: Mocoví Added: 2009-07-29 %% Type: language @@ -22659,6 +23072,7 @@ Added: 2009-07-29 %% Type: language Subtag: moe +Description: Innu Description: Montagnais Added: 2009-07-29 %% @@ -22706,7 +23120,7 @@ Added: 2009-07-29 %% Type: language Subtag: mop -Description: Mopán Maya +Description: Mopán Maya Added: 2009-07-29 %% Type: language @@ -22726,7 +23140,7 @@ Added: 2005-10-16 %% Type: language Subtag: mot -Description: Barí +Description: Barí Added: 2009-07-29 %% Type: language @@ -22767,12 +23181,13 @@ Added: 2009-07-29 %% Type: language Subtag: mpb +Description: Malak Malak Description: Mullukmulluk Added: 2009-07-29 %% Type: language Subtag: mpc -Description: Mangarayi +Description: Mangarrayi Added: 2009-07-29 %% Type: language @@ -22803,6 +23218,7 @@ Added: 2009-07-29 Type: language Subtag: mpj Description: Martu Wangka +Description: Wangkajunga Added: 2009-07-29 %% Type: language @@ -22817,7 +23233,7 @@ Added: 2009-07-29 %% Type: language Subtag: mpm -Description: Yosondúa Mixtec +Description: Yosondúa Mixtec Added: 2009-07-29 %% Type: language @@ -22837,7 +23253,7 @@ Added: 2009-07-29 %% Type: language Subtag: mpq -Description: Matís +Description: Matís Added: 2009-07-29 %% Type: language @@ -22857,7 +23273,7 @@ Added: 2009-07-29 %% Type: language Subtag: mpu -Description: Makuráp +Description: Makuráp Added: 2009-07-29 %% Type: language @@ -23205,7 +23621,7 @@ Added: 2009-07-29 %% Type: language Subtag: msn -Description: Vurës +Description: Vurës Added: 2009-07-29 %% Type: language @@ -23215,7 +23631,7 @@ Added: 2009-07-29 %% Type: language Subtag: msp -Description: Maritsauá +Description: Maritsauá Added: 2009-07-29 %% Type: language @@ -23347,7 +23763,7 @@ Added: 2009-07-29 %% Type: language Subtag: mtp -Description: Wichí Lhamtés Nocten +Description: Wichí Lhamtés Nocten Added: 2009-07-29 %% Type: language @@ -23388,7 +23804,7 @@ Added: 2009-07-29 %% Type: language Subtag: mtx -Description: Tidaá Mixtec +Description: Tidaá Mixtec Added: 2009-07-29 %% Type: language @@ -23428,7 +23844,7 @@ Added: 2009-07-29 %% Type: language Subtag: muh -Description: Mündü +Description: Mündü Added: 2009-07-29 %% Type: language @@ -23550,7 +23966,7 @@ Macrolanguage: mn %% Type: language Subtag: mvg -Description: Yucuañe Mixtec +Description: Yucuañe Mixtec Added: 2009-07-29 %% Type: language @@ -23577,6 +23993,8 @@ Type: language Subtag: mvm Description: Muya Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see emq, wmg %% Type: language Subtag: mvn @@ -23731,7 +24149,7 @@ Added: 2009-07-29 %% Type: language Subtag: mwq -Description: Mün Chin +Description: Mün Chin Added: 2009-07-29 %% Type: language @@ -23770,11 +24188,13 @@ Type: language Subtag: mwx Description: Mediak Added: 2009-07-29 +Deprecated: 2018-03-08 %% Type: language Subtag: mwy Description: Mosiro Added: 2009-07-29 +Deprecated: 2018-03-08 %% Type: language Subtag: mwz @@ -23788,7 +24208,7 @@ Added: 2009-07-29 %% Type: language Subtag: mxb -Description: Tezoatlán Mixtec +Description: Tezoatlán Mixtec Added: 2009-07-29 %% Type: language @@ -23889,7 +24309,7 @@ Added: 2009-07-29 %% Type: language Subtag: mxv -Description: Metlatónoc Mixtec +Description: Metlatónoc Mixtec Added: 2009-07-29 %% Type: language @@ -23905,7 +24325,7 @@ Added: 2009-07-29 %% Type: language Subtag: mxy -Description: Southeastern Nochixtlán Mixtec +Description: Southeastern Nochixtlán Mixtec Added: 2009-07-29 %% Type: language @@ -23927,6 +24347,8 @@ Type: language Subtag: myd Description: Maramba Added: 2009-07-29 +Deprecated: 2019-04-16 +Preferred-Value: aog %% Type: language Subtag: mye @@ -23952,6 +24374,7 @@ Type: language Subtag: myi Description: Mina (India) Added: 2009-07-29 +Deprecated: 2019-04-16 %% Type: language Subtag: myj @@ -23986,7 +24409,7 @@ Added: 2009-07-29 %% Type: language Subtag: myp -Description: Pirahã +Description: Pirahã Added: 2009-07-29 %% Type: language @@ -24015,7 +24438,7 @@ Preferred-Value: mry %% Type: language Subtag: myu -Description: Mundurukú +Description: Mundurukú Added: 2009-07-29 %% Type: language @@ -24045,7 +24468,7 @@ Added: 2009-07-29 %% Type: language Subtag: mza -Description: Santa María Zacatepec Mixtec +Description: Santa María Zacatepec Mixtec Added: 2009-07-29 %% Type: language @@ -24075,12 +24498,12 @@ Added: 2009-07-29 %% Type: language Subtag: mzh -Description: Wichí Lhamtés Güisnay +Description: Wichí Lhamtés Güisnay Added: 2009-07-29 %% Type: language Subtag: mzi -Description: Ixcatlán Mazatec +Description: Ixcatlán Mazatec Added: 2009-07-29 %% Type: language @@ -24095,7 +24518,7 @@ Added: 2009-07-29 %% Type: language Subtag: mzl -Description: Mazatlán Mixe +Description: Mazatlán Mixe Added: 2009-07-29 %% Type: language @@ -24125,7 +24548,7 @@ Added: 2009-07-29 %% Type: language Subtag: mzr -Description: Marúbo +Description: Marúbo Added: 2009-07-29 %% Type: language @@ -24175,7 +24598,7 @@ Added: 2009-07-29 %% Type: language Subtag: nab -Description: Southern Nambikuára +Description: Southern Nambikuára Added: 2009-07-29 %% Type: language @@ -24271,7 +24694,7 @@ Added: 2009-07-29 %% Type: language Subtag: nat -Description: Ca_hungwa_rya_ +Description: Ca̱hungwa̱rya̱ Description: Hungworo Added: 2009-07-29 %% @@ -24287,7 +24710,7 @@ Added: 2009-07-29 %% Type: language Subtag: nay -Description: Narrinyeri +Description: Ngarrindjeri Added: 2009-07-29 %% Type: language @@ -24344,7 +24767,7 @@ Added: 2009-07-29 %% Type: language Subtag: nbj -Description: Ngarinman +Description: Ngarinyman Added: 2009-07-29 %% Type: language @@ -24379,7 +24802,7 @@ Added: 2009-07-29 %% Type: language Subtag: nbr -Description: Numana-Nunku-Gbantu-Numbu +Description: Numana Added: 2009-07-29 %% Type: language @@ -24471,12 +24894,12 @@ Added: 2009-07-29 %% Type: language Subtag: nck -Description: Nakara +Description: Na-kara Added: 2009-07-29 %% Type: language Subtag: ncl -Description: Michoacán Nahuatl +Description: Michoacán Nahuatl Added: 2009-07-29 %% Type: language @@ -24498,6 +24921,13 @@ Type: language Subtag: ncp Description: Ndaktup Added: 2009-07-29 +Deprecated: 2018-03-08 +Preferred-Value: kdz +%% +Type: language +Subtag: ncq +Description: Northern Katang +Added: 2017-02-23 %% Type: language Subtag: ncr @@ -24658,7 +25088,7 @@ Added: 2009-07-29 %% Type: language Subtag: neb -Description: Toura (Côte d'Ivoire) +Description: Toura (Côte d'Ivoire) Added: 2009-07-29 %% Type: language @@ -24673,7 +25103,7 @@ Added: 2009-07-29 %% Type: language Subtag: nee -Description: Nêlêmwa-Nixumwak +Description: Nêlêmwa-Nixumwak Added: 2009-07-29 %% Type: language @@ -24718,7 +25148,7 @@ Added: 2009-07-29 %% Type: language Subtag: neo -Description: Ná-Meo +Description: Ná-Meo Added: 2009-07-29 %% Type: language @@ -24785,7 +25215,7 @@ Added: 2009-07-29 Type: language Subtag: nfl Description: Ayiwo -Description: Äiwoo +Description: Äiwoo Added: 2009-07-29 %% Type: language @@ -24836,8 +25266,7 @@ Added: 2009-07-29 %% Type: language Subtag: ngh -Description: N/u -Description: N|u +Description: NÇng Added: 2009-07-29 %% Type: language @@ -24874,6 +25303,8 @@ Type: language Subtag: ngo Description: Ngoni Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see xnj, xnq %% Type: language Subtag: ngp @@ -24898,6 +25329,7 @@ Added: 2009-07-29 %% Type: language Subtag: ngt +Description: Kriang Description: Ngeq Added: 2009-07-29 %% @@ -24948,8 +25380,8 @@ Added: 2009-07-29 %% Type: language Subtag: nhd -Description: Chiripá -Description: Ava Guaraní +Description: Chiripá +Description: Ava Guaraní Added: 2009-07-29 Macrolanguage: gn %% @@ -24975,7 +25407,7 @@ Added: 2009-07-29 %% Type: language Subtag: nhi -Description: Zacatlán-Ahuacatlán-Tepetzintla Nahuatl +Description: Zacatlán-Ahuacatlán-Tepetzintla Nahuatl Added: 2009-07-29 %% Type: language @@ -25045,7 +25477,7 @@ Added: 2009-07-29 %% Type: language Subtag: nhz -Description: Santa María La Alta Nahuatl +Description: Santa María La Alta Nahuatl Added: 2009-07-29 %% Type: language @@ -25081,7 +25513,7 @@ Added: 2009-07-29 %% Type: language Subtag: nig -Description: Ngalakan +Description: Ngalakgan Added: 2009-07-29 %% Type: language @@ -25423,6 +25855,11 @@ Description: Nihali Added: 2009-07-29 %% Type: language +Subtag: nlm +Description: Mankiyali +Added: 2018-03-08 +%% +Type: language Subtag: nln Description: Durango Nahuatl Added: 2009-07-29 @@ -25473,7 +25910,7 @@ Added: 2009-07-29 %% Type: language Subtag: nlz -Description: Nalögo +Description: Nalögo Added: 2009-07-29 %% Type: language @@ -25484,7 +25921,7 @@ Added: 2009-07-29 Type: language Subtag: nmb Description: Big Nambas -Description: V'ënen Taut +Description: V'ënen Taut Added: 2009-07-29 %% Type: language @@ -25545,8 +25982,7 @@ Added: 2009-07-29 %% Type: language Subtag: nmn -Description: !Xóõ -Description: !Xóõ +Description: ǃXóõ Added: 2009-07-29 %% Type: language @@ -25699,6 +26135,8 @@ Type: language Subtag: nns Description: Ningye Added: 2009-07-29 +Deprecated: 2019-04-16 +Preferred-Value: nbr %% Type: language Subtag: nnt @@ -25794,8 +26232,10 @@ Added: 2013-09-10 %% Type: language Subtag: nom -Description: Nocamán +Description: Nocamán Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: cbr %% Type: language Subtag: non @@ -25906,6 +26346,11 @@ Description: Puimei Naga Added: 2009-07-29 %% Type: language +Subtag: npx +Description: Noipx +Added: 2017-02-23 +%% +Type: language Subtag: npy Description: Napu Added: 2009-07-29 @@ -25921,6 +26366,11 @@ Description: Kura Ede Nago Added: 2009-07-29 %% Type: language +Subtag: nql +Description: Ngendelengo +Added: 2017-02-23 +%% +Type: language Subtag: nqm Description: Ndom Added: 2009-07-29 @@ -25933,7 +26383,7 @@ Added: 2009-07-29 Type: language Subtag: nqo Description: N'Ko -Description: N’Ko +Description: N’Ko Added: 2006-06-05 Suppress-Script: Nkoo %% @@ -25943,6 +26393,11 @@ Description: Kyan-Karyaw Naga Added: 2013-09-10 %% Type: language +Subtag: nqt +Description: Nteng +Added: 2021-02-20 +%% +Type: language Subtag: nqy Description: Akyaung Ari Naga Added: 2012-08-12 @@ -25969,8 +26424,9 @@ Added: 2009-07-29 %% Type: language Subtag: nrf -Description: Jèrriais -Description: Guernésiais +Description: Jèrriais +Description: Guernésiais +Description: Sercquiais Added: 2015-02-12 %% Type: language @@ -26040,6 +26496,11 @@ Description: Sangtam Naga Added: 2009-07-29 %% Type: language +Subtag: nsb +Description: Lower Nossob +Added: 2020-03-28 +%% +Type: language Subtag: nsc Description: Nshi Added: 2009-07-29 @@ -26216,7 +26677,7 @@ Preferred-Value: pij %% Type: language Subtag: ntu -Description: Natügu +Description: Natügu Added: 2009-07-29 %% Type: language @@ -26314,7 +26775,7 @@ Added: 2009-07-29 %% Type: language Subtag: nuo -Description: Nguôn +Description: Nguôn Added: 2009-07-29 %% Type: language @@ -26435,6 +26896,11 @@ Description: Nawaru Added: 2009-07-29 %% Type: language +Subtag: nww +Description: Ndwewe +Added: 2022-02-25 +%% +Type: language Subtag: nwx Description: Middle Newar Added: 2009-07-29 @@ -26508,6 +26974,8 @@ Type: language Subtag: nxu Description: Narau Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: bpp %% Type: language Subtag: nxx @@ -26549,7 +27017,7 @@ Added: 2009-07-29 %% Type: language Subtag: nyh -Description: Nyigina +Description: Nyikina Added: 2009-07-29 %% Type: language @@ -26604,7 +27072,7 @@ Added: 2009-07-29 %% Type: language Subtag: nys -Description: Nyunga +Description: Nyungar Added: 2009-07-29 %% Type: language @@ -26648,6 +27116,11 @@ Description: Njebi Added: 2009-07-29 %% Type: language +Subtag: nzd +Description: Nzadi +Added: 2018-03-08 +%% +Type: language Subtag: nzi Description: Nzima Added: 2005-10-16 @@ -26663,6 +27136,11 @@ Description: Zeme Naga Added: 2009-07-29 %% Type: language +Subtag: nzr +Description: Dir-Nyamzak-Mbarimi +Added: 2023-03-17 +%% +Type: language Subtag: nzs Description: New Zealand Sign Language Added: 2009-07-29 @@ -26705,7 +27183,7 @@ Added: 2009-07-29 %% Type: language Subtag: obi -Description: Obispeño +Description: Obispeño Added: 2009-07-29 %% Type: language @@ -26755,6 +27233,11 @@ Description: Old Chinese Added: 2009-07-29 %% Type: language +Subtag: ocm +Description: Old Cham +Added: 2021-02-20 +%% +Type: language Subtag: oco Description: Old Cornish Added: 2009-07-29 @@ -26845,6 +27328,11 @@ Description: Oirata Added: 2009-07-29 %% Type: language +Subtag: oie +Description: Okolie +Added: 2022-02-25 +%% +Type: language Subtag: oin Description: Inebu One Added: 2009-07-29 @@ -26900,6 +27388,11 @@ Description: Okobo Added: 2009-07-29 %% Type: language +Subtag: okc +Description: Kobo +Added: 2021-02-20 +%% +Type: language Subtag: okd Description: Okodia Added: 2009-07-29 @@ -26981,6 +27474,11 @@ Description: Okpe (Northwestern Edo) Added: 2009-07-29 %% Type: language +Subtag: okz +Description: Old Khmer +Added: 2021-02-20 +%% +Type: language Subtag: ola Description: Walungge Added: 2009-07-29 @@ -27119,6 +27617,11 @@ Description: Old Mon Added: 2009-07-29 %% Type: language +Subtag: omy +Description: Old Malay +Added: 2021-02-20 +%% +Type: language Subtag: ona Description: Ona Added: 2009-07-29 @@ -27210,7 +27713,7 @@ Added: 2009-07-29 %% Type: language Subtag: oon -Description: Önge +Description: Önge Added: 2009-07-29 %% Type: language @@ -27250,7 +27753,7 @@ Added: 2009-07-29 %% Type: language Subtag: opy -Description: Ofayé +Description: Ofayé Added: 2009-07-29 %% Type: language @@ -27266,7 +27769,7 @@ Macrolanguage: om %% Type: language Subtag: ore -Description: Orejón +Description: Orejón Added: 2009-07-29 %% Type: language @@ -27354,6 +27857,11 @@ Description: Osing Added: 2009-07-29 %% Type: language +Subtag: osn +Description: Old Sundanese +Added: 2021-02-20 +%% +Type: language Subtag: oso Description: Ososo Added: 2009-07-29 @@ -27431,7 +27939,7 @@ Scope: collection %% Type: language Subtag: otq -Description: Querétaro Otomi +Description: Querétaro Otomi Added: 2009-07-29 %% Type: language @@ -27441,7 +27949,7 @@ Added: 2009-07-29 %% Type: language Subtag: ots -Description: Estado de México Otomi +Description: Estado de México Otomi Added: 2009-07-29 %% Type: language @@ -27502,15 +28010,15 @@ Added: 2009-07-29 %% Type: language Subtag: oun -Description: !O!ung +Description: ǃOǃung Added: 2009-07-29 Deprecated: 2015-02-12 Preferred-Value: vaj %% Type: language Subtag: ovd -Description: Övdalian Description: Elfdalian +Description: Övdalian Added: 2016-06-16 %% Type: language @@ -27556,7 +28064,7 @@ Scope: collection %% Type: language Subtag: pab -Description: Parecís +Description: Parecís Added: 2009-07-29 %% Type: language @@ -27566,7 +28074,7 @@ Added: 2009-07-29 %% Type: language Subtag: pad -Description: Paumarí +Description: Paumarí Added: 2009-07-29 %% Type: language @@ -27576,7 +28084,7 @@ Added: 2009-07-29 %% Type: language Subtag: paf -Description: Paranawát +Description: Paranawát Added: 2009-07-29 %% Type: language @@ -27596,7 +28104,7 @@ Added: 2009-07-29 %% Type: language Subtag: pak -Description: Parakanã +Description: Parakanã Added: 2009-07-29 %% Type: language @@ -27640,6 +28148,8 @@ Type: language Subtag: pat Description: Papitalai Added: 2009-07-29 +Deprecated: 2021-02-20 +Preferred-Value: kxr %% Type: language Subtag: pau @@ -27648,7 +28158,7 @@ Added: 2005-10-16 %% Type: language Subtag: pav -Description: Pakaásnovos +Description: Pakaásnovos Added: 2009-07-29 %% Type: language @@ -27658,7 +28168,7 @@ Added: 2009-07-29 %% Type: language Subtag: pax -Description: Pankararé +Description: Pankararé Added: 2009-07-29 %% Type: language @@ -27668,12 +28178,12 @@ Added: 2009-07-29 %% Type: language Subtag: paz -Description: Pankararú +Description: Pankararú Added: 2009-07-29 %% Type: language Subtag: pbb -Description: Páez +Description: Páez Added: 2009-07-29 %% Type: language @@ -27698,7 +28208,7 @@ Added: 2009-07-29 %% Type: language Subtag: pbh -Description: E'ñapa Woromaipu +Description: E'ñapa Woromaipu Added: 2009-07-29 %% Type: language @@ -27712,6 +28222,12 @@ Description: Mak (Nigeria) Added: 2009-07-29 %% Type: language +Subtag: pbm +Description: Puebla Mazatec +Added: 2018-03-08 +Comments: see also maa +%% +Type: language Subtag: pbn Description: Kpasam Added: 2009-07-29 @@ -27766,7 +28282,7 @@ Deprecated: 2012-08-12 %% Type: language Subtag: pca -Description: Santa Inés Ahuatempan Popoloca +Description: Santa Inés Ahuatempan Popoloca Added: 2009-07-29 %% Type: language @@ -27971,7 +28487,7 @@ Macrolanguage: fa %% Type: language Subtag: pev -Description: Pémono +Description: Pémono Added: 2009-07-29 %% Type: language @@ -27991,12 +28507,12 @@ Added: 2009-07-29 %% Type: language Subtag: pfa -Description: Pááfang +Description: Pááfang Added: 2009-07-29 %% Type: language Subtag: pfe -Description: Peere +Description: Pere Added: 2009-07-29 %% Type: language @@ -28012,7 +28528,7 @@ Macrolanguage: ar %% Type: language Subtag: pgd -Description: Gandhari +Description: GÄndhÄrÄ« Added: 2015-02-12 %% Type: language @@ -28088,6 +28604,11 @@ Added: 2005-10-16 Scope: collection %% Type: language +Subtag: phj +Description: Pahari +Added: 2022-02-25 +%% +Type: language Subtag: phk Description: Phake Added: 2009-07-29 @@ -28188,6 +28709,7 @@ Type: language Subtag: pii Description: Pini Added: 2009-07-29 +Deprecated: 2022-02-25 %% Type: language Subtag: pij @@ -28272,7 +28794,7 @@ Added: 2009-07-29 %% Type: language Subtag: pka -Description: Ardhamagadhi Prakrit +Description: ArdhamÄgadhÄ« PrÄkrit Added: 2009-07-29 %% Type: language @@ -28303,7 +28825,7 @@ Added: 2009-07-29 %% Type: language Subtag: pko -Description: Pökoot +Description: Pökoot Added: 2009-07-29 Macrolanguage: kln %% @@ -28365,7 +28887,7 @@ Scope: collection %% Type: language Subtag: plg -Description: Pilagá +Description: Pilagá Added: 2009-07-29 %% Type: language @@ -28377,6 +28899,8 @@ Type: language Subtag: plj Description: Polci Added: 2009-07-29 +Deprecated: 2023-03-17 +Comments: see nzr, pze, uly, zlu %% Type: language Subtag: plk @@ -28402,6 +28926,7 @@ Type: language Subtag: plp Description: Palpa Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: plq @@ -28427,7 +28952,7 @@ Macrolanguage: mg %% Type: language Subtag: plu -Description: Palikúr +Description: Palikúr Added: 2009-07-29 %% Type: language @@ -28484,7 +29009,7 @@ Added: 2009-07-29 %% Type: language Subtag: pmh -Description: Mahara??ri Prakrit +Description: MÄhÄrÄṣṭri PrÄkrit Added: 2009-07-29 %% Type: language @@ -28501,6 +29026,8 @@ Type: language Subtag: pmk Description: Pamlico Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: crr %% Type: language Subtag: pml @@ -28587,12 +29114,18 @@ Description: Pannei Added: 2009-07-29 %% Type: language +Subtag: pnd +Description: Mpinda +Added: 2019-04-16 +%% +Type: language Subtag: pne Description: Western Penan Added: 2009-07-29 %% Type: language Subtag: png +Description: Pangu Description: Pongu Added: 2009-07-29 %% @@ -28674,6 +29207,7 @@ Added: 2009-07-29 %% Type: language Subtag: pnw +Description: Banyjima Description: Panytyima Added: 2009-07-29 %% @@ -28717,7 +29251,7 @@ Added: 2009-07-29 %% Type: language Subtag: pog -Description: Potiguára +Description: Potiguára Added: 2009-07-29 %% Type: language @@ -28732,7 +29266,7 @@ Added: 2009-07-29 %% Type: language Subtag: pok -Description: Pokangá +Description: Pokangá Added: 2009-07-29 %% Type: language @@ -28752,7 +29286,7 @@ Added: 2009-07-29 %% Type: language Subtag: pop -Description: Pwapwâ +Description: Pwapwâ Added: 2009-07-29 %% Type: language @@ -28858,7 +29392,7 @@ Preferred-Value: lcq %% Type: language Subtag: pps -Description: San Luís Temalacayuca Popoloca +Description: San Luís Temalacayuca Popoloca Added: 2009-07-29 %% Type: language @@ -28903,6 +29437,7 @@ Type: language Subtag: prb Description: Lua' Added: 2009-07-29 +Deprecated: 2017-02-23 %% Type: language Subtag: prc @@ -28936,7 +29471,7 @@ Added: 2009-07-29 %% Type: language Subtag: pri -Description: Paicî +Description: Paicî Added: 2009-07-29 %% Type: language @@ -28961,7 +29496,7 @@ Added: 2009-07-29 %% Type: language Subtag: pro -Description: Old Provençal (to 1500) +Description: Old Provençal (to 1500) Description: Old Occitan (to 1500) Added: 2005-10-16 %% @@ -28969,10 +29504,12 @@ Type: language Subtag: prp Description: Parsi Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: gu %% Type: language Subtag: prq -Description: Ashéninka Perené +Description: Ashéninka Perené Added: 2009-07-29 %% Type: language @@ -29026,6 +29563,7 @@ Added: 2009-07-29 %% Type: language Subtag: psc +Description: Iranian Sign Language Description: Persian Sign Language Added: 2009-07-29 %% @@ -29105,7 +29643,7 @@ Macrolanguage: ps %% Type: language Subtag: psu -Description: Sauraseni Prakrit +Description: Sauraseni PrÄkrit Added: 2009-07-29 %% Type: language @@ -29125,12 +29663,13 @@ Added: 2009-07-29 %% Type: language Subtag: pth -Description: Pataxó Hã-Ha-Hãe +Description: Pataxó Hã-Ha-Hãe Added: 2009-07-29 %% Type: language Subtag: pti -Description: Pintiini +Description: Pindiini +Description: Wangkatha Added: 2009-07-29 %% Type: language @@ -29140,7 +29679,7 @@ Added: 2009-07-29 %% Type: language Subtag: pto -Description: Zo'é +Description: Zo'é Added: 2009-07-29 %% Type: language @@ -29232,6 +29771,7 @@ Type: language Subtag: puk Description: Pu Ko Added: 2009-07-29 +Deprecated: 2017-02-23 %% Type: language Subtag: pum @@ -29255,7 +29795,7 @@ Added: 2009-07-29 %% Type: language Subtag: pur -Description: Puruborá +Description: Puruborá Added: 2009-07-29 %% Type: language @@ -29280,7 +29820,7 @@ Added: 2009-07-29 %% Type: language Subtag: puy -Description: Purisimeño +Description: Purisimeño Added: 2009-07-29 %% Type: language @@ -29352,13 +29892,13 @@ Added: 2009-07-29 %% Type: language Subtag: pyn -Description: Poyanáwa +Description: Poyanáwa Added: 2009-07-29 %% Type: language Subtag: pys Description: Paraguayan Sign Language -Description: Lengua de Señas del Paraguay +Description: Lengua de Señas del Paraguay Added: 2010-03-11 %% Type: language @@ -29377,7 +29917,18 @@ Description: Pyen Added: 2009-07-29 %% Type: language +Subtag: pze +Description: Pesse +Added: 2023-03-17 +%% +Type: language +Subtag: pzh +Description: Pazeh +Added: 2022-02-25 +%% +Type: language Subtag: pzn +Description: Jejara Naga Description: Para Naga Added: 2009-07-29 %% @@ -29394,19 +29945,19 @@ Added: 2009-07-29 %% Type: language Subtag: qub -Description: Huallaga Huánuco Quechua +Description: Huallaga Huánuco Quechua Added: 2009-07-29 Macrolanguage: qu %% Type: language Subtag: quc Description: K'iche' -Description: Quiché +Description: Quiché Added: 2009-07-29 %% Type: language Subtag: qud -Description: Calderón Highland Quichua +Description: Calderón Highland Quichua Added: 2009-07-29 Macrolanguage: qu %% @@ -29521,13 +30072,13 @@ Macrolanguage: qu %% Type: language Subtag: qve -Description: Eastern Apurímac Quechua +Description: Eastern Apurímac Quechua Added: 2009-07-29 Macrolanguage: qu %% Type: language Subtag: qvh -Description: Huamalíes-Dos de Mayo Huánuco Quechua +Description: Huamalíes-Dos de Mayo Huánuco Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29557,7 +30108,7 @@ Macrolanguage: qu %% Type: language Subtag: qvn -Description: North Junín Quechua +Description: North Junín Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29575,7 +30126,7 @@ Macrolanguage: qu %% Type: language Subtag: qvs -Description: San Martín Quechua +Description: San Martín Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29638,7 +30189,7 @@ Added: 2009-07-29 %% Type: language Subtag: qxa -Description: Chiquián Ancash Quechua +Description: Chiquián Ancash Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29650,7 +30201,7 @@ Macrolanguage: qu %% Type: language Subtag: qxh -Description: Panao Huánuco Quechua +Description: Panao Huánuco Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29685,7 +30236,7 @@ Added: 2009-07-29 %% Type: language Subtag: qxr -Description: Cañar Highland Quichua +Description: Cañar Highland Quichua Added: 2009-07-29 Macrolanguage: qu %% @@ -29702,7 +30253,7 @@ Macrolanguage: qu %% Type: language Subtag: qxu -Description: Arequipa-La Unión Quechua +Description: Arequipa-La Unión Quechua Added: 2009-07-29 Macrolanguage: qu %% @@ -29875,7 +30426,7 @@ Added: 2012-08-12 %% Type: language Subtag: rcf -Description: Réunion Creole French +Description: Réunion Creole French Added: 2009-07-29 %% Type: language @@ -29970,7 +30521,7 @@ Added: 2009-07-29 %% Type: language Subtag: rgr -Description: Resígaro +Description: Resígaro Added: 2009-07-29 %% Type: language @@ -29999,9 +30550,15 @@ Description: Riang (India) Added: 2009-07-29 %% Type: language +Subtag: rib +Description: Bribri Sign Language +Added: 2022-02-25 +%% +Type: language Subtag: rie Description: Rien Added: 2009-07-29 +Deprecated: 2017-02-23 %% Type: language Subtag: rif @@ -30010,6 +30567,7 @@ Added: 2009-07-29 %% Type: language Subtag: ril +Description: Riang Lang Description: Riang (Myanmar) Added: 2009-07-29 %% @@ -30030,7 +30588,7 @@ Added: 2009-07-29 %% Type: language Subtag: rit -Description: Ritarungo +Description: Ritharrngu Added: 2009-07-29 %% Type: language @@ -30096,7 +30654,7 @@ Added: 2009-07-29 %% Type: language Subtag: rmb -Description: Rembarunga +Description: Rembarrnga Added: 2009-07-29 %% Type: language @@ -30171,12 +30729,12 @@ Added: 2009-07-29 %% Type: language Subtag: rmq -Description: Caló +Description: Caló Added: 2010-03-11 %% Type: language Subtag: rmr -Description: Caló +Description: Caló Added: 2009-07-29 Deprecated: 2010-03-11 Comments: see emx, rmq @@ -30230,6 +30788,11 @@ Added: 2009-07-29 Deprecated: 2016-05-30 %% Type: language +Subtag: rnb +Description: Brunca Sign Language +Added: 2022-02-25 +%% +Type: language Subtag: rnd Description: Ruund Added: 2009-07-29 @@ -30370,6 +30933,13 @@ Type: language Subtag: rsi Description: Rennellese Sign Language Added: 2009-07-29 +Deprecated: 2017-02-23 +%% +Type: language +Subtag: rsk +Description: Ruthenian +Description: Rusnak +Added: 2022-02-25 %% Type: language Subtag: rsl @@ -30382,6 +30952,16 @@ Description: Miriwoong Sign Language Added: 2016-05-30 %% Type: language +Subtag: rsn +Description: Rwandan Sign Language +Added: 2022-02-25 +%% +Type: language +Subtag: rsw +Description: Rishiwa +Added: 2023-03-17 +%% +Type: language Subtag: rtc Description: Rungtu Chin Added: 2012-08-12 @@ -30494,6 +31074,11 @@ Description: Rwa Added: 2009-07-29 %% Type: language +Subtag: rwl +Description: Ruwila +Added: 2021-02-20 +%% +Type: language Subtag: rwm Description: Amba (Uganda) Added: 2009-07-29 @@ -30517,6 +31102,7 @@ Added: 2013-09-10 Type: language Subtag: rxw Description: Karuwali +Description: Garuwali Added: 2013-09-10 %% Type: language @@ -30536,7 +31122,7 @@ Added: 2009-07-29 %% Type: language Subtag: rzh -Description: Razi?i +Description: RÄziḥī Added: 2016-05-30 %% Type: language @@ -30561,7 +31147,7 @@ Added: 2005-10-16 %% Type: language Subtag: sae -Description: Sabanê +Description: Sabanê Added: 2009-07-29 %% Type: language @@ -30608,7 +31194,7 @@ Added: 2009-07-29 %% Type: language Subtag: sap -Description: Sanapaná +Description: Sanapaná Added: 2009-07-29 Deprecated: 2014-02-28 Comments: see aqt, spn @@ -30736,7 +31322,7 @@ Added: 2009-07-29 %% Type: language Subtag: sbo -Description: Sabüm +Description: Sabüm Added: 2009-07-29 %% Type: language @@ -30853,6 +31439,7 @@ Added: 2005-10-16 %% Type: language Subtag: scp +Description: Hyolmo Description: Helambu Sherpa Added: 2009-07-29 %% @@ -30868,6 +31455,11 @@ Added: 2009-07-29 Macrolanguage: den %% Type: language +Subtag: sct +Description: Southern Katang +Added: 2017-02-23 +%% +Type: language Subtag: scu Description: Shumcho Added: 2009-07-29 @@ -30943,6 +31535,8 @@ Type: language Subtag: sdm Description: Semandang Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see ebc, gef, sdq %% Type: language Subtag: sdn @@ -30961,6 +31555,11 @@ Description: Sherdukpen Added: 2009-07-29 %% Type: language +Subtag: sdq +Description: Semandang +Added: 2020-03-28 +%% +Type: language Subtag: sdr Description: Oraon Sadri Added: 2009-07-29 @@ -31064,7 +31663,7 @@ Scope: collection %% Type: language Subtag: sen -Description: Nanerigé Sénoufo +Description: Nanerigé Sénoufo Added: 2009-07-29 %% Type: language @@ -31074,12 +31673,12 @@ Added: 2009-07-29 %% Type: language Subtag: sep -Description: Sìcìté Sénoufo +Description: Sìcìté Sénoufo Added: 2009-07-29 %% Type: language Subtag: seq -Description: Senara Sénoufo +Description: Senara Sénoufo Added: 2009-07-29 %% Type: language @@ -31428,7 +32027,7 @@ Added: 2009-07-29 Type: language Subtag: sih Description: Zire -Description: Sîshëë +Description: Sîshëë Added: 2009-07-29 %% Type: language @@ -31626,7 +32225,7 @@ Added: 2009-07-29 %% Type: language Subtag: skf -Description: Sakirabiá +Description: Sakirabiá Added: 2009-07-29 %% Type: language @@ -31654,6 +32253,8 @@ Type: language Subtag: skk Description: Sok Added: 2009-07-29 +Deprecated: 2017-02-23 +Preferred-Value: oyb %% Type: language Subtag: skm @@ -31735,7 +32336,7 @@ Scope: collection %% Type: language Subtag: slc -Description: Sáliba +Description: Sáliba Added: 2009-07-29 %% Type: language @@ -31770,7 +32371,7 @@ Added: 2009-07-29 %% Type: language Subtag: slj -Description: Salumá +Description: Salumá Added: 2009-07-29 %% Type: language @@ -31797,6 +32398,7 @@ Type: language Subtag: slq Description: Salchuq Added: 2009-07-29 +Deprecated: 2023-03-17 %% Type: language Subtag: slr @@ -31857,6 +32459,8 @@ Type: language Subtag: smd Description: Sama Added: 2009-07-29 +Deprecated: 2022-02-25 +Preferred-Value: kmb %% Type: language Subtag: smf @@ -31963,6 +32567,8 @@ Type: language Subtag: snb Description: Sebuyau Added: 2009-07-29 +Deprecated: 2022-02-25 +Preferred-Value: iba %% Type: language Subtag: snc @@ -31988,6 +32594,7 @@ Type: language Subtag: snh Description: Shinabo Added: 2009-07-29 +Deprecated: 2017-02-23 %% Type: language Subtag: sni @@ -32073,7 +32680,7 @@ Added: 2009-07-29 %% Type: language Subtag: snz -Description: Sinsauru +Description: Kou Added: 2009-07-29 %% Type: language @@ -32199,7 +32806,7 @@ Added: 2009-07-29 %% Type: language Subtag: spc -Description: Sapé +Description: Sapé Added: 2009-07-29 %% Type: language @@ -32239,7 +32846,7 @@ Added: 2009-07-29 %% Type: language Subtag: spn -Description: Sanapaná +Description: Sanapaná Added: 2014-02-28 %% Type: language @@ -32357,6 +32964,11 @@ Description: Squamish Added: 2009-07-29 %% Type: language +Subtag: sqx +Description: Kufr Qassem Sign Language (KQSL) +Added: 2021-02-20 +%% +Type: language Subtag: sra Description: Saruga Added: 2009-07-29 @@ -32425,7 +33037,7 @@ Macrolanguage: sc %% Type: language Subtag: srq -Description: Sirionó +Description: Sirionó Added: 2009-07-29 %% Type: language @@ -32445,7 +33057,7 @@ Added: 2009-07-29 %% Type: language Subtag: sru -Description: Suruí +Description: Suruí Added: 2009-07-29 %% Type: language @@ -32568,7 +33180,7 @@ Added: 2009-07-29 %% Type: language Subtag: sss -Description: Sô +Description: Sô Added: 2009-07-29 %% Type: language @@ -32750,6 +33362,7 @@ Type: language Subtag: suj Description: Shubi Added: 2009-07-29 +Comments: see also xsj %% Type: language Subtag: suk @@ -32771,7 +33384,13 @@ Deprecated: 2010-03-11 Comments: see ulw, yan %% Type: language +Subtag: suo +Description: Bouni +Added: 2021-02-20 +%% +Type: language Subtag: suq +Description: Tirmaga-Chai Suri Description: Suri Added: 2009-07-29 %% @@ -32807,7 +33426,7 @@ Added: 2005-10-16 %% Type: language Subtag: suy -Description: Suyá +Description: Suyá Added: 2009-07-29 %% Type: language @@ -32967,7 +33586,7 @@ Added: 2009-07-29 %% Type: language Subtag: swx -Description: Suruahá +Description: Suruahá Added: 2009-07-29 %% Type: language @@ -32992,6 +33611,7 @@ Added: 2009-07-29 %% Type: language Subtag: sxg +Description: Shuhi Description: Shixing Added: 2009-07-29 %% @@ -33136,6 +33756,8 @@ Type: language Subtag: szd Description: Seru Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: umi %% Type: language Subtag: sze @@ -33163,6 +33785,11 @@ Description: Suabo Added: 2009-07-29 %% Type: language +Subtag: szs +Description: Solomon Islands Sign Language +Added: 2017-02-23 +%% +Type: language Subtag: szv Description: Isu (Fako Division) Added: 2009-07-29 @@ -33173,6 +33800,11 @@ Description: Sawai Added: 2009-07-29 %% Type: language +Subtag: szy +Description: Sakizaya +Added: 2019-04-16 +%% +Type: language Subtag: taa Description: Lower Tanana Added: 2009-07-29 @@ -33199,7 +33831,7 @@ Added: 2009-07-29 %% Type: language Subtag: taf -Description: Tapirapé +Description: Tapirapé Added: 2009-07-29 %% Type: language @@ -33291,13 +33923,14 @@ Added: 2009-07-29 %% Type: language Subtag: tba -Description: Aikanã +Description: Aikanã Added: 2009-07-29 %% Type: language Subtag: tbb Description: Tapeba Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: tbc @@ -33326,6 +33959,7 @@ Added: 2009-07-29 %% Type: language Subtag: tbh +Description: Dharawal Description: Thurawal Added: 2009-07-29 %% @@ -33464,7 +34098,7 @@ Added: 2009-07-29 %% Type: language Subtag: tci -Description: Wára +Description: Wára Added: 2009-07-29 %% Type: language @@ -33505,6 +34139,7 @@ Added: 2009-07-29 Type: language Subtag: tcs Description: Torres Strait Creole +Description: Yumplatok Added: 2009-07-29 %% Type: language @@ -33519,7 +34154,7 @@ Added: 2009-07-29 %% Type: language Subtag: tcw -Description: Tecpatlán Totonac +Description: Tecpatlán Totonac Added: 2009-07-29 %% Type: language @@ -33549,12 +34184,12 @@ Added: 2009-07-29 %% Type: language Subtag: tdc -Description: Emberá-Tadó +Description: Emberá-Tadó Added: 2009-07-29 %% Type: language Subtag: tdd -Description: Tai Nüa +Description: Tai Nüa Added: 2009-07-29 %% Type: language @@ -33773,6 +34408,11 @@ Description: Tulishi Added: 2009-07-29 %% Type: language +Subtag: tez +Description: Tetserret +Added: 2018-03-08 +%% +Type: language Subtag: tfi Description: Tofin Gbe Added: 2009-07-29 @@ -33923,6 +34563,7 @@ Preferred-Value: tpo %% Type: language Subtag: thd +Description: Kuuk Thaayorre Description: Thayore Added: 2009-07-29 %% @@ -34007,6 +34648,8 @@ Type: language Subtag: thw Description: Thudam Added: 2009-07-29 +Deprecated: 2020-06-08 +Preferred-Value: ola %% Type: language Subtag: thx @@ -34107,7 +34750,7 @@ Added: 2009-07-29 %% Type: language Subtag: tiq -Description: Tiéfo +Description: Tiéfo Added: 2009-07-29 %% Type: language @@ -34166,6 +34809,11 @@ Description: Northern Tujia Added: 2009-07-29 %% Type: language +Subtag: tjj +Description: Tjungundji +Added: 2019-04-16 +%% +Type: language Subtag: tjl Description: Tai Laing Added: 2012-08-12 @@ -34186,6 +34834,11 @@ Description: Temacine Tamazight Added: 2009-07-29 %% Type: language +Subtag: tjp +Description: Tjupany +Added: 2019-04-16 +%% +Type: language Subtag: tjs Description: Southern Tujia Added: 2009-07-29 @@ -34202,7 +34855,7 @@ Added: 2013-09-10 %% Type: language Subtag: tka -Description: Truká +Description: Truká Added: 2009-07-29 %% Type: language @@ -34222,7 +34875,7 @@ Added: 2009-07-29 %% Type: language Subtag: tkf -Description: Tukumanféd +Description: Tukumanféd Added: 2009-07-29 %% Type: language @@ -34337,7 +34990,7 @@ Added: 2009-07-29 Type: language Subtag: tlh Description: Klingon -Description: tlhIngan-Hol +Description: tlhIngan Hol Added: 2005-10-16 %% Type: language @@ -34377,7 +35030,7 @@ Added: 2009-07-29 %% Type: language Subtag: tlp -Description: Filomena Mata-Coahuitlán Totonac +Description: Filomena Mata-Coahuitlán Totonac Added: 2009-07-29 %% Type: language @@ -34451,7 +35104,7 @@ Added: 2009-07-29 %% Type: language Subtag: tme -Description: Tremembé +Description: Tremembé Added: 2009-07-29 %% Type: language @@ -34461,7 +35114,7 @@ Added: 2009-07-29 %% Type: language Subtag: tmg -Description: Ternateño +Description: Ternateño Added: 2009-07-29 %% Type: language @@ -34485,6 +35138,8 @@ Type: language Subtag: tmk Description: Northwestern Tamang Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: tdg %% Type: language Subtag: tml @@ -34508,7 +35163,7 @@ Added: 2009-07-29 %% Type: language Subtag: tmp -Description: Tai Mène +Description: Tai Mène Added: 2009-07-29 Deprecated: 2016-05-30 Preferred-Value: tyj @@ -34571,7 +35226,7 @@ Added: 2009-07-29 %% Type: language Subtag: tnc -Description: Tanimuca-Retuarã +Description: Tanimuca-Retuarã Added: 2009-07-29 %% Type: language @@ -34645,7 +35300,7 @@ Added: 2009-07-29 %% Type: language Subtag: tnr -Description: Ménik +Description: Ménik Added: 2009-07-29 %% Type: language @@ -34735,6 +35390,11 @@ Description: Tojolabal Added: 2009-07-29 %% Type: language +Subtag: tok +Description: Toki Pona +Added: 2022-02-25 +%% +Type: language Subtag: tol Description: Tolowa Added: 2009-07-29 @@ -34746,7 +35406,7 @@ Added: 2009-07-29 %% Type: language Subtag: too -Description: Xicotepec De Juárez Totonac +Description: Xicotepec De Juárez Totonac Added: 2009-07-29 %% Type: language @@ -34806,8 +35466,8 @@ Added: 2009-07-29 %% Type: language Subtag: tpc -Description: Azoyú Me'phaa -Description: Azoyú Tlapanec +Description: Azoyú Me'phaa +Description: Azoyú Tlapanec Added: 2009-07-29 %% Type: language @@ -34833,7 +35493,7 @@ Suppress-Script: Latn %% Type: language Subtag: tpj -Description: Tapieté +Description: Tapieté Added: 2009-07-29 %% Type: language @@ -34854,7 +35514,7 @@ Added: 2009-07-29 %% Type: language Subtag: tpn -Description: Tupinambá +Description: Tupinambá Added: 2009-07-29 %% Type: language @@ -34874,7 +35534,7 @@ Added: 2009-07-29 %% Type: language Subtag: tpr -Description: Tuparí +Description: Tuparí Added: 2009-07-29 %% Type: language @@ -34894,8 +35554,10 @@ Added: 2009-07-29 %% Type: language Subtag: tpw -Description: Tupí +Description: Tupí Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: tpn %% Type: language Subtag: tpx @@ -34915,7 +35577,7 @@ Added: 2009-07-29 %% Type: language Subtag: tqb -Description: Tembé +Description: Tembé Added: 2009-07-29 %% Type: language @@ -35000,7 +35662,7 @@ Added: 2009-07-29 %% Type: language Subtag: trg -Description: Lishán Didán +Description: Lishán Didán Added: 2009-07-29 %% Type: language @@ -35010,7 +35672,7 @@ Added: 2009-07-29 %% Type: language Subtag: tri -Description: Trió +Description: Trió Added: 2009-07-29 %% Type: language @@ -35051,7 +35713,7 @@ Added: 2009-07-29 %% Type: language Subtag: trq -Description: San Martín Itunyoso Triqui +Description: San Martín Itunyoso Triqui Added: 2009-07-29 %% Type: language @@ -35077,6 +35739,8 @@ Added: 2009-07-29 %% Type: language Subtag: trv +Description: Sediq +Description: Seediq Description: Taroko Added: 2009-07-29 %% @@ -35097,7 +35761,7 @@ Added: 2009-07-29 %% Type: language Subtag: trz -Description: Torá +Description: Torá Added: 2009-07-29 %% Type: language @@ -35159,13 +35823,13 @@ Added: 2009-07-29 %% Type: language Subtag: tsl -Description: Ts'ün-Lao +Description: Ts'ün-Lao Added: 2009-07-29 %% Type: language Subtag: tsm Description: Turkish Sign Language -Description: Türk Isaret Dili +Description: Türk Ä°ÅŸaret Dili Added: 2009-07-29 %% Type: language @@ -35356,7 +36020,7 @@ Added: 2009-07-29 %% Type: language Subtag: tub -Description: Tübatulabal +Description: Tübatulabal Added: 2009-07-29 %% Type: language @@ -35366,7 +36030,7 @@ Added: 2009-07-29 %% Type: language Subtag: tud -Description: Tuxá +Description: Tuxá Added: 2009-07-29 %% Type: language @@ -35459,7 +36123,7 @@ Scope: collection %% Type: language Subtag: tux -Description: Tuxináwa +Description: Tuxináwa Added: 2009-07-29 %% Type: language @@ -35489,6 +36153,11 @@ Description: Te'un Added: 2009-07-29 %% Type: language +Subtag: tvi +Description: Tulai +Added: 2023-03-17 +%% +Type: language Subtag: tvk Description: Southeast Ambrym Added: 2009-07-29 @@ -35535,6 +36204,11 @@ Description: Sedoa Added: 2009-07-29 %% Type: language +Subtag: tvx +Description: Taivoan +Added: 2019-04-16 +%% +Type: language Subtag: tvy Description: Timor Pidgin Added: 2009-07-29 @@ -35576,7 +36250,7 @@ Added: 2009-07-29 %% Type: language Subtag: twh -Description: Tai Dón +Description: Tai Dón Added: 2009-07-29 %% Type: language @@ -35616,7 +36290,7 @@ Added: 2009-07-29 %% Type: language Subtag: twt -Description: Turiwára +Description: Turiwára Added: 2009-07-29 %% Type: language @@ -35716,7 +36390,7 @@ Added: 2009-07-29 %% Type: language Subtag: txu -Description: Kayapó +Description: Kayapó Added: 2009-07-29 %% Type: language @@ -35778,12 +36452,12 @@ Added: 2009-07-29 %% Type: language Subtag: tys -Description: Tày Sa Pa +Description: Tày Sa Pa Added: 2009-07-29 %% Type: language Subtag: tyt -Description: Tày Tac +Description: Tày Tac Added: 2009-07-29 %% Type: language @@ -35802,8 +36476,13 @@ Description: Teke-Tyee Added: 2009-07-29 %% Type: language +Subtag: tyy +Description: Tiyaa +Added: 2021-02-20 +%% +Type: language Subtag: tyz -Description: Tày +Description: Tày Added: 2009-07-29 %% Type: language @@ -35848,7 +36527,7 @@ Added: 2009-07-29 %% Type: language Subtag: uam -Description: Uamué +Description: Uamué Added: 2009-07-29 %% Type: language @@ -35958,6 +36637,11 @@ Description: Ughele Added: 2009-07-29 %% Type: language +Subtag: ugh +Description: Kubachi +Added: 2022-02-25 +%% +Type: language Subtag: ugn Description: Ugandan Sign Language Added: 2009-07-29 @@ -36013,6 +36697,16 @@ Description: Ukhwejo Added: 2009-07-29 %% Type: language +Subtag: uki +Description: Kui (India) +Added: 2020-03-28 +%% +Type: language +Subtag: ukk +Description: Muak Sa-aak +Added: 2017-02-23 +%% +Type: language Subtag: ukl Description: Ukrainian Sign Language Added: 2009-07-29 @@ -36029,7 +36723,7 @@ Added: 2009-07-29 %% Type: language Subtag: uks -Description: Urubú-Kaapor Sign Language +Description: Urubú-Kaapor Sign Language Description: Kaapor Sign Language Added: 2009-07-29 %% @@ -36039,6 +36733,11 @@ Description: Ukue Added: 2009-07-29 %% Type: language +Subtag: ukv +Description: Kuku +Added: 2020-03-28 +%% +Type: language Subtag: ukw Description: Ukwuani-Aboh-Ndoni Added: 2009-07-29 @@ -36081,7 +36780,7 @@ Added: 2009-07-29 %% Type: language Subtag: ulk -Description: Meriam +Description: Meriam Mir Added: 2009-07-29 %% Type: language @@ -36110,6 +36809,11 @@ Description: Ulwa Added: 2010-03-11 %% Type: language +Subtag: uly +Description: Buli +Added: 2023-03-17 +%% +Type: language Subtag: uma Description: Umatilla Added: 2009-07-29 @@ -36131,6 +36835,7 @@ Added: 2009-07-29 %% Type: language Subtag: umg +Description: Morrobalama Description: Umbuygamu Added: 2009-07-29 %% @@ -36151,7 +36856,7 @@ Added: 2009-07-29 %% Type: language Subtag: umo -Description: Umotína +Description: Umotína Added: 2009-07-29 %% Type: language @@ -36197,8 +36902,13 @@ Description: Ngarinyin Added: 2009-07-29 %% Type: language +Subtag: uni +Description: Uni +Added: 2021-02-20 +%% +Type: language Subtag: unk -Description: Enawené-Nawé +Description: Enawené-Nawé Added: 2009-07-29 %% Type: language @@ -36247,6 +36957,11 @@ Deprecated: 2015-02-12 Preferred-Value: ema %% Type: language +Subtag: uon +Description: Kulon +Added: 2022-02-25 +%% +Type: language Subtag: upi Description: Umeda Added: 2009-07-29 @@ -36263,7 +36978,7 @@ Added: 2009-07-29 %% Type: language Subtag: urb -Description: Urubú-Kaapor +Description: Urubú-Kaapor Description: Kaapor Added: 2009-07-29 %% @@ -36337,7 +37052,7 @@ Added: 2009-07-29 Type: language Subtag: urr Description: Lehalurup -Description: Löyöp +Description: Löyöp Added: 2009-07-29 %% Type: language @@ -36401,6 +37116,11 @@ Description: Uspanteco Added: 2009-07-29 %% Type: language +Subtag: uss +Description: us-Saare +Added: 2019-04-16 +%% +Type: language Subtag: usu Description: Uya Added: 2009-07-29 @@ -36416,6 +37136,11 @@ Description: Ute-Southern Paiute Added: 2009-07-29 %% Type: language +Subtag: uth +Description: ut-Hun +Added: 2019-04-16 +%% +Type: language Subtag: utp Description: Amba (Solomon Islands) Added: 2009-07-29 @@ -36439,6 +37164,8 @@ Type: language Subtag: uun Description: Kulon-Pazeh Added: 2009-07-29 +Deprecated: 2022-02-25 +Comments: see pzh, uon %% Type: language Subtag: uur @@ -36521,8 +37248,7 @@ Added: 2005-10-16 Type: language Subtag: vaj Description: Sekele -Description: Northwestern !Kung -Description: Northwestern !Kung +Description: Northwestern ǃKung Description: Vasekele Added: 2009-07-29 %% @@ -36609,7 +37335,7 @@ Added: 2009-07-29 %% Type: language Subtag: veo -Description: Ventureño +Description: Ventureño Added: 2009-07-29 %% Type: language @@ -36679,6 +37405,11 @@ Description: Iduna Added: 2009-07-29 %% Type: language +Subtag: vjk +Description: Bajjika +Added: 2023-03-17 +%% +Type: language Subtag: vka Description: Kariyarra Added: 2009-07-29 @@ -36687,6 +37418,8 @@ Type: language Subtag: vki Description: Ija-Zuba Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see vkn, vkz %% Type: language Subtag: vkj @@ -36710,6 +37443,11 @@ Description: Kamakan Added: 2009-07-29 %% Type: language +Subtag: vkn +Description: Koro Nulu +Added: 2021-02-20 +%% +Type: language Subtag: vko Description: Kodeoha Added: 2009-07-29 @@ -36731,6 +37469,11 @@ Description: Kurrama Added: 2009-07-29 %% Type: language +Subtag: vkz +Description: Koro Zuba +Added: 2021-02-20 +%% +Type: language Subtag: vlp Description: Valpei Added: 2009-07-29 @@ -36767,7 +37510,7 @@ Added: 2009-07-29 %% Type: language Subtag: vmf -Description: Mainfränkisch +Description: Mainfränkisch Added: 2009-07-29 %% Type: language @@ -36853,7 +37596,7 @@ Added: 2009-07-29 %% Type: language Subtag: vmz -Description: Mazatlán Mazatec +Description: Mazatlán Mazatec Added: 2009-07-29 %% Type: language @@ -36890,7 +37633,7 @@ Added: 2009-07-29 %% Type: language Subtag: vro -Description: Võro +Description: Võro Added: 2009-07-29 Macrolanguage: et %% @@ -36963,7 +37706,8 @@ Added: 2009-07-29 %% Type: language Subtag: wad -Description: Wandamen +Description: Wamesa +Description: Wondama Added: 2009-07-29 %% Type: language @@ -36973,7 +37717,7 @@ Added: 2009-07-29 %% Type: language Subtag: waf -Description: Wakoná +Description: Wakoná Added: 2009-07-29 %% Type: language @@ -37030,7 +37774,7 @@ Added: 2009-07-29 %% Type: language Subtag: waq -Description: Wageman +Description: Wagiman Added: 2009-07-29 %% Type: language @@ -37050,7 +37794,7 @@ Added: 2009-07-29 %% Type: language Subtag: wau -Description: Waurá +Description: Waurá Added: 2009-07-29 %% Type: language @@ -37147,8 +37891,13 @@ Added: 2009-07-29 Macrolanguage: raj %% Type: language +Subtag: wbs +Description: West Bengal Sign Language +Added: 2017-02-23 +%% +Type: language Subtag: wbt -Description: Wanman +Description: Warnman Added: 2009-07-29 %% Type: language @@ -37163,7 +37912,7 @@ Added: 2009-07-29 %% Type: language Subtag: wca -Description: Yanomámi +Description: Yanomámi Added: 2009-07-29 %% Type: language @@ -37192,6 +37941,11 @@ Description: Wadikali Added: 2013-09-10 %% Type: language +Subtag: wdt +Description: Wendat +Added: 2022-02-25 +%% +Type: language Subtag: wdu Description: Wadjigu Added: 2009-07-29 @@ -37208,7 +37962,7 @@ Added: 2009-07-29 %% Type: language Subtag: wec -Description: Wè Western +Description: Wè Western Added: 2009-07-29 %% Type: language @@ -37295,6 +38049,7 @@ Added: 2010-03-11 %% Type: language Subtag: wgg +Description: Wangkangurru Description: Wangganguru Added: 2009-07-29 %% @@ -37368,7 +38123,7 @@ Added: 2009-07-29 %% Type: language Subtag: wig -Description: Wik-Ngathana +Description: Wik Ngathan Added: 2009-07-29 %% Type: language @@ -37408,7 +38163,7 @@ Added: 2009-07-29 %% Type: language Subtag: wir -Description: Wiraféd +Description: Wiraféd Added: 2009-07-29 %% Type: language @@ -37472,6 +38227,11 @@ Description: Kalanadi Added: 2009-07-29 %% Type: language +Subtag: wkr +Description: Keerray-Woorroong +Added: 2019-04-16 +%% +Type: language Subtag: wku Description: Kunduvadi Added: 2009-07-29 @@ -37507,6 +38267,11 @@ Description: Kunbarlang Added: 2009-07-29 %% Type: language +Subtag: wlh +Description: Welaun +Added: 2020-03-28 +%% +Type: language Subtag: wli Description: Waioli Added: 2009-07-29 @@ -37548,7 +38313,7 @@ Added: 2009-07-29 %% Type: language Subtag: wlv -Description: Wichí Lhamtés Vejoz +Description: Wichí Lhamtés Vejoz Added: 2009-07-29 %% Type: language @@ -37583,7 +38348,7 @@ Added: 2009-07-29 %% Type: language Subtag: wmd -Description: Mamaindé +Description: Mamaindé Added: 2009-07-29 %% Type: language @@ -37592,6 +38357,11 @@ Description: Wambule Added: 2009-07-29 %% Type: language +Subtag: wmg +Description: Western Minyag +Added: 2021-02-20 +%% +Type: language Subtag: wmh Description: Waima'a Added: 2009-07-29 @@ -37638,7 +38408,7 @@ Added: 2009-07-29 %% Type: language Subtag: wnb -Description: Wanambre +Description: Mokati Added: 2009-07-29 %% Type: language @@ -37704,16 +38474,18 @@ Added: 2013-09-10 Type: language Subtag: wny Description: Wanyi +Description: Waanyi Added: 2012-08-12 %% Type: language Subtag: woa +Description: Kuwema Description: Tyaraity Added: 2009-07-29 %% Type: language Subtag: wob -Description: Wè Northern +Description: Wè Northern Added: 2009-07-29 %% Type: language @@ -37795,9 +38567,12 @@ Type: language Subtag: wra Description: Warapu Added: 2009-07-29 +Deprecated: 2021-02-20 +Comments: see bpe, suo, uni %% Type: language Subtag: wrb +Description: Waluwarra Description: Warluwara Added: 2009-07-29 %% @@ -37805,15 +38580,17 @@ Type: language Subtag: wrd Description: Warduji Added: 2009-07-29 +Deprecated: 2022-02-25 %% Type: language Subtag: wrg Description: Warungu +Description: Gudjal Added: 2009-07-29 %% Type: language Subtag: wrh -Description: Wiradhuri +Description: Wiradjuri Added: 2009-07-29 %% Type: language @@ -37934,6 +38711,11 @@ Description: Wotapuri-Katarqalai Added: 2009-07-29 %% Type: language +Subtag: wtb +Description: Matambwe +Added: 2023-03-17 +%% +Type: language Subtag: wtf Description: Watiwa Added: 2009-07-29 @@ -38069,6 +38851,8 @@ Type: language Subtag: wya Description: Wyandot Added: 2009-07-29 +Deprecated: 2022-02-25 +Comments: see wdt, wyn %% Type: language Subtag: wyb @@ -38086,8 +38870,13 @@ Description: Wymysorys Added: 2009-07-29 %% Type: language +Subtag: wyn +Description: Wyandot +Added: 2022-02-25 +%% +Type: language Subtag: wyr -Description: Wayoró +Description: Wayoró Added: 2009-07-29 %% Type: language @@ -38127,17 +38916,17 @@ Added: 2009-07-29 %% Type: language Subtag: xai -Description: Kaimbé +Description: Kaimbé Added: 2009-07-29 %% Type: language Subtag: xaj -Description: Ararandewára +Description: Ararandewára Added: 2014-02-28 %% Type: language Subtag: xak -Description: Máku +Description: Máku Added: 2016-05-30 %% Type: language @@ -38148,8 +38937,7 @@ Added: 2005-10-16 %% Type: language Subtag: xam -Description: /Xam -Description: |Xam +Description: Ç€Xam Added: 2009-07-29 %% Type: language @@ -38194,7 +38982,7 @@ Added: 2009-07-29 %% Type: language Subtag: xav -Description: Xavánte +Description: Xavánte Added: 2009-07-29 %% Type: language @@ -38276,17 +39064,18 @@ Added: 2009-07-29 %% Type: language Subtag: xbw -Description: Kambiwá +Description: Kambiwá Added: 2009-07-29 %% Type: language Subtag: xbx -Description: Kabixí +Description: Kabixí Added: 2009-07-29 Deprecated: 2016-05-30 %% Type: language Subtag: xby +Description: Batjala Description: Batyala Added: 2013-09-10 %% @@ -38387,6 +39176,16 @@ Description: Edomite Added: 2009-07-29 %% Type: language +Subtag: xdo +Description: Kwandu +Added: 2017-02-23 +%% +Type: language +Subtag: xdq +Description: Kaitag +Added: 2022-02-25 +%% +Type: language Subtag: xdy Description: Malayic Dayak Added: 2009-07-29 @@ -38403,8 +39202,7 @@ Added: 2009-07-29 %% Type: language Subtag: xeg -Description: //Xegwi -Description: ?Xegwi +Description: ÇXegwi Added: 2009-07-29 %% Type: language @@ -38424,7 +39222,7 @@ Added: 2009-07-29 %% Type: language Subtag: xer -Description: Xerénte +Description: Xerénte Added: 2009-07-29 %% Type: language @@ -38434,7 +39232,7 @@ Added: 2009-07-29 %% Type: language Subtag: xet -Description: Xetá +Description: Xetá Added: 2009-07-29 %% Type: language @@ -38464,7 +39262,7 @@ Added: 2013-09-10 %% Type: language Subtag: xgf -Description: Gabrielino-Fernandeño +Description: Gabrielino-Fernandeño Added: 2009-07-29 %% Type: language @@ -38531,6 +39329,11 @@ Added: 2009-07-29 Macrolanguage: lah %% Type: language +Subtag: xhm +Description: Middle Khmer (1400 to 1850 CE) +Added: 2022-02-25 +%% +Type: language Subtag: xhr Description: Hernican Added: 2009-07-29 @@ -38579,13 +39382,13 @@ Added: 2009-07-29 %% Type: language Subtag: xip -Description: Xipináwa +Description: Xipináwa Added: 2009-07-29 Deprecated: 2016-05-30 %% Type: language Subtag: xir -Description: Xiriâna +Description: Xiriâna Added: 2009-07-29 %% Type: language @@ -38667,6 +39470,7 @@ Added: 2009-07-29 %% Type: language Subtag: xkk +Description: Kachok Description: Kaco' Added: 2009-07-29 %% @@ -38697,7 +39501,7 @@ Added: 2009-07-29 %% Type: language Subtag: xkr -Description: Xakriabá +Description: Xakriabá Added: 2009-07-29 %% Type: language @@ -38842,7 +39646,7 @@ Added: 2009-07-29 %% Type: language Subtag: xmh -Description: Kuku-Muminh +Description: Kugu-Muminh Added: 2009-07-29 %% Type: language @@ -38921,6 +39725,7 @@ Macrolanguage: mg %% Type: language Subtag: xmx +Description: Salawati Description: Maden Added: 2009-07-29 %% @@ -38966,11 +39771,21 @@ Description: Ngarigu Added: 2013-09-10 %% Type: language +Subtag: xnj +Description: Ngoni (Tanzania) +Added: 2021-02-20 +%% +Type: language Subtag: xnk Description: Nganakarti Added: 2013-09-10 %% Type: language +Subtag: xnm +Description: Ngumbarl +Added: 2020-03-28 +%% +Type: language Subtag: xnn Description: Northern Kankanay Added: 2009-07-29 @@ -38981,6 +39796,11 @@ Description: Anglo-Norman Added: 2009-07-29 %% Type: language +Subtag: xnq +Description: Ngoni (Mozambique) +Added: 2021-02-20 +%% +Type: language Subtag: xnr Description: Kangri Added: 2009-07-29 @@ -39049,7 +39869,7 @@ Added: 2009-07-29 %% Type: language Subtag: xoo -Description: Xukurú +Description: Xukurú Added: 2009-07-29 %% Type: language @@ -39073,22 +39893,45 @@ Description: Pirriya Added: 2013-09-10 %% Type: language +Subtag: xpb +Description: Northeastern Tasmanian +Description: Pyemmairrener +Added: 2020-03-28 +%% +Type: language Subtag: xpc Description: Pecheneg Added: 2009-07-29 %% Type: language +Subtag: xpd +Description: Oyster Bay Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xpe Description: Liberia Kpelle Added: 2009-07-29 Macrolanguage: kpe %% Type: language +Subtag: xpf +Description: Southeast Tasmanian +Description: Nuenonne +Added: 2020-03-28 +%% +Type: language Subtag: xpg Description: Phrygian Added: 2009-07-29 %% Type: language +Subtag: xph +Description: North Midlands Tasmanian +Description: Tyerrenoterpanner +Added: 2020-03-28 +%% +Type: language Subtag: xpi Description: Pictish Added: 2009-07-29 @@ -39104,13 +39947,18 @@ Description: Kulina Pano Added: 2009-07-29 %% Type: language +Subtag: xpl +Description: Port Sorell Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xpm Description: Pumpokol Added: 2009-07-29 %% Type: language Subtag: xpn -Description: Kapinawá +Description: Kapinawá Added: 2009-07-29 %% Type: language @@ -39149,11 +39997,34 @@ Description: Punic Added: 2009-07-29 %% Type: language +Subtag: xpv +Description: Northern Tasmanian +Description: Tommeginne +Added: 2020-03-28 +%% +Type: language +Subtag: xpw +Description: Northwestern Tasmanian +Description: Peerapper +Added: 2020-03-28 +%% +Type: language +Subtag: xpx +Description: Southwestern Tasmanian +Description: Toogee +Added: 2020-03-28 +%% +Type: language Subtag: xpy Description: Puyo Added: 2009-07-29 %% Type: language +Subtag: xpz +Description: Bruny Island Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xqa Description: Karakhanid Added: 2009-07-29 @@ -39165,7 +40036,7 @@ Added: 2009-07-29 %% Type: language Subtag: xra -Description: Krahô +Description: Krahô Added: 2009-07-29 %% Type: language @@ -39207,6 +40078,8 @@ Type: language Subtag: xrq Description: Karranga Added: 2013-09-10 +Deprecated: 2020-03-28 +Preferred-Value: dmw %% Type: language Subtag: xrr @@ -39267,8 +40140,7 @@ Type: language Subtag: xsj Description: Subi Added: 2009-07-29 -Deprecated: 2015-02-12 -Preferred-Value: suj +Comments: see also suj %% Type: language Subtag: xsl @@ -39310,10 +40182,12 @@ Type: language Subtag: xss Description: Assan Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: zko %% Type: language Subtag: xsu -Description: Sanumá +Description: Sanumá Added: 2009-07-29 %% Type: language @@ -39378,7 +40252,7 @@ Added: 2009-07-29 %% Type: language Subtag: xtm -Description: Magdalena Peñasco Mixtec +Description: Magdalena Peñasco Mixtec Added: 2009-07-29 %% Type: language @@ -39428,7 +40302,7 @@ Added: 2013-09-10 %% Type: language Subtag: xtw -Description: Tawandê +Description: Tawandê Added: 2009-07-29 %% Type: language @@ -39440,6 +40314,8 @@ Type: language Subtag: xtz Description: Tasmanian Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see xpb, xpd, xpf, xph, xpl, xpv, xpw, xpx, xpz %% Type: language Subtag: xua @@ -39469,6 +40345,7 @@ Added: 2009-07-29 Type: language Subtag: xul Description: Ngunawal +Description: Nunukul Added: 2013-09-10 %% Type: language @@ -39504,6 +40381,7 @@ Added: 2009-07-29 Type: language Subtag: xuu Description: Kxoe +Description: Khwedam Added: 2009-07-29 %% Type: language @@ -39608,7 +40486,7 @@ Added: 2013-09-10 %% Type: language Subtag: xxr -Description: Koropó +Description: Koropó Added: 2009-07-29 %% Type: language @@ -39688,7 +40566,7 @@ Added: 2009-07-29 %% Type: language Subtag: yae -Description: Pumé +Description: Pumé Added: 2009-07-29 %% Type: language @@ -39698,7 +40576,7 @@ Added: 2009-07-29 %% Type: language Subtag: yag -Description: Yámana +Description: Yámana Added: 2009-07-29 %% Type: language @@ -39778,7 +40656,7 @@ Added: 2009-07-29 %% Type: language Subtag: yaw -Description: Yawalapití +Description: Yawalapití Added: 2009-07-29 %% Type: language @@ -39850,7 +40728,7 @@ Added: 2009-07-29 %% Type: language Subtag: ybn -Description: Yabaâna +Description: Yabaâna Added: 2009-07-29 %% Type: language @@ -39889,6 +40767,11 @@ Description: Chepya Added: 2009-07-29 %% Type: language +Subtag: ycr +Description: Yilan Creole +Added: 2023-03-17 +%% +Type: language Subtag: yda Description: Yanda Added: 2013-09-10 @@ -40019,7 +40902,7 @@ Added: 2009-07-29 %% Type: language Subtag: ygs -Description: Yol?u Sign Language +Description: YolÅ‹u Sign Language Added: 2014-02-28 %% Type: language @@ -40050,7 +40933,7 @@ Added: 2009-07-29 %% Type: language Subtag: yhs -Description: Yan-nha?u Sign Language +Description: Yan-nhaÅ‹u Sign Language Added: 2015-04-17 %% Type: language @@ -40101,6 +40984,7 @@ Added: 2009-07-29 %% Type: language Subtag: yin +Description: Riang Lai Description: Yinchia Added: 2009-07-29 %% @@ -40167,6 +41051,11 @@ Description: Northern Yukaghir Added: 2009-07-29 %% Type: language +Subtag: ykh +Description: Khamnigan Mongol +Added: 2023-03-17 +%% +Type: language Subtag: yki Description: Yoke Added: 2009-07-29 @@ -40273,8 +41162,8 @@ Added: 2009-07-29 %% Type: language Subtag: yly -Description: Nyâlayu -Description: Nyelâyu +Description: Nyâlayu +Description: Nyelâyu Added: 2009-07-29 %% Type: language @@ -40563,12 +41452,12 @@ Added: 2009-07-29 %% Type: language Subtag: yre -Description: Yaouré +Description: Yaouré Added: 2009-07-29 %% Type: language Subtag: yri -Description: Yarí +Description: Yarí Added: 2009-07-29 Deprecated: 2016-05-30 %% @@ -40594,7 +41483,7 @@ Added: 2009-07-29 %% Type: language Subtag: yro -Description: Yaroamë +Description: Yaroamë Added: 2016-05-30 %% Type: language @@ -40633,6 +41522,11 @@ Description: Yugoslavian Sign Language Added: 2009-07-29 %% Type: language +Subtag: ysm +Description: Myanmar Sign Language +Added: 2021-02-20 +%% +Type: language Subtag: ysn Description: Sani Added: 2009-07-29 @@ -40728,7 +41622,7 @@ Added: 2009-07-29 %% Type: language Subtag: yui -Description: Yurutí +Description: Yurutí Added: 2009-07-29 %% Type: language @@ -40916,20 +41810,20 @@ Added: 2009-07-29 %% Type: language Subtag: zaa -Description: Sierra de Juárez Zapotec +Description: Sierra de Juárez Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zab Description: Western Tlacolula Valley Zapotec -Description: San Juan Guelavía Zapotec +Description: San Juan Guelavía Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zac -Description: Ocotlán Zapotec +Description: Ocotlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -40984,7 +41878,7 @@ Added: 2009-07-29 %% Type: language Subtag: zam -Description: Miahuatlán Zapotec +Description: Miahuatlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41002,13 +41896,13 @@ Scope: macrolanguage %% Type: language Subtag: zaq -Description: Aloápam Zapotec +Description: Aloápam Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zar -Description: Rincón Zapotec +Description: Rincón Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41059,6 +41953,11 @@ Description: Zari Added: 2009-07-29 %% Type: language +Subtag: zba +Description: Balaibalan +Added: 2020-03-28 +%% +Type: language Subtag: zbc Description: Central Berawan Added: 2009-07-29 @@ -41082,6 +41981,11 @@ Description: Batui Added: 2009-07-29 %% Type: language +Subtag: zbu +Description: Bu (Bauchi State) +Added: 2021-02-20 +%% +Type: language Subtag: zbw Description: West Berawan Added: 2009-07-29 @@ -41093,6 +41997,12 @@ Added: 2009-07-29 Macrolanguage: zap %% Type: language +Subtag: zcd +Description: Las Delicias Zapotec +Added: 2022-02-25 +Macrolanguage: zap +%% +Type: language Subtag: zch Description: Central Hongshuihe Zhuang Added: 2009-07-29 @@ -41120,6 +42030,11 @@ Added: 2009-07-29 Macrolanguage: za %% Type: language +Subtag: zem +Description: Zeem +Added: 2023-03-17 +%% +Type: language Subtag: zen Description: Zenaga Added: 2005-10-16 @@ -41224,6 +42139,8 @@ Type: language Subtag: zir Description: Ziriya Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: scv %% Type: language Subtag: ziw @@ -41244,6 +42161,8 @@ Type: language Subtag: zkb Description: Koibal Added: 2009-07-29 +Deprecated: 2023-03-17 +Preferred-Value: kjh %% Type: language Subtag: zkd @@ -41277,7 +42196,7 @@ Added: 2009-07-29 %% Type: language Subtag: zkp -Description: São Paulo Kaingáng +Description: São Paulo Kaingáng Added: 2009-07-29 %% Type: language @@ -41306,6 +42225,11 @@ Description: Khazar Added: 2009-07-29 %% Type: language +Subtag: zla +Description: Zula +Added: 2021-02-20 +%% +Type: language Subtag: zle Description: East Slavic languages Added: 2009-07-29 @@ -41342,6 +42266,11 @@ Added: 2009-07-29 Scope: collection %% Type: language +Subtag: zlu +Description: Zul +Added: 2023-03-17 +%% +Type: language Subtag: zlw Description: West Slavic languages Added: 2009-07-29 @@ -41405,12 +42334,13 @@ Added: 2009-07-29 %% Type: language Subtag: zml -Description: Madngele +Description: Matngala Added: 2009-07-29 %% Type: language Subtag: zmm Description: Marimanindji +Description: Marramaninyshi Added: 2009-07-29 %% Type: language @@ -41511,7 +42441,7 @@ Added: 2009-07-29 %% Type: language Subtag: zoc -Description: Copainalá Zoque +Description: Copainalá Zoque Added: 2009-07-29 %% Type: language @@ -41526,7 +42456,7 @@ Added: 2009-07-29 %% Type: language Subtag: zoo -Description: Asunción Mixtepec Zapotec +Description: Asunción Mixtepec Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41537,12 +42467,12 @@ Added: 2009-07-29 %% Type: language Subtag: zor -Description: Rayón Zoque +Description: Rayón Zoque Added: 2009-07-29 %% Type: language Subtag: zos -Description: Francisco León Zoque +Description: Francisco León Zoque Added: 2009-07-29 %% Type: language @@ -41565,7 +42495,7 @@ Macrolanguage: zap %% Type: language Subtag: zpd -Description: Southeastern Ixtlán Zapotec +Description: Southeastern Ixtlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41595,7 +42525,7 @@ Macrolanguage: zap %% Type: language Subtag: zpi -Description: Santa María Quiegolani Zapotec +Description: Santa María Quiegolani Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41613,7 +42543,7 @@ Macrolanguage: zap %% Type: language Subtag: zpl -Description: Lachixío Zapotec +Description: Lachixío Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41625,13 +42555,13 @@ Macrolanguage: zap %% Type: language Subtag: zpn -Description: Santa Inés Yatzechi Zapotec +Description: Santa Inés Yatzechi Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zpo -Description: Amatlán Zapotec +Description: Amatlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41655,19 +42585,19 @@ Macrolanguage: zap %% Type: language Subtag: zps -Description: Coatlán Zapotec +Description: Coatlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zpt -Description: San Vicente Coatlán Zapotec +Description: San Vicente Coatlán Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: zpu -Description: Yalálag Zapotec +Description: Yalálag Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41724,7 +42654,7 @@ Added: 2009-07-29 %% Type: language Subtag: zro -Description: Záparo +Description: Záparo Added: 2009-07-29 %% Type: language @@ -41777,19 +42707,19 @@ Macrolanguage: zap %% Type: language Subtag: ztg -Description: Xanaguía Zapotec +Description: Xanaguía Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: ztl -Description: Lapaguía-Guivini Zapotec +Description: Lapaguía-Guivini Zapotec Added: 2009-07-29 Macrolanguage: zap %% Type: language Subtag: ztm -Description: San Agustín Mixtepec Zapotec +Description: San Agustín Mixtepec Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41807,7 +42737,7 @@ Macrolanguage: zap %% Type: language Subtag: ztq -Description: Quioquitani-Quierí Zapotec +Description: Quioquitani-Quierí Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41825,7 +42755,7 @@ Macrolanguage: zap %% Type: language Subtag: ztu -Description: Güilá Zapotec +Description: Güilá Zapotec Added: 2009-07-29 Macrolanguage: zap %% @@ -41845,6 +42775,8 @@ Type: language Subtag: zua Description: Zeem Added: 2009-07-29 +Deprecated: 2023-03-17 +Comments: see cxh, dsk, dyr, tvi, zem %% Type: language Subtag: zuh @@ -42052,13 +42984,21 @@ Type: extlang Subtag: ajp Description: South Levantine Arabic Added: 2009-07-29 +Deprecated: 2023-03-17 Preferred-Value: ajp Prefix: ar Macrolanguage: ar %% Type: extlang +Subtag: ajs +Description: Algerian Jewish Sign Language +Added: 2022-02-25 +Preferred-Value: ajs +Prefix: sgn +%% +Type: extlang Subtag: apc -Description: North Levantine Arabic +Description: Levantine Arabic Added: 2009-07-29 Preferred-Value: apc Prefix: ar @@ -42121,6 +43061,7 @@ Prefix: sgn %% Type: extlang Subtag: asf +Description: Auslan Description: Australian Sign Language Added: 2009-07-29 Preferred-Value: asf @@ -42199,6 +43140,7 @@ Type: extlang Subtag: bbz Description: Babalia Creole Arabic Added: 2009-07-29 +Deprecated: 2020-03-28 Preferred-Value: bbz Prefix: ar Macrolanguage: ar @@ -42316,6 +43258,15 @@ Prefix: zh Macrolanguage: zh %% Type: extlang +Subtag: cnp +Description: Northern Ping Chinese +Description: Northern Pinghua +Added: 2020-03-28 +Preferred-Value: cnp +Prefix: zh +Macrolanguage: zh +%% +Type: extlang Subtag: coa Description: Cocos Islands Malay Added: 2009-07-29 @@ -42334,7 +43285,7 @@ Macrolanguage: zh Type: extlang Subtag: csc Description: Catalan Sign Language -Description: Lengua de señas catalana +Description: Lengua de señas catalana Description: Llengua de Signes Catalana Added: 2009-07-29 Preferred-Value: csc @@ -42383,6 +43334,15 @@ Preferred-Value: csn Prefix: sgn %% Type: extlang +Subtag: csp +Description: Southern Ping Chinese +Description: Southern Pinghua +Added: 2020-03-28 +Preferred-Value: csp +Prefix: zh +Macrolanguage: zh +%% +Type: extlang Subtag: csq Description: Croatia Sign Language Added: 2009-07-29 @@ -42397,6 +43357,13 @@ Preferred-Value: csr Prefix: sgn %% Type: extlang +Subtag: csx +Description: Cambodian Sign Language +Added: 2021-02-20 +Preferred-Value: csx +Prefix: sgn +%% +Type: extlang Subtag: czh Description: Huizhou Chinese Added: 2009-07-29 @@ -42434,6 +43401,13 @@ Preferred-Value: dsl Prefix: sgn %% Type: extlang +Subtag: dsz +Description: Mardin Sign Language +Added: 2022-02-25 +Preferred-Value: dsz +Prefix: sgn +%% +Type: extlang Subtag: dup Description: Duano Added: 2009-07-29 @@ -42449,6 +43423,13 @@ Preferred-Value: ecs Prefix: sgn %% Type: extlang +Subtag: ehs +Description: Miyakubo Sign Language +Added: 2021-02-20 +Preferred-Value: ehs +Prefix: sgn +%% +Type: extlang Subtag: esl Description: Egypt Sign Language Added: 2009-07-29 @@ -42500,7 +43481,7 @@ Prefix: sgn Type: extlang Subtag: fss Description: Finland-Swedish Sign Language -Description: finlandssvenskt teckenspråk +Description: finlandssvenskt teckensprÃ¥k Description: suomenruotsalainen viittomakieli Added: 2009-07-29 Preferred-Value: fss @@ -42733,6 +43714,13 @@ Preferred-Value: jhs Prefix: sgn %% Type: extlang +Subtag: jks +Description: Amami Koniya Sign Language +Added: 2021-02-20 +Preferred-Value: jks +Prefix: sgn +%% +Type: extlang Subtag: jls Description: Jamaican Sign Language Added: 2010-03-11 @@ -42831,6 +43819,14 @@ Prefix: ms Macrolanguage: ms %% Type: extlang +Subtag: lgs +Description: Guinea-Bissau Sign Language +Description: Língua Gestual Guineense +Added: 2023-03-17 +Preferred-Value: lgs +Prefix: sgn +%% +Type: extlang Subtag: liw Description: Col Added: 2009-07-29 @@ -42846,9 +43842,26 @@ Preferred-Value: lls Prefix: sgn %% Type: extlang +Subtag: lsb +Description: Burundian Sign Language +Description: Langue des Signes Burundaise +Added: 2021-02-20 +Preferred-Value: lsb +Prefix: sgn +%% +Type: extlang +Subtag: lsc +Description: Albarradas Sign Language +Description: Lengua de señas Albarradas +Added: 2022-02-25 +Preferred-Value: lsc +Prefix: sgn +%% +Type: extlang Subtag: lsg Description: Lyons Sign Language Added: 2009-07-29 +Deprecated: 2018-03-08 Preferred-Value: lsg Prefix: sgn %% @@ -42860,6 +43873,13 @@ Preferred-Value: lsl Prefix: sgn %% Type: extlang +Subtag: lsn +Description: Tibetan Sign Language +Added: 2019-04-16 +Preferred-Value: lsn +Prefix: sgn +%% +Type: extlang Subtag: lso Description: Laos Sign Language Added: 2009-07-29 @@ -42869,7 +43889,7 @@ Prefix: sgn Type: extlang Subtag: lsp Description: Panamanian Sign Language -Description: Lengua de Señas Panameñas +Description: Lengua de Señas Panameñas Added: 2009-07-29 Preferred-Value: lsp Prefix: sgn @@ -42882,6 +43902,22 @@ Preferred-Value: lst Prefix: sgn %% Type: extlang +Subtag: lsv +Description: Sivia Sign Language +Added: 2019-04-16 +Preferred-Value: lsv +Prefix: sgn +%% +Type: extlang +Subtag: lsw +Description: Seychelles Sign Language +Description: Lalang Siny Seselwa +Description: Langue des Signes Seychelloise +Added: 2022-02-25 +Preferred-Value: lsw +Prefix: sgn +%% +Type: extlang Subtag: lsy Description: Mauritian Sign Language Added: 2010-03-11 @@ -42905,6 +43941,13 @@ Prefix: lv Macrolanguage: lv %% Type: extlang +Subtag: lws +Description: Malawian Sign Language +Added: 2018-03-08 +Preferred-Value: lws +Prefix: sgn +%% +Type: extlang Subtag: lzh Description: Literary Chinese Added: 2009-07-29 @@ -43166,6 +44209,7 @@ Prefix: sgn %% Type: extlang Subtag: psc +Description: Iranian Sign Language Description: Persian Sign Language Added: 2009-07-29 Preferred-Value: psc @@ -43224,12 +44268,19 @@ Prefix: sgn Type: extlang Subtag: pys Description: Paraguayan Sign Language -Description: Lengua de Señas del Paraguay +Description: Lengua de Señas del Paraguay Added: 2010-03-11 Preferred-Value: pys Prefix: sgn %% Type: extlang +Subtag: rib +Description: Bribri Sign Language +Added: 2022-02-25 +Preferred-Value: rib +Prefix: sgn +%% +Type: extlang Subtag: rms Description: Romanian Sign Language Added: 2009-07-29 @@ -43237,9 +44288,17 @@ Preferred-Value: rms Prefix: sgn %% Type: extlang +Subtag: rnb +Description: Brunca Sign Language +Added: 2022-02-25 +Preferred-Value: rnb +Prefix: sgn +%% +Type: extlang Subtag: rsi Description: Rennellese Sign Language Added: 2009-07-29 +Deprecated: 2017-02-23 Preferred-Value: rsi Prefix: sgn %% @@ -43258,6 +44317,13 @@ Preferred-Value: rsm Prefix: sgn %% Type: extlang +Subtag: rsn +Description: Rwandan Sign Language +Added: 2022-02-25 +Preferred-Value: rsn +Prefix: sgn +%% +Type: extlang Subtag: sdl Description: Saudi Arabian Sign Language Added: 2009-07-29 @@ -43330,6 +44396,13 @@ Preferred-Value: sqs Prefix: sgn %% Type: extlang +Subtag: sqx +Description: Kufr Qassem Sign Language (KQSL) +Added: 2021-02-20 +Preferred-Value: sqx +Prefix: sgn +%% +Type: extlang Subtag: ssh Description: Shihhi Arabic Added: 2009-07-29 @@ -43390,6 +44463,13 @@ Preferred-Value: syy Prefix: sgn %% Type: extlang +Subtag: szs +Description: Solomon Islands Sign Language +Added: 2017-02-23 +Preferred-Value: szs +Prefix: sgn +%% +Type: extlang Subtag: tmw Description: Temuan Added: 2009-07-29 @@ -43407,7 +44487,7 @@ Prefix: sgn Type: extlang Subtag: tsm Description: Turkish Sign Language -Description: Türk Isaret Dili +Description: Türk Ä°ÅŸaret Dili Added: 2009-07-29 Preferred-Value: tsm Prefix: sgn @@ -43463,7 +44543,7 @@ Prefix: sgn %% Type: extlang Subtag: uks -Description: Urubú-Kaapor Sign Language +Description: Urubú-Kaapor Sign Language Description: Kaapor Sign Language Added: 2009-07-29 Preferred-Value: uks @@ -43540,6 +44620,13 @@ Preferred-Value: vsv Prefix: sgn %% Type: extlang +Subtag: wbs +Description: West Bengal Sign Language +Added: 2017-02-23 +Preferred-Value: wbs +Prefix: sgn +%% +Type: extlang Subtag: wuu Description: Wu Chinese Added: 2009-07-29 @@ -43581,18 +44668,19 @@ Subtag: yds Description: Yiddish Sign Language Added: 2009-07-29 Deprecated: 2015-02-12 +Preferred-Value: yds Prefix: sgn %% Type: extlang Subtag: ygs -Description: Yol?u Sign Language +Description: YolÅ‹u Sign Language Added: 2014-02-28 Preferred-Value: ygs Prefix: sgn %% Type: extlang Subtag: yhs -Description: Yan-nha?u Sign Language +Description: Yan-nhaÅ‹u Sign Language Added: 2015-04-17 Preferred-Value: yhs Prefix: sgn @@ -43605,6 +44693,13 @@ Preferred-Value: ysl Prefix: sgn %% Type: extlang +Subtag: ysm +Description: Myanmar Sign Language +Added: 2021-02-20 +Preferred-Value: ysm +Prefix: sgn +%% +Type: extlang Subtag: yue Description: Yue Chinese Description: Cantonese @@ -43784,6 +44879,16 @@ Description: Cherokee Added: 2005-10-16 %% Type: script +Subtag: Chis +Description: Chisoi +Added: 2023-10-16 +%% +Type: script +Subtag: Chrs +Description: Chorasmian +Added: 2019-09-11 +%% +Type: script Subtag: Cirt Description: Cirth Added: 2005-10-16 @@ -43794,8 +44899,13 @@ Description: Coptic Added: 2005-10-16 %% Type: script +Subtag: Cpmn +Description: Cypro-Minoan +Added: 2017-08-13 +%% +Type: script Subtag: Cprt -Description: Cypriot +Description: Cypriot syllabary Added: 2005-10-16 %% Type: script @@ -43815,6 +44925,11 @@ Description: Nagari Added: 2005-10-16 %% Type: script +Subtag: Diak +Description: Dives Akuru +Added: 2019-09-11 +%% +Type: script Subtag: Dogr Description: Dogra Added: 2017-01-13 @@ -43852,13 +44967,23 @@ Description: Elbasan Added: 2010-08-16 %% Type: script +Subtag: Elym +Description: Elymaic +Added: 2018-10-28 +%% +Type: script Subtag: Ethi Description: Ethiopic -Description: Ge?ez +Description: GeÊ»ez Description: Ge'ez Added: 2005-10-16 %% Type: script +Subtag: Gara +Description: Garay +Added: 2023-10-16 +%% +Type: script Subtag: Geok Description: Khutsuri (Asomtavruli and Nuskhuri) Added: 2005-10-16 @@ -43904,6 +45029,11 @@ Description: Gujarati Added: 2005-10-16 %% Type: script +Subtag: Gukh +Description: Gurung Khema +Added: 2023-10-16 +%% +Type: script Subtag: Guru Description: Gurmukhi Added: 2005-10-16 @@ -43916,7 +45046,7 @@ Added: 2016-02-08 Type: script Subtag: Hang Description: Hangul -Description: Hangul +Description: HangÅ­l Description: Hangeul Added: 2005-10-16 %% @@ -43931,7 +45061,7 @@ Added: 2005-10-16 Type: script Subtag: Hano Description: Hanunoo -Description: Hanunóo +Description: Hanunóo Added: 2005-10-16 %% Type: script @@ -43972,6 +45102,11 @@ Description: Pahawh Hmong Added: 2005-10-16 %% Type: script +Subtag: Hmnp +Description: Nyiakeng Puachue Hmong +Added: 2017-08-13 +%% +Type: script Subtag: Hrkt Description: Japanese syllabaries (alias for Hiragana + Katakana) Added: 2005-10-16 @@ -44024,6 +45159,11 @@ Description: Katakana Added: 2005-10-16 %% Type: script +Subtag: Kawi +Description: Kawi +Added: 2021-12-24 +%% +Type: script Subtag: Khar Description: Kharoshthi Added: 2005-10-16 @@ -44064,6 +45204,11 @@ Description: Kpelle Added: 2010-04-10 %% Type: script +Subtag: Krai +Description: Kirat Rai +Added: 2023-10-16 +%% +Type: script Subtag: Kthi Description: Kaithi Added: 2007-12-05 @@ -44102,7 +45247,7 @@ Added: 2015-07-24 Type: script Subtag: Lepc Description: Lepcha -Description: Róng +Description: Róng Added: 2005-10-16 %% Type: script @@ -44176,7 +45321,7 @@ Type: script Subtag: Medf Description: Medefaidrin Description: Oberi Okaime -Description: Oberi ?kaim? +Description: Oberi ƆkaimÉ› Added: 2017-01-13 %% Type: script @@ -44202,7 +45347,7 @@ Added: 2005-10-16 Type: script Subtag: Modi Description: Modi -Description: Mo?i +Description: Moá¸Ä« Added: 2013-12-02 %% Type: script @@ -44243,6 +45388,16 @@ Description: Burmese Added: 2005-10-16 %% Type: script +Subtag: Nagm +Description: Nag Mundari +Added: 2021-12-24 +%% +Type: script +Subtag: Nand +Description: Nandinagari +Added: 2018-10-28 +%% +Type: script Subtag: Narb Description: Old North Arabian Description: Ancient North Arabian @@ -44258,25 +45413,33 @@ Subtag: Newa Description: Newa Description: Newar Description: Newari -Description: Nepala lipi +Description: NepÄla lipi Added: 2016-01-04 %% Type: script +Subtag: Nkdb +Description: Naxi Dongba +Description: na²¹ɕi³³ to³³ba²¹ +Description: Nakhi Tomba +Added: 2017-08-13 +%% +Type: script Subtag: Nkgb -Description: Nakhi Geba -Description: 'Na-'Khi ²Ggo-¹baw Description: Naxi Geba +Description: na²¹ɕi³³ gʌ²¹ba²¹ +Description: 'Na-'Khi ²GgÅ-¹baw +Description: Nakhi Geba Added: 2009-03-13 %% Type: script Subtag: Nkoo -Description: N’Ko +Description: N’Ko Description: N'Ko Added: 2005-10-16 %% Type: script Subtag: Nshu -Description: Nüshu +Description: Nüshu Added: 2011-01-07 %% Type: script @@ -44293,6 +45456,11 @@ Description: Santali Added: 2006-07-21 %% Type: script +Subtag: Onao +Description: Ol Onal +Added: 2023-10-16 +%% +Type: script Subtag: Orkh Description: Old Turkic Description: Orkhon Runic @@ -44315,6 +45483,11 @@ Description: Osmanya Added: 2005-10-16 %% Type: script +Subtag: Ougr +Description: Old Uyghur +Added: 2021-02-12 +%% +Type: script Subtag: Palm Description: Palmyrene Added: 2010-04-10 @@ -44325,6 +45498,16 @@ Description: Pau Cin Hau Added: 2013-12-02 %% Type: script +Subtag: Pcun +Description: Proto-Cuneiform +Added: 2021-02-12 +%% +Type: script +Subtag: Pelm +Description: Proto-Elamite +Added: 2021-02-12 +%% +Type: script Subtag: Perm Description: Old Permic Added: 2005-10-16 @@ -44371,11 +45554,21 @@ Description: Inscriptional Parthian Added: 2007-12-05 %% Type: script +Subtag: Psin +Description: Proto-Sinaitic +Added: 2021-02-12 +%% +Type: script Subtag: Qaaa..Qabx Description: Private use Added: 2005-10-16 %% Type: script +Subtag: Ranj +Description: Ranjana +Added: 2021-02-12 +%% +Type: script Subtag: Rjng Description: Rejang Description: Redjang @@ -44383,6 +45576,11 @@ Description: Kaganga Added: 2006-10-17 %% Type: script +Subtag: Rohg +Description: Hanifi Rohingya +Added: 2017-12-13 +%% +Type: script Subtag: Roro Description: Rongorongo Added: 2005-10-16 @@ -44426,17 +45624,27 @@ Added: 2005-10-16 Type: script Subtag: Shrd Description: Sharada -Description: Sarada +Description: ÅšÄradÄ Added: 2011-01-07 %% Type: script +Subtag: Shui +Description: Shuishu +Added: 2017-08-13 +%% +Type: script Subtag: Sidd Description: Siddham -Description: Siddha? -Description: Siddhamat?ka +Description: Siddhaṃ +Description: SiddhamÄtá¹›kÄ Added: 2013-12-02 %% Type: script +Subtag: Sidt +Description: Sidetic +Added: 2023-10-16 +%% +Type: script Subtag: Sind Description: Khudawadi Description: Sindhi @@ -44448,6 +45656,16 @@ Description: Sinhala Added: 2005-10-16 %% Type: script +Subtag: Sogd +Description: Sogdian +Added: 2017-12-13 +%% +Type: script +Subtag: Sogo +Description: Old Sogdian +Added: 2017-12-13 +%% +Type: script Subtag: Sora Description: Sora Sompeng Added: 2011-01-07 @@ -44463,6 +45681,11 @@ Description: Sundanese Added: 2006-07-21 %% Type: script +Subtag: Sunu +Description: Sunuwar +Added: 2021-12-24 +%% +Type: script Subtag: Sylo Description: Syloti Nagri Added: 2005-10-16 @@ -44495,8 +45718,8 @@ Added: 2005-10-16 Type: script Subtag: Takr Description: Takri -Description: ?akri -Description: ?a?kri +Description: ṬÄkrÄ« +Description: ṬÄá¹…krÄ« Added: 2011-01-07 %% Type: script @@ -44525,6 +45748,11 @@ Description: Tai Viet Added: 2007-12-05 %% Type: script +Subtag: Tayo +Description: Tai Yo +Added: 2023-10-16 +%% +Type: script Subtag: Telu Description: Telugu Added: 2005-10-16 @@ -44568,6 +45796,31 @@ Description: Tirhuta Added: 2011-08-16 %% Type: script +Subtag: Tnsa +Description: Tangsa +Added: 2021-03-05 +%% +Type: script +Subtag: Todr +Description: Todhri +Added: 2023-10-16 +%% +Type: script +Subtag: Tols +Description: Tolong Siki +Added: 2023-10-16 +%% +Type: script +Subtag: Toto +Description: Toto +Added: 2020-05-12 +%% +Type: script +Subtag: Tutg +Description: Tulu-Tigalari +Added: 2023-10-16 +%% +Type: script Subtag: Ugar Description: Ugaritic Added: 2005-10-16 @@ -44583,12 +45836,22 @@ Description: Visible Speech Added: 2005-10-16 %% Type: script +Subtag: Vith +Description: Vithkuqi +Added: 2021-03-05 +%% +Type: script Subtag: Wara Description: Warang Citi Description: Varang Kshiti Added: 2009-12-09 %% Type: script +Subtag: Wcho +Description: Wancho +Added: 2017-08-13 +%% +Type: script Subtag: Wole Description: Woleai Added: 2011-01-07 @@ -44604,6 +45867,11 @@ Description: Sumero-Akkadian cuneiform Added: 2005-10-16 %% Type: script +Subtag: Yezi +Description: Yezidi +Added: 2019-09-11 +%% +Type: script Subtag: Yiii Description: Yi Added: 2005-10-16 @@ -44611,8 +45879,8 @@ Added: 2005-10-16 Type: script Subtag: Zanb Description: Zanabazar Square -Description: Zanabazarin Dörböljin Useg -Description: Xewtee Dörböljin Bicig +Description: Zanabazarin Dörböljin Useg +Description: Xewtee Dörböljin Bicig Description: Horizontal Square Script Added: 2017-01-13 %% @@ -44741,7 +46009,7 @@ Added: 2005-10-16 %% Type: region Subtag: AX -Description: Åland Islands +Description: Ã…land Islands Added: 2005-10-16 %% Type: region @@ -44796,7 +46064,7 @@ Added: 2005-10-16 %% Type: region Subtag: BL -Description: Saint Barthélemy +Description: Saint Barthélemy Added: 2007-11-02 %% Type: region @@ -44893,7 +46161,7 @@ Added: 2005-10-16 %% Type: region Subtag: CI -Description: Côte d'Ivoire +Description: Côte d'Ivoire Added: 2005-10-16 %% Type: region @@ -44927,6 +46195,11 @@ Description: Clipperton Island Added: 2009-07-29 %% Type: region +Subtag: CQ +Description: Sark +Added: 2023-02-07 +%% +Type: region Subtag: CR Description: Costa Rica Added: 2005-10-16 @@ -44951,7 +46224,7 @@ Added: 2005-10-16 %% Type: region Subtag: CW -Description: Curaçao +Description: Curaçao Added: 2011-01-07 %% Type: region @@ -45448,7 +46721,7 @@ Added: 2005-10-16 %% Type: region Subtag: MK -Description: The Former Yugoslav Republic of Macedonia +Description: North Macedonia Added: 2005-10-16 %% Type: region @@ -45679,7 +46952,7 @@ Added: 2005-10-16 %% Type: region Subtag: RE -Description: Réunion +Description: Réunion Added: 2005-10-16 %% Type: region @@ -45810,6 +47083,8 @@ Added: 2005-10-16 %% Type: region Subtag: SZ +Description: Eswatini +Description: eSwatini Description: Swaziland Added: 2005-10-16 %% @@ -45882,6 +47157,7 @@ Preferred-Value: TL %% Type: region Subtag: TR +Description: Türkiye Description: Turkey Added: 2005-10-16 %% @@ -46191,6 +47467,11 @@ Description: Western Europe Added: 2005-10-16 %% Type: region +Subtag: 202 +Description: Sub-Saharan Africa +Added: 2017-04-18 +%% +Type: region Subtag: 419 Description: Latin America and the Caribbean Added: 2005-10-16 @@ -46210,7 +47491,7 @@ Description: Early Modern French Added: 2007-03-20 Prefix: fr Comments: 17th century French, as catalogued in the "Dictionnaire de - l'académie françoise", 4eme ed. 1694; frequently includes + l'académie françoise", 4eme ed. 1694; frequently includes elements of Middle French, as this is a transitional period %% Type: variant @@ -46246,13 +47527,19 @@ Prefix: de Type: variant Subtag: abl1943 Description: Orthographic formulation of 1943 - Official in Brazil - (Formulário Ortográfico de 1943 - Oficial no Brasil) + (Formulário Ortográfico de 1943 - Oficial no Brasil) Added: 2015-05-06 Prefix: pt-BR Comments: Denotes conventions established by the Academia Brasileira de Letras in 1943 and generally used in Brazil until 2009 %% Type: variant +Subtag: akuapem +Description: Akuapem Twi +Added: 2017-06-05 +Prefix: tw +%% +Type: variant Subtag: alalc97 Description: ALA-LC Romanization, 1997 edition Added: 2009-12-09 @@ -46273,7 +47560,7 @@ Comments: Aluku dialect of the "Busi Nenge Tongo" English-based Creole Type: variant Subtag: ao1990 Description: Portuguese Language Orthographic Agreement of 1990 (Acordo - Ortográfico da Língua Portuguesa de 1990) + Ortográfico da Língua Portuguesa de 1990) Added: 2015-05-06 Prefix: pt Prefix: gl @@ -46281,16 +47568,49 @@ Comments: Portuguese orthography conventions established in 1990 but not brought into effect until 2009 %% Type: variant +Subtag: aranes +Description: Aranese +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in the Val d'Aran +%% +Type: variant Subtag: arevela Description: Eastern Armenian Added: 2006-09-18 +Deprecated: 2018-03-24 Prefix: hy +Comments: Preferred tag is hy %% Type: variant Subtag: arevmda Description: Western Armenian Added: 2006-09-18 +Deprecated: 2018-03-24 Prefix: hy +Comments: Preferred tag is hyw +%% +Type: variant +Subtag: arkaika +Description: Arcaicam Esperantom +Description: Arkaika Esperanto +Added: 2020-12-17 +Prefix: eo +Comments: Archaic Esperanto variant devised by Manuel Halvelik +%% +Type: variant +Subtag: asante +Description: Asante Twi +Description: Ashanti Twi +Added: 2017-06-05 +Prefix: tw +%% +Type: variant +Subtag: auvern +Description: Auvergnat +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Auvergne %% Type: variant Subtag: baku1926 @@ -46309,9 +47629,9 @@ Prefix: uz Comments: Denotes alphabet used in Turkic republics/regions of the former USSR in late 1920s, and throughout 1930s, which aspired to represent equivalent phonemes in a unified fashion. Also known as: New - Turkic Alphabet; Birl?sdirilmis Jeni Tyrk - ?lifbas? (Birlesdirilmis Jeni Tyrk Elifbasi); - Ja?alif (Janalif). + Turkic Alphabet; BirlәşdirilmiÅŸ Jeni Tyrk + Ó˜lifbasÑŒ (Birlesdirilmis Jeni Tyrk Elifbasi); + JaÅ‹alif (Janalif). %% Type: variant Subtag: balanka @@ -46341,6 +47661,23 @@ Added: 2010-07-28 Prefix: sa %% Type: variant +Subtag: bciav +Description: BCI Blissymbolics AV +Added: 2023-05-11 +Prefix: zbl +Comments: Name given to a subset of the variety of Blissymbolics curated + by Blissymbolics Communication International, as represented by + entries in the BCI Authorized Vocabulary +%% +Type: variant +Subtag: bcizbl +Description: BCI Blissymbolics +Added: 2023-05-11 +Prefix: zbl +Comments: Name given to the variety of Blissymbolics curated by + Blissymbolics Communication International +%% +Type: variant Subtag: biscayan Description: Biscayan dialect of Basque Added: 2010-04-13 @@ -46356,11 +47693,20 @@ Comments: The dialect of San Giorgio/Bila is one of the four major local dialects of Resian %% Type: variant +Subtag: blasl +Description: Black American Sign Language dialect +Added: 2023-07-31 +Prefix: ase +Prefix: sgn-ase +Comments: Black American Sign Language (BASL) or Black Sign Variation + (BSV) is a dialect of American Sign Language (ASL) +%% +Type: variant Subtag: bohoric -Description: Slovene in Bohoric alphabet +Description: Slovene in BohoriÄ alphabet Added: 2012-06-27 Prefix: sl -Comments: The subtag represents the alphabet codified by Adam Bohoric +Comments: The subtag represents the alphabet codified by Adam BohoriÄ in 1584 and used from the first printed Slovene book and up to the mid-19th century. %% @@ -46372,9 +47718,22 @@ Prefix: en Comments: Jargon embedded in American English %% Type: variant +Subtag: bornholm +Description: Bornholmsk +Added: 2019-03-27 +Prefix: da +%% +Type: variant +Subtag: cisaup +Description: Cisalpine +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in northwestern Italy +%% +Type: variant Subtag: colb1945 Description: Portuguese-Brazilian Orthographic Convention of 1945 - (Convenção Ortográfica Luso-Brasileira de 1945) + (Convenção Ortográfica Luso-Brasileira de 1945) Added: 2015-05-06 Prefix: pt Comments: Portuguese orthography conventions established in 1945, @@ -46390,6 +47749,12 @@ Added: 2015-12-07 Prefix: en %% Type: variant +Subtag: creiss +Description: Occitan variants of the Croissant area +Added: 2018-04-22 +Prefix: oc +%% +Type: variant Subtag: dajnko Description: Slovene in Dajnko alphabet Added: 2012-06-27 @@ -46418,6 +47783,11 @@ Description: International Phonetic Alphabet Added: 2006-12-11 %% Type: variant +Subtag: fonkirsh +Description: Kirshenbaum Phonetic Alphabet +Added: 2018-04-22 +%% +Type: variant Subtag: fonnapa Description: North American Phonetic Alphabet Description: Americanist Phonetic Notation @@ -46435,6 +47805,65 @@ Added: 2010-10-23 Comments: Indicates that the content is transcribed according to X-SAMPA %% Type: variant +Subtag: gallo +Description: Gallo +Added: 2021-08-05 +Prefix: fr +%% +Type: variant +Subtag: gascon +Description: Gascon +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Gascony +%% +Type: variant +Subtag: grclass +Description: Classical Occitan orthography +Added: 2018-04-22 +Prefix: oc +Prefix: oc-aranes +Prefix: oc-auvern +Prefix: oc-cisaup +Prefix: oc-creiss +Prefix: oc-gascon +Prefix: oc-lemosin +Prefix: oc-lengadoc +Prefix: oc-nicard +Prefix: oc-provenc +Prefix: oc-vivaraup +Comments: Classical written standard for Occitan developed in 1935 by + Alibèrt +%% +Type: variant +Subtag: grital +Description: Italian-inspired Occitan orthography +Added: 2018-04-22 +Prefix: oc +Prefix: oc-cisaup +Prefix: oc-nicard +Prefix: oc-provenc +%% +Type: variant +Subtag: grmistr +Description: Mistralian or Mistralian-inspired Occitan orthography +Added: 2018-04-22 +Prefix: oc +Prefix: oc-aranes +Prefix: oc-auvern +Prefix: oc-cisaup +Prefix: oc-creiss +Prefix: oc-gascon +Prefix: oc-lemosin +Prefix: oc-lengadoc +Prefix: oc-nicard +Prefix: oc-provenc +Prefix: oc-vivaraup +Comments: Written standard developed by Romanilha in 1853 and used by + Mistral and the Félibres, including derived standards such as Escolo + dóu Po, Escolo Gaston Febus, and others +%% +Type: variant Subtag: hepburn Description: Hepburn romanization Added: 2009-10-01 @@ -46451,13 +47880,20 @@ Comments: Preferred tag is ja-Latn-alalc97 %% Type: variant Subtag: hognorsk -Description: Norwegian in Høgnorsk (High Norwegian) orthography +Description: Norwegian in Høgnorsk (High Norwegian) orthography Added: 2010-01-02 Prefix: nn Comments: Norwegian following Ivar Aasen's orthographical principles, including modern usage. %% Type: variant +Subtag: hsistemo +Description: Standard H-system orthographic fallback for spelling + Esperanto +Added: 2017-03-14 +Prefix: eo +%% +Type: variant Subtag: ijekavsk Description: Serbian with Ijekavian pronunciation Prefix: sr @@ -46472,11 +47908,18 @@ Added: 2010-07-28 Prefix: sa %% Type: variant +Subtag: ivanchov +Description: Bulgarian in 1899 orthography +Added: 2017-12-13 +Prefix: bg +Comments: Bulgarian orthography introduced by Todor Ivanchov in 1899 +%% +Type: variant Subtag: jauer Description: Jauer dialect of Romansh Added: 2010-06-29 Prefix: rm -Comments: The spoken dialect of the Val Müstair, which has no written +Comments: The spoken dialect of the Val Müstair, which has no written standard. %% Type: variant @@ -46498,7 +47941,7 @@ Description: The Kociewie dialect of Polish Added: 2014-11-27 Prefix: pl Comments: The dialect of Kociewie is spoken in the region around - Starogard Gdanski, Tczew and Swiecie in northern Poland. + Starogard GdaÅ„ski, Tczew and Åšwiecie in northern Poland. %% Type: variant Subtag: kscor @@ -46514,6 +47957,20 @@ Added: 2010-07-28 Prefix: sa %% Type: variant +Subtag: lemosin +Description: Limousin +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Limousin +%% +Type: variant +Subtag: lengadoc +Description: Languedocien +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Languedoc +%% +Type: variant Subtag: lipaw Description: The Lipovaz dialect of Resian Description: The Lipovec dialect of Resian @@ -46523,6 +47980,19 @@ Comments: The dialect of Lipovaz/Lipovec is one of the minor local dialects of Resian %% Type: variant +Subtag: ltg1929 +Description: The Latgalian language orthography codified in 1929 +Added: 2022-08-05 +Prefix: ltg +%% +Type: variant +Subtag: ltg2007 +Description: The Latgalian language orthography codified in the language + law in 2007 +Added: 2022-06-23 +Prefix: ltg +%% +Type: variant Subtag: luna1918 Description: Post-1917 Russian orthography Added: 2010-10-10 @@ -46567,6 +48037,13 @@ Added: 2015-11-25 Prefix: en-CA %% Type: variant +Subtag: nicard +Description: Niçard +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Nice +%% +Type: variant Subtag: njiva Description: The Gniva dialect of Resian Description: The Njiva dialect of Resian @@ -46577,13 +48054,13 @@ Comments: The dialect of Gniva/Njiva is one of the four major local %% Type: variant Subtag: nulik -Description: Volapük nulik -Description: Volapük perevidöl -Description: Volapük nulädik -Description: de Jong's Volapük -Description: New Volapük -Description: Revised Volapük -Description: Modern Volapük +Description: Volapük nulik +Description: Volapük perevidöl +Description: Volapük nulädik +Description: de Jong's Volapük +Description: New Volapük +Description: Revised Volapük +Description: Modern Volapük Added: 2012-01-28 Prefix: vo %% @@ -46632,6 +48109,16 @@ Comments: Pamaka dialect of the "Busi Nenge Tongo" English-based Creole continuum in Eastern Suriname and Western French Guiana %% Type: variant +Subtag: peano +Description: Latino Sine Flexione +Description: Interlingua de API +Description: Interlingua de Peano +Prefix: la +Comments: Peano’s Interlingua, created in 1903 by Giuseppe Peano as an + international auxiliary language +Added: 2020-03-12 +%% +Type: variant Subtag: petr1708 Description: Petrine orthography Added: 2010-10-10 @@ -46653,6 +48140,13 @@ Added: 2006-12-11 Prefix: el %% Type: variant +Subtag: provenc +Description: Provençal +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in Provence +%% +Type: variant Subtag: puter Description: Puter idiom of Romansh Added: 2010-06-29 @@ -46662,10 +48156,10 @@ Comments: Puter is one of the five traditional written standards or %% Type: variant Subtag: rigik -Description: Volapük rigik -Description: Schleyer's Volapük -Description: Original Volapük -Description: Classic Volapük +Description: Volapük rigik +Description: Schleyer's Volapük +Description: Original Volapük +Description: Classic Volapük Added: 2012-01-28 Prefix: vo %% @@ -46720,6 +48214,14 @@ Comments: Sotavento is one of the two main dialect groups of Added: 2013-12-10 %% Type: variant +Subtag: spanglis +Description: Spanglish +Added: 2017-02-23 +Prefix: en +Prefix: es +Comments: A variety of contact dialects of English and Spanish +%% +Type: variant Subtag: surmiran Description: Surmiran idiom of Romansh Added: 2010-06-29 @@ -46744,6 +48246,13 @@ Comments: Sutsilvan is one of the five traditional written standards or "idioms" of the Romansh language. %% Type: variant +Subtag: synnejyl +Description: Synnejysk +Description: South Jutish +Added: 2021-07-17 +Prefix: da +%% +Type: variant Subtag: tarask Description: Belarusian in Taraskievica orthography Added: 2007-04-27 @@ -46754,6 +48263,23 @@ Comments: The subtag represents Branislau Taraskievic's Belarusian Miensk 2005). %% Type: variant +Subtag: tongyong +Description: Tongyong Pinyin romanization +Added: 2020-06-08 +Prefix: zh-Latn +Comments: Former official transcription standard for Mandarin Chinese in + Taiwan. +%% +Type: variant +Subtag: tunumiit +Description: Tunumiisiut +Description: East Greenlandic +Description: Østgrønlandsk +Added: 2020-07-16 +Prefix: kl +Comments: Also known as Tunumiit oraasiat +%% +Type: variant Subtag: uccor Description: Unified Cornish orthography of Revived Cornish Added: 2008-10-14 @@ -46806,11 +48332,33 @@ Comments: Vallader is one of the five traditional written standards or "idioms" of the Romansh language. %% Type: variant +Subtag: vecdruka +Description: Latvian orthography used before 1920s ("vecÄ druka") +Added: 2020-09-26 +Prefix: lv +Comments: The subtag represents the old orthography of the Latvian + language used during c. 1600s–1920s. +%% +Type: variant +Subtag: vivaraup +Description: Vivaro-Alpine +Added: 2018-04-22 +Prefix: oc +Comments: Occitan variant spoken in northeastern Occitania +%% +Type: variant Subtag: wadegile Description: Wade-Giles romanization Added: 2008-10-03 Prefix: zh-Latn %% +Type: variant +Subtag: xsistemo +Description: Standard X-system orthographic fallback for spelling + Esperanto +Added: 2017-03-14 +Prefix: eo +%% Type: grandfathered Tag: art-lojban Description: Lojban @@ -47372,4 +48920,4 @@ Tag: zh-yue Description: Cantonese Added: 1999-12-18 Deprecated: 2009-07-29 -Preferred-Value: yue +Preferred-Value: yue \ No newline at end of file diff --git a/exec/pack/linux/get-openssl.sh b/exec/pack/linux/get-openssl.sh new file mode 100644 index 000000000..43a156fc9 --- /dev/null +++ b/exec/pack/linux/get-openssl.sh @@ -0,0 +1,30 @@ +OPENSSL_DIR=${OPENSSL_DIR:-"/tmp/openssl"} + +apt update && apt install -y libgtk2.0-0 + + +# Check if OpenSSL is not installed +if [ ! -d $OPENSSL_DIR ]; then + echo "OpenSSL not found in $OPENSSL_DIR. Installing..." + apt install -y build-essential + + # Download and build OpenSSL 1.1.1w + pushd /tmp + wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz + tar -xf openssl-1.1.1w.tar.gz + cd openssl-1.1.1w + + ./config --prefix=$OPENSSL_DIR --openssldir=$OPENSSL_DIR + make + make test + make install + popd + + echo "OpenSSL installation completed." +else + echo "OpenSSL is already installed in $OPENSSL_DIR." +fi + + cp $OPENSSL_DIR/lib/*.so* . + + diff --git a/exec/pack/linux/install.sh b/exec/pack/linux/install.sh new file mode 100644 index 000000000..47f6130e1 --- /dev/null +++ b/exec/pack/linux/install.sh @@ -0,0 +1,73 @@ +#!/bin/bash +cd "$(dirname "$0")" + +# Detect architecture +ARCH=$(uname -m) + +INSTALL_PATH=${INSTALL_PATH:-"$HOME/fhirserver"} +CACHE_FOLDER=${CACHE_FOLDER:-"/var/cache/txcache"} +ARM_FILES=./arm_64 +X86_64_FILES=./x86_64 + +set -x + +# Function to run commands with sudo only if not root +run_as_root() { + if [ "$(id -u)" -ne 0 ]; then + sudo "$@" + else + "$@" + fi +} + +run_as_root apt update && run_as_root apt install -y wget tzdata xvfb libgtk2.0-0 libsqlite3-dev curl + +mkdir -p $INSTALL_PATH +mkdir -p $INSTALL_PATH/config +mkdir -p $INSTALL_PATH/default_config +run_as_root mkdir -p $CACHE_FOLDER +run_as_root chmod 1777 $CACHE_FOLDER + +cp bin/* $INSTALL_PATH +cp content/* $INSTALL_PATH +# cp -r config/* $INSTALL_PATH +# cp -r config/config/* $INSTALL_PATH/config +cp -r config/* $INSTALL_PATH/config +cp -r default_config/* $INSTALL_PATH/default_config +cp -r web $INSTALL_PATH + +# Files based on architecture +case $ARCH in + x86_64) + cp $X86_64_FILES/* $INSTALL_PATH + ;; + arm*) + cp $ARM_FILES/* $INSTALL_PATH + ;; + *) + echo "Unsupported architecture: $ARCH" + exit 1 + ;; +esac + +# Create link so that the server can be started from anywhere +ln -s $INSTALL_PATH/start.sh /usr/local/bin/fhirserver + +# Copy the default configuration file +cp "$INSTALL_PATH/default_config/config.json" "$INSTALL_PATH/default_config/config.json" + +# Prepare and install the systemd service file but do not enable or start it +SERVICE_FILE="/etc/systemd/system/fhirserver.service" +echo "[Unit] +Description=FHIR Server + +[Service] +ExecStart=$INSTALL_PATH/fhirserver +# Add other service configurations as needed + +[Install] +WantedBy=multi-user.target" | run_as_root tee $SERVICE_FILE > /dev/null + +echo "Installation to $INSTALL_PATH completed." + +cd $INSTALL_PATH \ No newline at end of file diff --git a/exec/pack/linux/start.sh b/exec/pack/linux/start.sh new file mode 100644 index 000000000..f7e4aedba --- /dev/null +++ b/exec/pack/linux/start.sh @@ -0,0 +1,61 @@ +#!/bin/bash +set -e + +# Determine the directory where this script is located (this will be $HOME/fhirserver) +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SERVICE_FILE="/etc/systemd/system/fhirserver.service" + +# Function to start Xvfb +start_xvfb() { + Xvfb :99 -screen 0 1024x768x8 -nolisten tcp & + sleep 2 # Give some time for Xvfb to start +} + +# Function to stop Xvfb +stop_xvfb() { + pkill Xvfb || true +} + +trap stop_xvfb EXIT + +rm -f /tmp/.X99-lock +start_xvfb +export DISPLAY=:99 + +# Parse command-line arguments +DAEMON_MODE="" + +for arg in "$@"; do + case $arg in + -daemon) + DAEMON_MODE="enable" + ;; + -nodaemon) + DAEMON_MODE="disable" + ;; + esac +done + +# Determine which config.ini to use +if [ -f "$SCRIPT_DIR/config/config.ini" ]; then + CONFIG_FILE="$SCRIPT_DIR/config/config.ini" +else + CONFIG_FILE="$SCRIPT_DIR/default_config/config.ini" +fi + +if [ ! -f "$SCRIPT_DIR/config/config.json" ]; then + cp "$SCRIPT_DIR/default_config/config.json" "$SCRIPT_DIR/config/config.json" + echo "File copied successfully." +fi + +# Handle daemon management +if [ "$DAEMON_MODE" == "enable" ]; then + sudo systemctl enable fhirserver.service + sudo systemctl start fhirserver.service +elif [ "$DAEMON_MODE" == "disable" ]; then + sudo systemctl stop fhirserver.service || true + sudo systemctl disable fhirserver.service || true +fi + +# Start the FHIR server using the determined config file +exec "$SCRIPT_DIR/fhirserver" -cmd exec -cfg "$CONFIG_FILE" diff --git a/exec/pack/web.ini b/exec/pack/web.ini new file mode 100644 index 000000000..c40ba4601 --- /dev/null +++ b/exec/pack/web.ini @@ -0,0 +1,2 @@ +[web] +htttp=80 diff --git a/grafana/config-grafana-observability.json b/grafana/config-grafana-observability.json new file mode 100644 index 000000000..6d92e8000 --- /dev/null +++ b/grafana/config-grafana-observability.json @@ -0,0 +1,1552 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 39, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 10, + "panels": [], + "title": "Health Server", + "type": "row" + }, + { + "datasource": { + "type": "marcusolsson-csv-datasource", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0-65875", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": false, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "Total Requests", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Requests", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 20, + "x": 4, + "y": 1 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "hide": false, + "ignoreUnknown": true, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "Request Count", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Request x Time", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss ", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "marcusolsson-csv-datasource", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 0, + "y": 6 + }, + "id": 15, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0-65875", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": false, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "AverageTAT", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Average TAT", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "marcusolsson-csv-datasource", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 20, + "x": 4, + "y": 6 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "hide": false, + "ignoreUnknown": true, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "AverageTAT", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Average TAT x Time", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss ", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 70 + }, + { + "color": "red", + "value": 85 + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 11 + }, + "id": 6, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.0-65875", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": false, + "refId": "A", + "schema": [ + { + "name": "Threads", + "type": "number" + } + ], + "skipRows": 0 + } + ], + "title": "Threads", + "transformations": [ + { + "id": "convertFieldType", + "options": {} + } + ], + "type": "gauge" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "text", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 20, + "x": 4, + "y": 11 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "hide": false, + "ignoreUnknown": true, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "Threads", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Thread x Time", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green" + }, + { + "color": "orange", + "value": 70 + }, + { + "color": "red", + "value": 85 + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 0, + "y": 17 + }, + "id": 4, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "/^Memory$/", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.0-65875", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": false, + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "Memory", + "type": "number" + } + ], + "skipRows": 0 + } + ], + "title": "Memory", + "transformations": [ + { + "id": "convertFieldType", + "options": {} + }, + { + "id": "calculateField", + "options": { + "alias": "Memory", + "binary": { + "left": "Memory", + "operator": "/", + "reducer": "sum", + "right": "1000000" + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + }, + "replaceFields": true + } + } + ], + "type": "gauge" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "text", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisWidth": 100, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green" + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 20, + "x": 4, + "y": 17 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "body": "", + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "headers": [], + "hide": false, + "ignoreUnknown": false, + "key": "Q-b229036c-4562-4159-9b48-21b8caf02dca-0", + "params": [ + [ + "", + "" + ] + ], + "path": "", + "queryParams": "", + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "Memory", + "type": "number" + } + ], + "skipRows": 0, + "timezone": "UTC" + } + ], + "title": "Memory x Time", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + }, + { + "id": "calculateField", + "options": { + "alias": "Memory", + "binary": { + "left": "Memory", + "operator": "/", + "reducer": "sum", + "right": "1000000" + }, + "mode": "binary", + "reduce": { + "include": [ + "Memory" + ], + "reducer": "sum" + }, + "replaceFields": true + } + } + ], + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 11, + "panels": [], + "title": "Cache Control", + "type": "row" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Count" + }, + "properties": [ + { + "id": "custom.drawStyle", + "value": "bars" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.drawStyle", + "value": "line" + }, + { + "id": "custom.axisLabel" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 100 + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": true, + "params": [ + [ + "", + "" + ] + ], + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "HTTPCacheCount", + "type": "number" + }, + { + "name": "HTTPCacheSize", + "type": "number" + } + ], + "skipRows": 0 + } + ], + "title": " HTTP", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + }, + { + "id": "calculateField", + "options": { + "alias": "Size (MB)", + "binary": { + "left": "HTTPCacheSize", + "operator": "/", + "reducer": "sum", + "right": "1000000" + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + }, + "replaceFields": false + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "HTTPCacheCount": false, + "HTTPCacheSize": true + }, + "indexByName": {}, + "renameByName": { + "HTTPCacheCount": "Count", + "HTTPCacheSize": "", + "HTTPCacheSize / 1024": "Size" + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Count" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.drawStyle", + "value": "line" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Objects" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 100 + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": true, + "params": [ + [ + "", + "" + ] + ], + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "ClientCacheCount", + "type": "number" + }, + { + "name": "ClientCacheSize", + "type": "number" + }, + { + "name": "ClientCacheObjectCount", + "type": "number" + } + ], + "skipRows": 0 + } + ], + "title": "Client", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + }, + { + "id": "calculateField", + "options": { + "alias": "Size (MB)", + "binary": { + "left": "ClientCacheSize", + "operator": "/", + "reducer": "sum", + "right": "1000000" + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + }, + "replaceFields": false + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "ClientCacheObjectCount": false, + "ClientCacheSize": true, + "HTTPCacheCount": false, + "HTTPCacheSize": true + }, + "indexByName": {}, + "renameByName": { + "ClientCacheCount": "Count", + "ClientCacheObjectCount": "Objects", + "HTTPCacheCount": "Count", + "HTTPCacheSize": "", + "HTTPCacheSize / 1024": "Size" + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "axisWidth": 100, + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Count" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.drawStyle", + "value": "line" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Objects" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 35 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 100 + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "txstats", + "uid": "d5f1471f-eb0a-49e7-abd5-2061f5b5b6a6" + }, + "decimalSeparator": ".", + "delimiter": "\t", + "header": true, + "ignoreUnknown": true, + "params": [ + [ + "", + "" + ] + ], + "refId": "A", + "schema": [ + { + "name": "Date/Time", + "type": "string" + }, + { + "name": "ClientCacheCount", + "type": "number" + }, + { + "name": "ClientCacheSize", + "type": "number" + }, + { + "name": "ClientCacheObjectCount", + "type": "number" + } + ], + "skipRows": 0 + } + ], + "title": "Cache Client", + "transformations": [ + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "dateFormat": "MM/DD/YYYY hh:mm:ss", + "destinationType": "time", + "targetField": "Date/Time" + } + ], + "fields": {} + } + }, + { + "id": "calculateField", + "options": { + "alias": "Size (MB)", + "binary": { + "left": "ClientCacheSize", + "operator": "/", + "reducer": "sum", + "right": "1000000" + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + }, + "replaceFields": false + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "ClientCacheObjectCount": false, + "ClientCacheSize": true, + "HTTPCacheCount": false, + "HTTPCacheSize": true + }, + "indexByName": {}, + "renameByName": { + "ClientCacheCount": "Count", + "ClientCacheObjectCount": "Objects", + "HTTPCacheCount": "Count", + "HTTPCacheSize": "", + "HTTPCacheSize / 1024": "Size" + } + } + } + ], + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Health Server tx.fhir", + "uid": "c6f14ca0-d24c-4700-98c7-8a3235f2c15c", + "version": 9, + "weekStart": "" +} diff --git a/install/install-tk.iss b/install/install-tk.iss index 34eef072a..d74567039 100644 --- a/install/install-tk.iss +++ b/install/install-tk.iss @@ -3,11 +3,11 @@ ; AppID can never be changed as subsequent installations require the same installation ID each time AppID=FHIRToolkit AppName=Health Intersections FHIR Toolkit -AppVerName=FHIRToolkit v2.0.12 +AppVerName=FHIRToolkit v3.4.11 ; compilation control OutputDir=..\install\build -OutputBaseFilename=fhirtoolkit-win64-2.0.12 +OutputBaseFilename=fhirtoolkit-win64-3.4.11 Compression=lzma2/ultra64 ; 64 bit @@ -32,11 +32,11 @@ UninstallFilesDir={app}\uninstall ; win2000+ add/remove programs support AppPublisher=Health Intersections P/L AppPublisherURL=http://www.healthintersections.com.au -AppVersion=2.0.12 +AppVersion=3.4.11 AppSupportURL=https://github.com/grahamegrieve/fhirserver AppUpdatesURL=https://github.com/grahamegrieve/fhirserver AppCopyright=Copyright (c) Health Intersections Pty Ltd 2020+ -VersionInfoVersion=2.0.12.0 +VersionInfoVersion=3.4.11.0 ; dialog support LicenseFile=..\license diff --git a/install/install.iss b/install/install.iss index 6a622d672..6dfb7ed5f 100644 --- a/install/install.iss +++ b/install/install.iss @@ -3,11 +3,11 @@ ; AppID can never be changed as subsequent installations require the same installation ID each time AppID=FHIRServer AppName=Health Intersections FHIR Server -AppVerName=FHIRServer v2.0.12 +AppVerName=FHIRServer v3.4.11 ; compilation control OutputDir=..\install\build -OutputBaseFilename=fhirserver-win64-2.0.12 +OutputBaseFilename=fhirserver-win64-3.4.11 Compression=lzma2/ultra64 ; 64 bit @@ -22,7 +22,7 @@ ChangesAssociations=yes DirExistsWarning=auto DisableStartUpPrompt=yes MinVersion=0,6.1 -UninstallDisplayIcon=..\Server\fhir.ico +UninstallDisplayIcon=..\Server\fhirserver.ico WizardStyle=modern DisableDirPage=false @@ -34,11 +34,11 @@ UninstallFilesDir={app}\uninstall ; win2000+ add/remove programs support AppPublisher=Health Intersections P/L AppPublisherURL=http://www.healthintersections.com.au -AppVersion=2.0.12 +AppVersion=3.4.11 AppSupportURL=https://github.com/grahamegrieve/fhirserver AppUpdatesURL=https://github.com/grahamegrieve/fhirserver AppCopyright=Copyright (c) Health Intersections Pty Ltd 2011+ -VersionInfoVersion=2.0.12.0 +VersionInfoVersion=3.4.11.0 ; dialog support LicenseFile=..\license @@ -108,6 +108,7 @@ Source: "..\exec\pack\ucum.dat"; DestDir: "{app}"; Source: "..\exec\pack\lang.dat"; DestDir: "{app}"; Flags: ignoreversion Source: "..\exec\pack\tz.dat"; DestDir: "{app}"; Flags: ignoreversion Source: "..\exec\pack\fhir-lang.dat"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\exec\pack\*.properties"; DestDir: "{app}"; Flags: ignoreversion ; 4. Documentation Source: "..\license"; DestDir: "{app}\doco"; Flags: ignoreversion; DestName: "license.txt"; diff --git a/ipsmanager/forms/frm_home.pas b/ipsmanager/forms/frm_home.pas index f7cdc9c6e..898250d40 100644 --- a/ipsmanager/forms/frm_home.pas +++ b/ipsmanager/forms/frm_home.pas @@ -1,5 +1,33 @@ unit frm_home; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface diff --git a/ipsmanager/ipsmanager.lpi b/ipsmanager/ipsmanager.lpi index 9ff5ed34b..a75e72f11 100644 --- a/ipsmanager/ipsmanager.lpi +++ b/ipsmanager/ipsmanager.lpi @@ -422,11 +422,12 @@ - + + @@ -508,12 +509,10 @@ - - @@ -561,7 +560,7 @@ - + diff --git a/ipsmanager/ipsmanager.lpr b/ipsmanager/ipsmanager.lpr index 1ea0e4c41..26d56a485 100644 --- a/ipsmanager/ipsmanager.lpr +++ b/ipsmanager/ipsmanager.lpr @@ -23,10 +23,10 @@ begin RequireDerivedFormResource := True; - Application.Title := 'Patient Summary Manager'; - Application.Scaled := True; + Application.Scaled:=True; Application.Initialize; Application.CreateForm(TIPSManagerForm, IPSManagerForm); Application.Run; end. + diff --git a/ipsmanager/views/mvbase.pas b/ipsmanager/views/mvbase.pas index ac99535a2..518c1d1df 100644 --- a/ipsmanager/views/mvbase.pas +++ b/ipsmanager/views/mvbase.pas @@ -1,5 +1,33 @@ unit mvbase; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface diff --git a/ipsmanager/views/mvdatasources.pas b/ipsmanager/views/mvdatasources.pas index 13b1bd332..3296b6498 100644 --- a/ipsmanager/views/mvdatasources.pas +++ b/ipsmanager/views/mvdatasources.pas @@ -1,5 +1,33 @@ unit mvdatasources; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface diff --git a/library/cda/cda_base.pas b/library/cda/cda_base.pas index 78e653e39..11b6c048c 100644 --- a/library/cda/cda_base.pas +++ b/library/cda/cda_base.pas @@ -463,6 +463,7 @@ constructor Tv3PropertyValueStringCollection.Create(aType: TRMPropertyDefinition var iLoop : Integer; begin +! FValue := TWideStringList.Create; if sValues <> '' Then FValue.Text := sValues; @@ -734,7 +735,7 @@ constructor Tv3PropertyDefinition.CreateBoolean(oOwner: Tv3Base; bIsStructural : FCollectionState := rmpctNone; FIsStructural := bIsStructural; if bHasValue Then - FValueString := BoolToStr(bValue); + FValueString := BoolToStr(bValue, true).ToLower; end; @@ -1001,7 +1002,9 @@ function Tv3Base.BuildSet(var aSet; const aCodes: array of String): String; While oIterator.More Do Begin If oIterator.Checked Then - oBuilder.Append(aCodes[oIterator.Index]+ crlf); + begin + oBuilder.AppendLine(aCodes[oIterator.Index]); + end; oIterator.Next; End; diff --git a/library/cda/cda_documents.pas b/library/cda/cda_documents.pas index b44967b24..9281e2d52 100644 --- a/library/cda/cda_documents.pas +++ b/library/cda/cda_documents.pas @@ -747,7 +747,10 @@ function TCDADocument.RenderPatientIdentifiers: String; ei := rt.patientRole.patient.asEntityIdentifier[j]; s.Append(', '); if (ei.id.identifierName = '') and (ei.code <> nil) then - s.Append(ei.code.render+': '); + begin + s.Append(ei.code.render); + s.Append(': '); + end; s.Append(ei.id.render); end; for j := 0 to rt.patientRole.id.Count - 1 do diff --git a/library/cda/cda_writer.pas b/library/cda/cda_writer.pas index f9d3260bb..92b6bfd6c 100644 --- a/library/cda/cda_writer.pas +++ b/library/cda/cda_writer.pas @@ -301,7 +301,7 @@ procedure TCDAWriter.WriteCDA(oXml: TXmlBuilder; oDoc: TcdaClinicalDocument); Procedure TCDAWriter.WriteANYAttributes(Const sPath: string; oXml : TXmlBuilder; oDT : Tv3ANY); Begin - Attribute(sPath, oXml, 'nullFLavor', writeNullFlavor(sPath, oDt.NullFlavor), true); + Attribute(sPath, oXml, 'nullFlavor', writeNullFlavor(sPath, oDt.NullFlavor), true); // ignore updateMode and flavorId for now End; @@ -316,7 +316,7 @@ procedure TCDAWriter.WriteCDA(oXml: TXmlBuilder; oDoc: TcdaClinicalDocument); WriteComments(oXml, oDT); WriteANYAttributes(sPath, oXml, oDT); if oDT.HasValue Then - Attribute(sPath, oXml, 'value', BoolToStr(oDT.value), true); + Attribute(sPath, oXml, 'value', BoolToStr(oDT.value, true).ToLower, true); oDT.sourcelocation := oXml.Tag(sName); End; @@ -349,7 +349,7 @@ procedure TCDAWriter.WriteCDA(oXml: TXmlBuilder; oDoc: TcdaClinicalDocument); Attribute(sPath, oXml, 'extension', oDT.extension, true); Attribute(sPath, oXml, 'assigningAuthorityName', oDT.identifierName, true); if oDT.hasDisplayable Then - Attribute(sPath, oXml, 'displayable', BoolToStr(oDT.displayable), true); + Attribute(sPath, oXml, 'displayable', BoolToStr(oDT.displayable, true).ToLower, true); Attribute(sPath, oXml, 'scope', CODES_Tv3IdentifierScope[oDT.scope], true); Attribute(sPath, oXml, 'reliability', CODES_Tv3IdentifierReliability[oDT.reliability], true); oDT.sourcelocation := oXml.Tag(sName); @@ -961,7 +961,7 @@ procedure TCDAWriter.WriteCDA(oXml: TXmlBuilder; oDoc: TcdaClinicalDocument); if (oDT is Tv3PQ) Then WritePQ(sPath, oXml, sName, oDT as Tv3PQ, bOptional) Else if (oDT is Tv3CD) Then - WriteCD(sPath, oXml, sName, oDT as Tv3CD, bOptional, true) + WriteCD(sPath, oXml, sName, oDT as Tv3CD, bOptional) Else if (oDT is Tv3BL) Then WriteBL(sPath, oXml, sName, oDT as Tv3BL, bOptional) Else if (oDT is Tv3CS) Then diff --git a/library/dicom/dicom_dictionary.pas b/library/dicom/dicom_dictionary.pas index ba850432a..848d13a7d 100644 --- a/library/dicom/dicom_dictionary.pas +++ b/library/dicom/dicom_dictionary.pas @@ -2241,7 +2241,7 @@ procedure TDicomDictionaryParser.LoadFromFile(const sSource: String); var oFile : TFslFile; begin - oFile := TFslFile.Create(sSource, fmOpenRead); + oFile := TFslFile.Create(sSource, fmOpenRead + fmShareDenyWrite); Try Source := oFile.Link; Finally diff --git a/library/dicom/dicom_parser.pas b/library/dicom/dicom_parser.pas index 514e37e90..067fc517d 100644 --- a/library/dicom/dicom_parser.pas +++ b/library/dicom/dicom_parser.pas @@ -1569,7 +1569,7 @@ function TDicomInstanceDecoder.Execute: TDicomInstance; SetLength(sComp, oInput.Size); oInput.Position := 0; oInput.Read(sComp[1], oInput.Size); - sDecomp := ungzip(sComp); + sDecomp := ungzip(sComp, 'dicom'); oInput.Position := 0; oPDU := TDicomPDUDecoder.Create(oInput.Size); diff --git a/library/fcomp/fcomp_graph.pas b/library/fcomp/fcomp_graph.pas index 4c3ea55fa..7d7a89b6e 100644 --- a/library/fcomp/fcomp_graph.pas +++ b/library/fcomp/fcomp_graph.pas @@ -42,7 +42,7 @@ interface {$ELSE} Windows, Messages, Vcl.Controls, Vcl.Graphics, Vcl.StdCtrls, Vcl.Forms, Vcl.ExtCtrls, Vcl.Clipbrd, {$ENDIF} - fsl_base; + fsl_base, fsl_utilities; const tiny = 1.0e-20; { used to avoid divide by zero errors } @@ -5574,7 +5574,7 @@ procedure TFGraph.SetPlotting(v : Boolean); function TFGraph.SettingsText(code : boolean): String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure p(name, value : String); overload; begin b.Append(' '+self.Name+'.'+name+' := '''+value+''';'); @@ -5830,7 +5830,7 @@ function TFGraph.SettingsText(code : boolean): String; ps(name+'.Style', value.Style, CODES_TFontStyle); end; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try p('Align', Ord(Align), CODES_TAlign); p('BevelInner', ord(BevelInner), CODES_TBevelCut); diff --git a/library/fdb/fdb_fts.pas b/library/fdb/fdb_fts.pas index 0b2b2f3cf..e87a038a4 100644 --- a/library/fdb/fdb_fts.pas +++ b/library/fdb/fdb_fts.pas @@ -1,5 +1,33 @@ unit fdb_fts; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface @@ -78,7 +106,7 @@ class function TFDBFullTextSearchFactory.makeSQLiteTextSearch(name : String): TF begin fn := FilePath(['[tmp]', 'fts-'+name+'.db']); deleteFile(fn); - result := TFDBSqlLiteFullTextSearch.create(name, TFDBSQLiteManager.create('fts-'+name, fn, true)); + result := TFDBSqlLiteFullTextSearch.create(name, TFDBSQLiteManager.create('fts-'+name, fn, false, true)); end; { TFDBSqlLiteFullTextSearchCompartment } @@ -161,4 +189,5 @@ function TFDBFullTextSearch.link: TFDBFullTextSearch; result := TFDBFullTextSearch(inherited link); end; -end. \ No newline at end of file +end. + diff --git a/library/fdb/fdb_logging.pas b/library/fdb/fdb_logging.pas index 13d666d4e..26a392dc3 100644 --- a/library/fdb/fdb_logging.pas +++ b/library/fdb/fdb_logging.pas @@ -125,7 +125,7 @@ procedure TFDBLogger.RecordUsage(AUsage: String; AWhenStarted: TDateTime; ARowCo assert(AWhenStarted > 0, ASSERT_LOCATION+': WhenStarted is not valid'); - FLock.Lock; + FLock.Lock('RecordUsage'); try inc(FTotal); GetLogEntry(AUsage).RecordUsage(AWhenStarted, ARowCount, APrepareCount, AException, AErrMsg); @@ -139,7 +139,7 @@ function TFDBLogger.ErrorReport(AUsage: String; AFormat : TFDBReportFormat): Str begin assert(AUsage <> '', ASSERT_LOCATION+': Usage is not valid'); - FLock.Lock; + FLock.Lock('ErrorReport'); try inc(FTotal); result := GetLogEntry(AUsage).Report(true, AFormat) @@ -153,7 +153,7 @@ function TFDBLogger.Report(AFormat: TFDBReportFormat): String; var i : integer; begin - FLock.Lock; + FLock.Lock('Report'); try result := TFDBLogEntry.Header(AFormat); for i := 0 to FList.Count - 1 do @@ -191,7 +191,7 @@ function TFDBLogger.InteractiveReport(AParam, APrefix: String): string; var i : integer; begin - FLock.Lock; + FLock.Lock('InteractiveReport'); try if AParam <> '' then begin diff --git a/library/fdb/fdb_manager.pas b/library/fdb/fdb_manager.pas index ae1a5b9d6..9e1f20fac 100644 --- a/library/fdb/fdb_manager.pas +++ b/library/fdb/fdb_manager.pas @@ -265,6 +265,9 @@ TFDBConnection = class (TFslObject) { internal use only - platform specific initialization } procedure Initialise; virtual; + { set sql, do prepare and execute } + procedure select(sql : string); + { After setting the SQL content, prepare the statement so Parameter Binding and execution can be done. You must call prepare before @@ -1033,6 +1036,13 @@ function TFDBConnection.LookupInternal(ATableName, AKeyField, AKeyValue, AValueF end; end; +procedure TFDBConnection.select(sql : string); +begin + self.SQL := sql; + prepare; + execute; +end; + procedure TFDBConnection.Prepare; begin {$IFOPT C+} @@ -1375,7 +1385,7 @@ destructor TFDBManager.Destroy; function TFDBManager.GetCurrentCount: Integer; begin - FLock.Enter; + FLock.Enter('GetCurrentCount'); try result := FConnections.Count; finally @@ -1387,7 +1397,7 @@ procedure TFDBManager.CheckWait; begin if FWaitCreate then begin - FLock.Lock; + FLock.Lock('CheckWait1'); try inc(FThreadWaitCount); finally @@ -1397,7 +1407,7 @@ procedure TFDBManager.CheckWait; if FSemaphore.WaitFor(DEFAULT_CONNECTION_WAIT_LENGTH) = wrError then raise EDBException.Create('['+Name+'] fdb_manager Wait Failed' {$IFDEF WINDOWS}+' - '+ ErrorAsString(GetLastError){$ENDIF}); finally - FLock.Lock; + FLock.Lock('CheckWait2'); try dec(FThreadWaitCount); finally @@ -1425,7 +1435,7 @@ function TFDBManager.GetConnection(const AUsage: String): TFDBConnection; except on e:exception do begin - FLock.Enter; + FLock.Enter('getConnection1'); Try FServerIsAvailable := False; FLastServerError := e.message; @@ -1436,7 +1446,7 @@ function TFDBManager.GetConnection(const AUsage: String): TFDBConnection; raise; end; end; - FLock.Enter; + FLock.Enter('getConnection2'); Try FConnections.Add(result); FServerIsAvailable := true; @@ -1446,7 +1456,7 @@ function TFDBManager.GetConnection(const AUsage: String): TFDBConnection; End; result.FNoFree := true; - FLock.Enter; + FLock.Enter('getConnection3'); try FWaitCreate := (FMaxConnCount > 0) and (FConnections.Count = FMaxConnCount); finally @@ -1460,7 +1470,7 @@ function TFDBManager.GetConnection(const AUsage: String): TFDBConnection; raise EDBException.Create('No Database Connections Available for "'+AUsage+'" (used: '+GetConnSummary+')'); end; end; - FLock.Enter; // lock this because of debugger + FLock.Enter('getConnection4'); // lock this because of debugger try result.FUsage := AUsage; result.FUsed := now; @@ -1502,7 +1512,7 @@ procedure TFDBManager.Release(AConn : TFDBConnection); raise EDBException.Create('Attempt to release ODBC connection twice'); AConn.FCurrentlyInUse := false; FDBLogger.RecordUsage(AConn.Usage, AConn.FUsed, AConn.FRowCount, AConn.FPrepareCount, nil, ''); - FLock.Enter; // must lock because of the debugger + FLock.Enter('release'); // must lock because of the debugger try LDispose := (FConnections.count > FMaxConnCount) and (FMaxConnCount > 0); LIndex := FInUse.IndexOf(AConn); @@ -1561,7 +1571,7 @@ procedure TFDBManager.Error(AConn : TFDBConnection; AException: Exception; AErrM FDBLogger.RecordUsage(AConn.Usage, AConn.FUsed, AConn.FRowCount, AConn.FPrepareCount, AException, AErrMsg); - FLock.Enter; // must lock because of the debugger + FLock.Enter('error'); // must lock because of the debugger try LIndex := FInUse.IndexOf(AConn); if LIndex > -1 then @@ -1594,7 +1604,7 @@ function TFDBManager.GetConnSummary: String; i : integer; begin result := ''; - FLock.Enter; + FLock.Enter('GetConnSummary'); try for i := 0 to FInUse.Count - 1 do begin @@ -1615,7 +1625,7 @@ function TFDBManager.GetConnSummary: String; function TFDBManager.GetCurrentUse: Integer; begin - FLock.Enter; + FLock.Enter('GetCurrentUse'); try result := FInUse.Count; finally @@ -1630,7 +1640,7 @@ function TFDBManager.Link: TFDBManager; function TFDBManager.PopAvail: TFDBConnection; begin - FLock.Enter; + FLock.Enter('PopAvail'); try if FAvail.Count > 0 then begin @@ -1718,7 +1728,7 @@ function DescribeType(AColType: TFDBColumnType): String; procedure TFDBManager.SetMaxConnCount(const Value: Integer); begin - FLock.Enter; + FLock.Enter('SetMaxConnCount'); try FMaxConnCount := Value; finally @@ -1933,12 +1943,12 @@ function TFDBColumn.Link: TFDBColumn; function CommaText(list : TFslList) : String; var - s : TStringBuilder; + s : TFslStringBuilder; b : boolean; c : TFDBColumn; begin b := false; - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try for C in list do begin @@ -2098,7 +2108,7 @@ function TFDBMetaData.sizeInBytesV(magic : integer) : cardinal; function TFDBManager.ServerErrorStatus: String; Begin - FLock.Enter; + FLock.Enter('ServerErrorStatus'); try if ServerIsAvailable then result := '' diff --git a/library/fdb/fdb_sqlite3.pas b/library/fdb/fdb_sqlite3.pas index e7f80378e..abbbe5042 100644 --- a/library/fdb/fdb_sqlite3.pas +++ b/library/fdb/fdb_sqlite3.pas @@ -89,7 +89,7 @@ TFDBSQLiteConnection = class (TFDBConnection) function SupportsSizingV : Boolean; Override; function sizeInBytesV(magic : integer) : cardinal; override; Public - constructor Create(AOwner : TFDBManager; Filename : String; autoCreate : boolean); + constructor Create(AOwner : TFDBManager; Filename : String; readOnly, autoCreate : boolean); destructor Destroy; override; end; @@ -97,6 +97,7 @@ TFDBSQLiteManager = class (TFDBManager) private FFilename : String; FAutoCreate : boolean; + FReadOnly : boolean; Protected function GetDBProvider: TFDBProvider; Override; function ConnectionFactory: TFDBConnection; Override; @@ -106,7 +107,7 @@ TFDBSQLiteManager = class (TFDBManager) procedure init; override; function sizeInBytesV(magic : integer) : cardinal; override; public - constructor Create(AName : String; Filename : String; autoCreate : boolean; maxConn : integer = 100); overload; + constructor Create(AName : String; Filename : String; readOnly, autoCreate : boolean; maxConn : integer = 100); overload; destructor Destroy; override; class function IsSupportAvailable(APlatform : TFDBPlatform; Var VMsg : String):Boolean; override; property Filename : String read FFilename; @@ -116,16 +117,17 @@ implementation { TFDBSQLiteManager } -constructor TFDBSQLiteManager.Create(AName: String; Filename : String; autoCreate : boolean; maxConn : integer = 100); +constructor TFDBSQLiteManager.Create(AName: String; Filename : String; readOnly, autoCreate : boolean; maxConn : integer = 100); begin FFilename := filename; FAutoCreate := autoCreate; + FReadOnly := readOnly; Inherited Create(aName, maxConn); end; function TFDBSQLiteManager.ConnectionFactory: TFDBConnection; begin - result := TFDBSQLiteConnection.Create(self, FFilename, FAutoCreate); + result := TFDBSQLiteConnection.Create(self, FFilename, FReadOnly, FAutoCreate); end; destructor TFDBSQLiteManager.Destroy; @@ -176,12 +178,18 @@ class function TFDBSQLiteManager.IsSupportAvailable(APlatform: TFDBPlatform; var { TFDBSQLiteConnection } -constructor TFDBSQLiteConnection.Create(AOwner: TFDBManager; Filename : String; autoCreate : boolean); +constructor TFDBSQLiteConnection.Create(AOwner: TFDBManager; Filename : String; readOnly, autoCreate : boolean); +var + flags : integer; + start : UInt64; begin inherited Create(AOwner); + start := GetTickCount64; FConnection := TSQLite3Database.Create; FConnection.Delay := 2000; - if autoCreate then + if readOnly then + FConnection.Open(Filename, SQLITE_OPEN_READONLY) + else if autoCreate then FConnection.Open(Filename, SQLITE_OPEN_READWRITE or SQLITE_OPEN_CREATE) else FConnection.Open(Filename, SQLITE_OPEN_READWRITE); diff --git a/library/fdb/fdb_sqlite3_wrapper.pas b/library/fdb/fdb_sqlite3_wrapper.pas index 7a0c700c4..8ce91ab00 100644 --- a/library/fdb/fdb_sqlite3_wrapper.pas +++ b/library/fdb/fdb_sqlite3_wrapper.pas @@ -36,7 +36,7 @@ interface uses SysUtils, Classes, Types, fdb_sqlite3_objects, - fsl_base, fsl_utilities; + fsl_base, fsl_utilities, fsl_logging; type ESQLite3Error = class(EFslException); diff --git a/library/fdb/tests/fdb_tests.pas b/library/fdb/tests/fdb_tests.pas index 58c7ff0e0..acd87d4c5 100644 --- a/library/fdb/tests/fdb_tests.pas +++ b/library/fdb/tests/fdb_tests.pas @@ -113,14 +113,6 @@ procedure TFDBTests.test(manager: TFDBManager); conn := manager.GetConnection('test'); try - //md := conn.FetchMetaData; - //try - // if md.HasTable('TestTable') then - // conn.DropTable('TestTable'); - //finally - // md.free; - //end; - conn.ExecSQL('CREATE TABLE TestTable ( ' + #13#10 + ' TestKey ' + DBKeyType(conn.owner.platform) + ' ' + ColCanBeNull(conn.owner.platform, false) + ', ' + #13#10 + ' Name nchar(255) ' + ColCanBeNull(conn.owner.platform, false) + ', ' + #13#10 + ' Number int ' + ColCanBeNull(conn.owner.platform, true) + ', ' + #13#10 + ' BigNumber bigint ' + ColCanBeNull(conn.owner.platform, true) + ', ' + #13#10 + ' FloatNumber float ' + ColCanBeNull(conn.owner.platform, @@ -130,12 +122,16 @@ procedure TFDBTests.test(manager: TFDBManager); conn.ExecSQL('Create Unique INDEX SK_TestTable_Index ON TestTable (Name, Number)'); try - md := conn.FetchMetaData; - try - assertTrue(md.HasTable('TestTable')) - finally - md.free; + if {$IFDEF LINUX} conn.Owner.Platform <> kdbMySQL {$ELSE} true {$ENDIF} then // blows up with function sequence error with mysql on linux? + begin + md := conn.FetchMetaData; + try + assertTrue(md.HasTable('TestTable')) + finally + md.free; + end; end; + assertTrue(conn.CountSQL('Select count(*) from TestTable') = 0, 'dbt.0'); conn.ExecSQL('Insert into TestTable (TestKey, Name, BigString, Number, BigNumber, FloatNumber, Instant) values (1, ''a name'', '''', 2, ' + IntToStr(i64) + ', 3.2, ' + @@ -238,19 +234,22 @@ procedure TFDBTests.test(manager: TFDBManager); conn.terminate; conn.DropTable('TestTable'); end; - md := conn.FetchMetaData; - try - assertFalse(md.HasTable('TestTable'), 'dbt.38') - finally - md.free; + if {$IFDEF LINUX} conn.Owner.Platform <> kdbMySQL {$ELSE} true {$ENDIF} then + begin + md := conn.FetchMetaData; + try + assertFalse(md.HasTable('TestTable'), 'dbt.38') + finally + md.free; + end; end; conn.Release; except on e: Exception do begin - assertTrue(false, e.message); conn.Error(e); + assertTrue(false, e.message); end; end; end; @@ -486,7 +485,7 @@ procedure TFDBTests.TestSemaphore; //end //else // Logging.log('SQLite DB @ '+fn); - db := TFDBSQLiteManager.Create('test', fn, true, 4); + db := TFDBSQLiteManager.Create('test', fn, false, true, 4); try assertTrue(db.CurrConnCount = 0); conn1 := db.GetConnection('test1'); @@ -691,7 +690,7 @@ procedure TFDBTests.TestSQLite; //end //else // Logging.log('SQLite DB @ '+fn); - db := TFDBSQLiteManager.Create('test', fn, true, 4); + db := TFDBSQLiteManager.Create('test', fn, false, true, 4); try test(db); finally diff --git a/library/fhir.inc b/library/fhir.inc index 2154fa695..4c79fa9ec 100644 --- a/library/fhir.inc +++ b/library/fhir.inc @@ -59,19 +59,42 @@ {$ENDIF} {$ENDIF} +{ +OpenSSL is always statically loaded. +Or in the case of FPC compiled applications, statically bound +} +{$DEFINE STATICLOAD_OPENSSL} + +// there's a bug in the lazarus/FPC compiler where global settings +// such as assertions are not consistently the same across all units. +// this sets the global compile settings for development consistently based +// on the presence of the define 'PRODUCTION' in the project set up + +{$IFDEF PRODUCTION} + +{$C-} // assertions off +{$I-} // IO checking off +{$Q-} // overflow checking off +{$R-} // range checking off +{$OPTIMIZATION LEVEL3} // FPC level 3 optimizations for production +{$D-} // debugging info off for production + +{$ELSE} + +{$C+} // assertions on (needed to pass the tests) +{$I+} // IO checking on - though this is probably useless? +{$Q-} // overflow checking off - these are always off; doesn't run with them on +{$R-} // range checking off - these are always off; doesn't run with them on +{$OPTIMIZATION OFF} // all optimizations off for development +{$D+} // debugging info on for development { The base class TFslObject can track all instantiated objects. Doing so is useful for leak hunting in production, but is also a little costly. -Enable it with this define } -{$IFOPT D+} {$DEFINE OBJECT_TRACKING} + {$ENDIF} -{ -OpenSSL is always statically loaded. -Or in the case of FPC compiled applications, statically bound -} -{$DEFINE STATICLOAD_OPENSSL} +{.$.DEFINE DEV_FEATURES} diff --git a/library/fhir/fhir_cdshooks.pas b/library/fhir/fhir_cdshooks.pas index ec708e576..bc7d1415d 100644 --- a/library/fhir/fhir_cdshooks.pas +++ b/library/fhir/fhir_cdshooks.pas @@ -512,7 +512,7 @@ function makeUrlSafe(url : String) : string; function presentAsHtml(cards : TFslList; inprogress, errors : TStringList) : String; var - b : TStringBuilder; + b : TFslStringBuilder; card : TCDSHookCard; md : TMarkdownProcessor; s : String; @@ -520,7 +520,7 @@ function presentAsHtml(cards : TFslList; inprogress, errors : TStr first : boolean; cnt : boolean; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(CARDS_HTML_HEAD); cnt := false; @@ -1231,7 +1231,7 @@ procedure TCDSHooksManager.listInProgress(list: TStrings); var thread : TCDSHooksManagerWorkThread; begin - FLock.Lock; + FLock.Lock('listInProgress'); try for thread in FThreads do if thread.FAlive then @@ -1260,7 +1260,7 @@ function TCDSHooksManager.waiting: boolean; thread : TCDSHooksManagerWorkThread; begin result := false; - FLock.Lock; + FLock.Lock('waiting'); try for thread in FThreads do if thread.FAlive then @@ -1294,7 +1294,7 @@ procedure TCDSHooksManager.clearServers; procedure TCDSHooksManager.closeThread(thread: TCDSHooksManagerWorkThread); begin - FLock.Lock; + FLock.Lock('closeThread'); try FThreads.Remove(thread); thread.Fmanager := nil; @@ -1326,7 +1326,7 @@ procedure TCDSHooksManager.disconnectFromServer(details: TRegisteredFHIRServer); procedure TCDSHooksManager.dropCache; begin - FLock.Lock; + FLock.Lock('dropCache'); try FCache.Clear; finally @@ -1357,7 +1357,7 @@ procedure TCDSHooksManager.makeRequest(request: TCDSHookRequest; event: TOnCDSHo begin if server.info.doesHook(request.hook, hook) then begin - FLock.Lock; + FLock.Lock('makeRequest'); try if FCache.TryGetValue(hash+'|'+server.info.fhirEndpoint, cached) then event(self, server.info, context, cached.response, cached.error) @@ -1419,7 +1419,7 @@ procedure TCDSHooksManager.cancelAllRequests; var thread : TCDSHooksManagerWorkThread; begin - FLock.Lock; + FLock.Lock('cancelAllRequests'); try for thread in FThreads do thread.Cancel; diff --git a/library/fhir/fhir_codegen.pas b/library/fhir/fhir_codegen.pas index c9e1db7ae..95ba9319e 100644 --- a/library/fhir/fhir_codegen.pas +++ b/library/fhir/fhir_codegen.pas @@ -201,7 +201,7 @@ function TFHIRCodeGenerator.addVar(inScope: TArray; varName: String): TA function TFHIRCodeGenerator.enumify(code: String): String; var - b : TStringBuilder; + b : TFslStringBuilder; ch : char; ws : boolean; begin @@ -211,7 +211,7 @@ function TFHIRCodeGenerator.enumify(code: String): String; result := 'Plus' else begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try result := code.replace('-', ' ').replace('+', ' '); ws := true; @@ -306,11 +306,11 @@ destructor TFHIRCodeGeneratorJavaRI.Destroy; function TFHIRCodeGeneratorJavaRI.generate: String; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin processResource; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try imports.Sort; for s in imports do @@ -590,12 +590,12 @@ destructor TFHIRCodeGeneratorPascal.Destroy; function TFHIRCodeGeneratorPascal.generate: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; s, l, r : String; begin processResource; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('// uses '); first := true; diff --git a/library/fhir/fhir_common.pas b/library/fhir/fhir_common.pas index 456febfc2..21434ad6e 100644 --- a/library/fhir/fhir_common.pas +++ b/library/fhir/fhir_common.pas @@ -61,15 +61,34 @@ interface TObservationStatus = (obssNull, obssRegistered, obssPreliminary, obssFinal, obssAmended, obssCorrected, obssCancelled, obssEnteredInError, obssUnknown); TTokenCategory = (tcClinical, tcData, tcMeds, tcSchedule, tcAudit, tcDocuments, tcFinancial, tcMedicationDefinition, tcOther); TIdentifierUse = (iuNull, iuUsual, iuOfficial, iuTemp, iuSecondary, iuOld); - TOpIssueCode = (oicVoid, oicNotInVS, oicThisNotInVS, oicInvalidCode, oicDisplay, oicNotFound, oicCodeRule, oicVSProcessing, oicInferFailed, oicStatusCheck, oicInvalidData); + TOpIssueCode = (oicVoid, oicNotInVS, oicThisNotInVS, oicInvalidCode, oicDisplay, oicDisplayComment, oicNotFound, oicCodeRule, oicVSProcessing, oicInferFailed, oicStatusCheck, oicInvalidData, oicProcessingNote); const CODES_TFhirFilterOperator: Array[TFilterOperator] of String = ('', '=', 'is-a', 'descendent-of', 'is-not-a', 'regex', 'in', 'not-in', 'generalizes', 'exists', 'child-of', 'descendent-leaf'); CODES_TPublicationStatus: Array[TPublicationStatus] of String = ('', 'draft', 'active', 'retired'); CODES_TTokenCategory : array [TTokenCategory] of String = ('Clinical', 'Data', 'Meds', 'Schedule', 'Audit', 'Documents', 'Financial', 'MedicationDefinitions', 'Other'); - CODES_TOpIssueCode : array [TOpIssueCode] of String = ('', 'not-in-vs', 'this-code-not-in-vs', 'invalid-code', 'invalid-display', 'not-found', 'code-rule', 'vs-invalid', 'cannot-infer', 'status-check', 'invalid-data'); + CODES_TOpIssueCode : array [TOpIssueCode] of String = ('', 'not-in-vs', 'this-code-not-in-vs', 'invalid-code', 'invalid-display', 'display-comment', 'not-found', 'code-rule', 'vs-invalid', 'cannot-infer', 'status-check', 'invalid-data', 'process-note'); type + EFHIROperationException = class (EFslException) + private + FMsgId : String; + FParams : TStringArray; + FLevel : TIssueSeverity; + FCause : TFHIRIssueType; + FCode : TOpIssueCode; + FPath : String; + public + constructor create(level : TIssueSeverity; cause : TFHIRIssueType; code : TOpIssueCode; path, message : String); + constructor createMsg(level : TIssueSeverity; cause : TFHIRIssueType; code : TOpIssueCode; path, messageId : String; params : TStringArray); + + property MsgId : String read FMsgId; + property Params : TStringArray read FParams; + property Level : TIssueSeverity read FLevel; + property Cause : TFHIRIssueType read FCause; + property Code : TOpIssueCode read FCode; + property Path : String read FPath; + end; // base wrappers..... TFhirExtensionW = class; @@ -251,6 +270,7 @@ TFHIRXVersionResourceWrapper = class (TFHIRObject) property language : String read GetLanguage write SetLanguage; function AsJson : String; override; + function SourcePackage : String; // extensions: function hasExtension(url : String) : boolean; override; @@ -386,6 +406,7 @@ TFhirOperationOutcomeW = class (TFHIRXVersionResourceWrapper) procedure addIssue(issue : TFhirOperationOutcomeIssueW; free : boolean); overload; virtual; abstract; procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, message : String; issueCode : TOpIssueCode; addIfDuplicate : boolean = false); overload; virtual; abstract; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; issueCode : TOpIssueCode; addIfDuplicate : boolean = false); overload; virtual; abstract; function hasIssues : boolean; virtual; abstract; function issues : TFslList; virtual; abstract; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; virtual; abstract; @@ -716,6 +737,7 @@ TFhirCodeSystemConceptW = class (TFHIRXVersionElementWrapper) function conceptList : TFhirCodeSystemConceptListW; virtual; abstract; function concept(ndx : integer) : TFhirCodeSystemConceptW; virtual; abstract; function conceptCount : integer; virtual; abstract; + function hasConcepts : boolean; virtual; abstract; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; virtual; abstract; function designationCount : integer; virtual; abstract; function designations : TFslList; virtual; abstract; @@ -736,6 +758,7 @@ TFhirCodeSystemPropertyW = class (TFHIRXVersionElementWrapper) end; TFhirCodeSystemContentMode = (cscmNull, cscmNotPresent, cscmExample, cscmFragment, cscmComplete, cscmSupplement); + TFhirCodeSystemContentModeSet = set of TFhirCodeSystemContentMode; const CODES_TFhirCodeSystemContentMode : Array[TFhirCodesystemContentMode] of String = ('null', 'not-present', 'example', 'fragment', 'complete', 'supplement'); @@ -750,6 +773,7 @@ TFHIRMetadataResourceW = class (TFHIRXVersionResourceWrapper) protected function getURL: String; virtual; abstract; function getName: String; virtual; abstract; + function getTitle: String; virtual; abstract; function getStatus: TPublicationStatus; virtual; abstract; function getVersion: String; virtual; abstract; function getDescription: String; virtual; abstract; @@ -761,6 +785,7 @@ TFHIRMetadataResourceW = class (TFHIRXVersionResourceWrapper) procedure setUrl(Value: String); virtual; abstract; procedure setVersion(Value: String); virtual; abstract; procedure setName(Value: String); virtual; abstract; + procedure setTitle(Value: String); virtual; abstract; procedure setStatus(Value: TPublicationStatus); virtual; abstract; procedure setDescription(Value: String); virtual; abstract; function getContext: String; virtual; abstract; @@ -770,6 +795,7 @@ TFHIRMetadataResourceW = class (TFHIRXVersionResourceWrapper) property url : String read getURL write SetUrl; property name : String read GetName write SetName; + property title : String read GetTitle write SetTitle; property version : String read GetVersion write SetVersion; property vurl : String read GetVUrl; property status : TPublicationStatus read GetStatus write SetStatus; @@ -785,9 +811,12 @@ TFslMetadataResourceList = class (TFslList) function link : TFslMetadataResourceList; overload; end; + { TFhirCodeSystemW } + TFhirCodeSystemW = class (TFHIRMetadataResourceW) protected FConceptList : TFhirCodeSystemConceptListW; + function GetCaseSensitive: boolean; virtual; abstract; function getContent: TFhirCodeSystemContentMode; virtual; abstract; procedure setContent(Value: TFhirCodeSystemContentMode); virtual; abstract; function getCount: integer; virtual; abstract; @@ -803,6 +832,7 @@ TFhirCodeSystemW = class (TFHIRMetadataResourceW) function supplements : String; virtual; abstract; function copyright : String; virtual; abstract; function language : String; virtual; abstract; + property caseSensitive : boolean read GetCaseSensitive; function properties : TFslList; virtual; abstract; function propertyCode(uri : String) : String; @@ -810,6 +840,7 @@ TFhirCodeSystemW = class (TFHIRMetadataResourceW) // this is special because it's owned function conceptList : TFhirCodeSystemConceptListW; virtual; abstract; function concept(ndx : integer) : TFhirCodeSystemConceptW; virtual; abstract; + function hasConcepts : boolean; virtual; abstract; function conceptCount : integer; virtual; abstract; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; virtual; abstract; function getCode(code : String) : TFhirCodeSystemConceptW; virtual; abstract; @@ -822,6 +853,7 @@ TFhirCodeSystemW = class (TFHIRMetadataResourceW) function getChildren(c : TFhirCodeSystemConceptW) : TFhirCodeSystemConceptListW; virtual; abstract; function buildImplicitValueSet : TFHIRValueSetW; virtual; abstract; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; virtual; abstract; end; { TFhirValueSetExpansionContainsPropertyW } @@ -862,8 +894,8 @@ TFhirValueSetExpansionContainsW = class (TFHIRXVersionElementWrapper) procedure addDesignation(lang, use, value : String); overload; virtual; abstract; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); overload; virtual; abstract; - procedure addProperty(code : String; value : TFHIRObject); virtual; abstract; overload; - procedure addProperty(code : String; value : TFhirCodeSystemConceptPropertyW); virtual; abstract; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; virtual; abstract; + procedure addProperty(code : String; value : TFhirCodeSystemConceptPropertyW); overload; virtual; abstract; procedure addContains(contained : TFhirValueSetExpansionContainsW); virtual; abstract; procedure clearContains(); virtual; abstract; function contains : TFslList; virtual; abstract; @@ -1120,14 +1152,23 @@ TFHIRLookupOpRequestW = class (TFHIRXVersionOperationWrapper) function displayLanguage : String; virtual; abstract; end; + { TFHIRLookupOpResponseW } + TFHIRLookupOpResponseW = class (TFHIRXVersionOperationWrapper) protected function getName: String; virtual; abstract; procedure setName(Value: String); virtual; abstract; + function getCode: String; virtual; abstract; + procedure setCode(Value: String); virtual; abstract; + function getSystem: String; virtual; abstract; + procedure setSystem(Value: String); virtual; abstract; function getDisplay: String; virtual; abstract; procedure setDisplay(Value: String); virtual; abstract; + function getIsAbstract: boolean; virtual; abstract; + procedure setIsAbstract(Value: boolean); virtual; abstract; public function link : TFHIRLookupOpResponseW; overload; + function addProp(name : string) : TFHIRLookupOpRespPropertyW; virtual; abstract; function addDesignation(lang, systemUri, code, display, value : string) : TFHIRLookupOpRespDesignationW; overload; virtual; abstract; function addDesignation(lang, value : string) : TFHIRLookupOpRespDesignationW; overload; virtual; abstract; @@ -1136,8 +1177,11 @@ TFHIRLookupOpResponseW = class (TFHIRXVersionOperationWrapper) procedure addExtension(name, value : String); overload; virtual; abstract; procedure addExtension(name : String; value : boolean); overload; virtual; abstract; + property isAbstract : boolean read GetIsAbstract write SetIsAbstract; + property systemUri : String read GetSystem write SetSystem; property version : String read GetVersion write SetVersion; property name : String read GetName write SetName; + property code : String read GetCode write SetCode; property display : String read GetDisplay write SetDisplay; end; @@ -1424,12 +1468,14 @@ TFhirTerminologyCapabilitiesW = class (TFHIRXVersionResourceWrapper) protected function getDate: TFslDateTime; virtual; abstract; function getDescription: String; virtual; abstract; - function getName: String; virtual; abstract; + function getName: String; virtual; abstract; + function getTitle: String; virtual; abstract; function getStatus: TPublicationStatus; virtual; abstract; function getURL: String; virtual; abstract; procedure setDate(Value: TFslDateTime); virtual; abstract; procedure setDescription(Value: String); virtual; abstract; procedure setName(Value: String); virtual; abstract; + procedure setTitle(Value: String); virtual; abstract; procedure setStatus(Value: TPublicationStatus); virtual; abstract; procedure setUrl(Value: String); virtual; abstract; function getContext: String; virtual; abstract; @@ -1442,7 +1488,8 @@ TFhirTerminologyCapabilitiesW = class (TFHIRXVersionResourceWrapper) function link : TFhirTerminologyCapabilitiesW; overload; property url : String read getURL write SetUrl; - property name : String read GetName write SetName; + property name : String read GetName write SetName; + property title : String read GetTitle write SetTitle; property version : String read GetVersion write SetVersion; property status : TPublicationStatus read GetStatus write SetStatus; property description : String read GetDescription write SetDescription; @@ -1506,6 +1553,7 @@ TFHIRResourceProxyV = class abstract (TFslObject) FFhirObjectVersion : TFHIRVersion; FFhirType : String; FId : String; + FPackageId: String; FSupplements: String; FUrl : String; FVersion : String; @@ -1519,11 +1567,12 @@ TFHIRResourceProxyV = class abstract (TFslObject) function wrapResource : TFHIRXVersionResourceWrapper; virtual; abstract; procedure SetResourceV(value : TFHIRResourceV); public - constructor Create(fhirObjectVersion : TFHIRVersion; fhirType, id : String; url, version, supplements, content, valueSet : String); overload; - constructor Create(resource : TFHIRResourceV; url, version : String); overload; + constructor Create(packageId : String; fhirObjectVersion : TFHIRVersion; fhirType, id : String; url, version, supplements, content, valueSet : String); overload; + constructor Create(packageId : String; resource : TFHIRResourceV; url, version : String); overload; destructor Destroy; override; function link : TFHIRResourceProxyV; overload; + property packageId : String read FPackageId; property fhirObjectVersion : TFHIRVersion read FFhirObjectVersion; property fhirType : String read FFhirType; property id : String read FId write FId; @@ -1544,7 +1593,7 @@ TFHIRResourceProxyW = class (TFHIRResourceProxyV) procedure loadResource; override; function wrapResource : TFHIRXVersionResourceWrapper; override; public - constructor Create(resource : TFHIRXVersionResourceWrapper; url, version : String); overload; + constructor Create(packageId : String; resource : TFHIRXVersionResourceWrapper; url, version : String); overload; end; TFHIRMetadataResourceManagerW = class (TFslObject) @@ -1646,9 +1695,9 @@ function TFHIRResourceProxyW.wrapResource: TFHIRXVersionResourceWrapper; end; -constructor TFHIRResourceProxyW.Create(resource: TFHIRXVersionResourceWrapper; url, version: String); +constructor TFHIRResourceProxyW.Create(packageId : String; resource: TFHIRXVersionResourceWrapper; url, version: String); begin - inherited create(resource.Resource.link, url, version); + inherited create(packageId, resource.Resource.link, url, version); FResourceW := resource.link; end; @@ -1729,6 +1778,11 @@ function TFHIRXVersionResourceWrapper.AsJson: String; Result := FRes.asJson; end; +function TFHIRXVersionResourceWrapper.SourcePackage: String; +begin + result := FRes.SourcePackage; +end; + function TFHIRXVersionResourceWrapper.hasExtension(url: String): boolean; begin Result:= FRes.hasExtension(url); @@ -1943,12 +1997,15 @@ function TFHIRXVersionElementWrapper.getExtensionsW(url: String): TFslList.Create; try - list := getExtensionsV(url); - try - for o in list do - result.add(wrapExtension(o)); - finally - list.free; + if (hasExtensions) then + begin + list := getExtensionsV(url); + try + for o in list do + result.add(wrapExtension(o)); + finally + list.free; + end; end; result.link; finally @@ -2713,7 +2770,7 @@ constructor TFHIRMetadataResourceManagerW.Create; begin inherited; FMap := TFslMap.Create('Metadata Resource Manager ('+T.className+')'); - FMap.defaultValue := nil; +// FMap.defaultValue := nil; FList := TFslList.Create; end; @@ -2748,6 +2805,8 @@ function TFHIRMetadataResourceManagerW.link: TFHIRMetadataResourceManagerW procedure TFHIRMetadataResourceManagerW.see(res : TFHIRResourceProxyV); begin + if (res = nil) then + exit; if (res.id = '') then res.id := newGUIDId; if (FMap.containsKey(res.id)) then @@ -2784,7 +2843,7 @@ procedure TFHIRMetadataResourceManagerW.updateList(url, version : String); try for tt in FList do begin - if (url = tt.url) and not rl.contains(tt) then + if (tt <> nil) and (url = tt.url) and not rl.contains(tt) then rl.add(tt.link); end; @@ -2842,8 +2901,16 @@ procedure TFHIRMetadataResourceManagerW.updateList(url, version : String); end; function TFHIRMetadataResourceManagerW.get(url : String) : T; +var + p : TFHIRResourceProxyV; begin - result := FMap[url].resourceW as T; + result := T(nil); + if (FMap.containsKey(url)) then + begin + p := FMap[url]; + if p <> nil then + result := p.resourceW as T + end end; function TFHIRMetadataResourceManagerW.getP(url : String) : TFHIRResourceProxyV; @@ -2854,16 +2921,22 @@ function TFHIRMetadataResourceManagerW.getP(url : String) : TFHIRResourceProx function TFHIRMetadataResourceManagerW.get(url, version : string) : T; var mm : String; + p : TFHIRResourceProxyV; begin + result := T(nil); if (FMap.containsKey(url+'|'+version)) then - result := FMap[url+'|'+version].resourceW as T + begin + p := FMap[url+'|'+version]; + result := p.resourceW as T + end else begin mm := TFHIRVersions.getMajMin(version, false); - if (mm <> '') then - result := FMap[url+'|'+mm].resourceW as T - else - result := nil; + if (mm <> '') and FMap.containsKey(url+'|'+mm) then + begin + p := FMap[url+'|'+mm]; + result := p.resourceW as T + end; end; end; @@ -2907,14 +2980,18 @@ function TFHIRMetadataResourceManagerW.has(url, version : string; var res : T begin res := T(nil); if (FMap.containsKey(url+'|'+version)) then - res := FMap[url+'|'+version].resourceW as T + begin + r := FMap[url+'|'+version]; + if (r <> nil) then + res := r.resourceW as T + end else begin mm := TFHIRVersions.getMajMin(version, false); if (mm <> '') then begin result := FMap.TryGetValue(url+'|'+mm, r) ; - if result then + if result and (r <> nil) then res := r.resourceW as T; end else @@ -3087,9 +3164,10 @@ procedure TFhirIdentifierW.SetType(const Value: TFhirCodeableConceptW); { TFHIRResourceProxyV } -constructor TFHIRResourceProxyV.Create(fhirObjectVersion : TFHIRVersion; fhirType, id : String; url, version, supplements, content, valueSet : String); +constructor TFHIRResourceProxyV.Create(packageId : String; fhirObjectVersion : TFHIRVersion; fhirType, id : String; url, version, supplements, content, valueSet : String); begin inherited Create; + FPackageId := packageId; FFhirObjectVersion := fhirObjectVersion; FFhirType := fhirType; FId := id; @@ -3100,9 +3178,10 @@ constructor TFHIRResourceProxyV.Create(fhirObjectVersion : TFHIRVersion; fhirTyp FValueSet := valueSet; end; -constructor TFHIRResourceProxyV.Create(resource : TFHIRResourceV; url, version : String); +constructor TFHIRResourceProxyV.Create(packageId : String; resource : TFHIRResourceV; url, version : String); begin inherited Create; + FPackageId := packageId; FFhirObjectVersion := resource.fhirObjectVersion; FFhirType := resource.fhirType; FId := resource.id; @@ -3132,6 +3211,9 @@ function TFHIRResourceProxyV.GetResourceV : TFHIRResourceV; function TFHIRResourceProxyV.GetResourceW : TFHIRXVersionResourceWrapper; begin + if self = nil then + exit(nil); + if FResourceW = nil then FResourceW := wrapResource; result := FResourceW; @@ -3159,6 +3241,28 @@ function TFHIRPrimitiveX.wrapExtension(extension: TFHIRObject): TFHIRExtensionW; raise EFSLException.Create('Extensions are not supported in a version-less context'); end; +{ EFHIROperationException } + +constructor EFHIROperationException.create(level : TIssueSeverity; cause : TFHIRIssueType; code : TOpIssueCode; path, message : String); +begin + inherited create(message); + FLevel := level; + FCause := cause; + FCode := code; + FPath := path; +end; + +constructor EFHIROperationException.createMsg(level : TIssueSeverity; cause : TFHIRIssueType; code : TOpIssueCode; path, messageId : String; params : TStringArray); +begin + inherited create(messageId); + FLevel := level; + FCause := cause; + FCode := code; + FPath := path; + FMsgId := messageId; + FParams := params; +end; + end. diff --git a/library/fhir/fhir_context.pas b/library/fhir/fhir_context.pas index 87618d5ed..6070fb922 100644 --- a/library/fhir/fhir_context.pas +++ b/library/fhir/fhir_context.pas @@ -81,7 +81,7 @@ TFHIRContextLoaderEngine = class (TBackgroundTaskEngine) procedure doNpmWork(sender : TObject; pct : integer; done : boolean; desc : String); procedure loadPackage(context : TFHIRWorkerContextWithFactory; id : String; user, ignoreEmptyCodeSystems : boolean); procedure doProgress(state : String; c, t : integer); - procedure loadResource(context : TFHIRWorkerContextWithFactory; res: TFHIRResourceV; ignoreEmptyCodeSystems: boolean); + procedure loadResource(packageId : String; context : TFHIRWorkerContextWithFactory; res: TFHIRResourceV; ignoreEmptyCodeSystems: boolean); protected function canCancel : boolean; override; public @@ -173,7 +173,7 @@ procedure TFHIRContextLoaderEngine.execute(request: TBackgroundTaskRequestPackag end; end; -procedure TFHIRContextLoaderEngine.loadResource(context : TFHIRWorkerContextWithFactory; res : TFHIRResourceV; ignoreEmptyCodeSystems : boolean); +procedure TFHIRContextLoaderEngine.loadResource(packageId : String; context : TFHIRWorkerContextWithFactory; res : TFHIRResourceV; ignoreEmptyCodeSystems : boolean); var cs : TFhirCodeSystemW; begin @@ -182,13 +182,13 @@ procedure TFHIRContextLoaderEngine.loadResource(context : TFHIRWorkerContextWith cs := context.factory.wrapCodeSystem(res.link); try if (not ignoreEmptyCodeSystems or (cs.content in [cscmFragment, cscmComplete, cscmSupplement])) then - context.seeResource(res); + context.seeResource(packageId, res); finally cs.free; end; end else - context.seeResource(res); + context.seeResource(packageId, res); end; procedure TFHIRContextLoaderEngine.doNpmWork(sender: TObject; pct: integer; done: boolean; desc: String); @@ -230,7 +230,7 @@ procedure TFHIRContextLoaderEngine.loadPackage(context : TFHIRWorkerContextWithF end; try try - loadResource(context, res, ignoreEmptyCodeSystems); + loadResource(npm.name+'#'+npm.version, context, res, ignoreEmptyCodeSystems); except on e : Exception do raise EFHIRException.Create('Error Loading '+s+': '+e.Message); diff --git a/library/fhir/fhir_diff.pas b/library/fhir/fhir_diff.pas index b1855f131..4c5b6eb04 100644 --- a/library/fhir/fhir_diff.pas +++ b/library/fhir/fhir_diff.pas @@ -626,10 +626,10 @@ procedure TDifferenceEngine.applyReplace(res : TFHIRObject; path: String; value: function TDifferenceEngine.asHtml(differences: TDifferenceList): string; var - b : TStringBuilder; + b : TFslStringBuilder; diff : TDifference; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(''#13#10); b.Append(''); @@ -737,7 +737,7 @@ function TDifferenceEngine.asValue(value: TFHIRObject): string; var pl : TFHIRPropertyList; c : TFHIRComposer; - b : TStringBuilder; + b : TFslStringBuilder; begin if value.isEnum then result := FormatTextToXml(value.primitiveValue, xmlText) @@ -756,7 +756,7 @@ function TDifferenceEngine.asValue(value: TFHIRObject): string; end else begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{'); // an anonymous type. So what we do here is create the value, but the value diff --git a/library/fhir/fhir_factory.pas b/library/fhir/fhir_factory.pas index c73407fb0..5ae5625c3 100644 --- a/library/fhir/fhir_factory.pas +++ b/library/fhir/fhir_factory.pas @@ -35,7 +35,7 @@ interface uses SysUtils, Classes, - fsl_base, fsl_utilities, fsl_collections, fsl_json, fsl_xml, fsl_stream, fsl_http, fsl_npm_cache, + fsl_base, fsl_utilities, fsl_collections, fsl_json, fsl_xml, fsl_stream, fsl_http, fsl_npm_cache, fsl_i18n, fsl_ucum, fsl_npm, fsl_threads, fsl_web_stream, fhir_objects, fhir_parser, fhir_narrative, fhir_pathengine, fhir_common, fhir_xhtml, fhir_elementmodel, fhir_client, fhir_uris; @@ -168,6 +168,7 @@ TFHIRFactory = class abstract (TFslObject) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); virtual; abstract; function buildOperationOutcome(langList : THTTPLanguageList; e : exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; virtual; abstract; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; virtual; abstract; + function buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; virtual; abstract; function makeByName(const name : String) : TFHIRObject; virtual; abstract; function makeResource(const name : String) : TFHIRResourceV; @@ -194,8 +195,8 @@ TFHIRFactory = class abstract (TFslObject) function makeTerminologyCapablities : TFhirTerminologyCapabilitiesW; virtual; abstract; function makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String) : TFhirOperationOutcomeIssueW; virtual; abstract; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; overload; virtual; abstract; - function makeProxy(presource : TFHIRResourceV) : TFHIRResourceProxyV; overload; virtual; abstract; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; overload; virtual; abstract; + function makeProxy(packageId : String; presource : TFHIRResourceV) : TFHIRResourceProxyV; overload; virtual; abstract; function wrapResource(r : TFHIRResourceV) : TFHIRXVersionResourceWrapper; virtual; function wrapCapabilityStatement(r : TFHIRResourceV) : TFHIRCapabilityStatementW; virtual; abstract; @@ -280,10 +281,11 @@ TFHIRWorkerContextWithFactory = class (TFHIRWorkerContextV) property pcm : TFHIRPackageManager read FPcm; property LoadInfo : TPackageLoadingInformation read FLoadInfo; - procedure loadResourceJson(rType, id : String; json : TStream); override; - procedure seeResource(res : TFHIRResourceV); overload; virtual; abstract; + procedure loadResourceJson(packageId : String; rType, id : String; json : TStream); override; + procedure seeResource(packageId : String; res : TFHIRResourceV); overload; virtual; abstract; procedure seeResource(res : TFHIRResourceProxyV); overload; virtual; abstract; procedure dropResource(rtpe, id : String); overload; virtual; abstract; + procedure LoadCodeSystem(r : TFhirResourceProxyV); virtual; abstract; procedure setNonSecureTypes(names : Array of String); virtual; abstract; @@ -359,8 +361,8 @@ TFHIRFactoryX = class (TFHIRFactory) function makeParameters : TFHIRParametersW; override; function makeTerminologyCapablities : TFhirTerminologyCapabilitiesW; override; function makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String) : TFhirOperationOutcomeIssueW; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; overload; override; - function makeProxy(presource : TFHIRResourceV) : TFHIRResourceProxyV; overload; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; overload; override; + function makeProxy(packageId : String; presource : TFHIRResourceV) : TFHIRResourceProxyV; overload; override; function wrapResource(r : TFHIRResourceV) : TFHIRXVersionResourceWrapper; virtual; function wrapCapabilityStatement(r : TFHIRResourceV) : TFHIRCapabilityStatementW; override; function wrapStructureDefinition(r : TFHIRResourceV) : TFhirStructureDefinitionW; override; @@ -422,6 +424,9 @@ TFhirSystemCoding = class (TFHIRCodingW) procedure setVersion(Value: String); override; public destructor Destroy; override; + function renderText : String; override; + function wrapExtension(extension : TFHIRObject) : TFHIRExtensionW; override; + end; { TFhirSystemCoding } @@ -431,6 +436,11 @@ function TFhirSystemCoding.tuple: TFHIRSystemTuple; result := Element as TFhirSystemTuple; end; +function TFhirSystemCoding.wrapExtension(extension: TFHIRObject): TFHIRExtensionW; +begin + raise EFSLException.Create('Not Implemented Yet'); +end; + function TFhirSystemCoding.getCode: String; begin if tuple.Fields['code'] = nil then @@ -463,6 +473,11 @@ function TFhirSystemCoding.getVersion: String; result := (tuple.Fields['version'] as TFHIRObject).ToString; end; +function TFhirSystemCoding.renderText: String; +begin + result := systemUri+'#'+code; +end; + procedure TFhirSystemCoding.setCode(Value: String); begin raise EFSLException.create('TFhirSystemCoding.setCode is Not supported'); @@ -781,12 +796,12 @@ function TFHIRFactoryX.makeIssue(level: TIssueSeverity; issue: TFhirIssueType; l raise EFslException.Create('makeIssue is not implemented in the non-versioned FHIRFactory'); end; -function TFHIRFactoryX.makeProxy(pi: TNpmPackageResource; worker: TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryX.makeProxy(packageId : String; pi: TNpmPackageResource; worker: TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin raise EFslException.Create('makeProxy is not implemented in the non-versioned FHIRFactory'); end; -function TFHIRFactoryX.makeProxy(presource: TFHIRResourceV): TFHIRResourceProxyV; +function TFHIRFactoryX.makeProxy(packageId : String; presource: TFHIRResourceV): TFHIRResourceProxyV; begin raise EFslException.Create('makeProxy is not implemented in the non-versioned FHIRFactory'); end; @@ -1222,7 +1237,7 @@ procedure TFHIRWorkerContextWithFactory.LoadingFinished; // nothing here end; -procedure TFHIRWorkerContextWithFactory.loadResourceJson(rType, id: String; +procedure TFHIRWorkerContextWithFactory.loadResourceJson(packageId : String; rType, id: String; json: TStream); var p : TFHIRParser; @@ -1231,7 +1246,8 @@ procedure TFHIRWorkerContextWithFactory.loadResourceJson(rType, id: String; try p.source := json; p.Parse; - SeeResource(p.resource); + p.resource.SourcePackage := packageId; + SeeResource(packageId, p.resource); finally p.free; end; diff --git a/library/fhir/fhir_graphql.pas b/library/fhir/fhir_graphql.pas index 593db0592..3ef1e1177 100644 --- a/library/fhir/fhir_graphql.pas +++ b/library/fhir/fhir_graphql.pas @@ -352,7 +352,7 @@ function TFHIRGraphQLEngine.filter(context : TFHIRResourceV; prop:TFHIRProperty; result := obj.primitiveValue <> ''; end; var - fp : TStringBuilder; + fp : TFslStringBuilder; arg : TGraphQLArgument; p : TFHIRProperty; v : TFHIRObject; @@ -367,7 +367,7 @@ function TFHIRGraphQLEngine.filter(context : TFHIRResourceV; prop:TFHIRProperty; try if values.Count > 0 then begin - fp := TStringBuilder.Create; + fp := TFslStringBuilder.Create; try for arg in arguments do begin diff --git a/library/fhir/fhir_objects.pas b/library/fhir/fhir_objects.pas index 0c8d9ef54..dae47d08d 100644 --- a/library/fhir/fhir_objects.pas +++ b/library/fhir/fhir_objects.pas @@ -162,7 +162,13 @@ EFHIRException = class (EFslException) Constructor Create(place : String); End; - ETooCostly = class (EFHIRException); + ETooCostly = class (EFHIRException) + private + FDiagnostics : String; + public + property Diagnostics : String read FDiagnostics write FDiagnostics; + end; + EFinished = class (EFHIRException); EUnsafeOperation = class (EFHIRException); EDefinitionException = class (EFHIRException); @@ -395,6 +401,7 @@ TFHIRLocatedNode = class (TFslObject) {$M+} TFHIRObject = class (TFslObject) private + FTagNoLink: TFslObject; FTags : TFslStringDictionary; FTag : TFslObject; FTagInt: integer; @@ -482,6 +489,7 @@ TFHIRObject = class (TFslObject) Property Tags[name : String] : String read getTags write SetTags; function HasTag(name : String): boolean; overload; property Tag : TFslObject read FTag write SetTag; + property TagNoLink : TFslObject read FTagNoLink write FTagNoLink; property TagInt : integer read FTagInt write FTagInt; // this is populated by the json and xml parsers if requested @@ -592,6 +600,8 @@ TFHIRObjectList = class (TFslObjectList) end; TFHIRResourceV = class (TFHIRObject) + private + FSourcePackage : String; protected function GetProfileVersion: TFHIRVersion; virtual; procedure SetProfileVersion(Value: TFHIRVersion); virtual; @@ -604,6 +614,7 @@ TFHIRResourceV = class (TFHIRObject) procedure checkNoImplicitRules(place, role : String); virtual; abstract; property profileVersion : TFHIRVersion read GetProfileVersion write SetProfileVersion; + property SourcePackage : String read FSourcePackage write FSourcePackage; end; { TFHIRWorkerContextV } @@ -626,7 +637,7 @@ TFHIRWorkerContextV = class (TFslObject) property Packages : TStringList read FPackages; Property LangList : THTTPLanguageList read FLangList write SetLangList; - procedure loadResourceJson(rtype, id : String; json : TStream); virtual; abstract; + procedure loadResourceJson(packageId : String; rtype, id : String; json : TStream); virtual; abstract; Property version : TFHIRVersion read GetVersion; function versionString : String; function oid2Uri(oid : String) : String; virtual; abstract; diff --git a/library/fhir/fhir_pathengine.pas b/library/fhir/fhir_pathengine.pas index 3f84dfa1c..d8edea227 100644 --- a/library/fhir/fhir_pathengine.pas +++ b/library/fhir/fhir_pathengine.pas @@ -505,12 +505,12 @@ procedure TFHIRPathLexer.prevChar; class function TFHIRPathLexer.processConstant(s: String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; i : integer; ch : char; u : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try i := 2; while i < length(s) do @@ -1059,9 +1059,9 @@ function TFHIRPathLexer.isStringConstant : boolean; function TFHIRPathLexer.takeDottedToken() : String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(take()); while not done() and (FCurrent = '.') do diff --git a/library/fhir/fhir_tx.pas b/library/fhir/fhir_tx.pas new file mode 100644 index 000000000..2fc3afe71 --- /dev/null +++ b/library/fhir/fhir_tx.pas @@ -0,0 +1,960 @@ +unit fhir_tx; + +{$i fhir.inc} + +interface + + +uses + SysUtils, Classes, + fsl_base, fsl_collections, fsl_utilities, fsl_http, fsl_lang, fsl_logging, fsl_i18n, fsl_versions, fsl_threads, + fhir_objects, fhir_common, ftx_service, fhir_factory, fhir_xhtml, fhir_extensions, fhir_uris, fhir_parser, + fhir_codesystem_service; + + type + + // this is denial of service protection. A terminology operation is not allowed to take too long, and + // it's not allowed to recurse + + TGetCurrentRequestCountEvent = function : integer of Object; + + { TTerminologyOperationContext } + + TTerminologyOperationContext = class (TFslObject) + private + FId : String; + FStartTime : UInt64; + FContexts : TStringList; + FLangList : THTTPLanguageList; + FI18n : TI18nSupport; + FDeadTime : Cardinal; + FNotes : TStringList; + FOwnsNotes : boolean; + FOnGetCurrentRequestCount: TGetCurrentRequestCountEvent; + public + constructor Create(i18n : TI18nSupport; id : String; langList : THTTPLanguageList; deadTime : cardinal; getRequestCount : TGetCurrentRequestCountEvent); + destructor Destroy; override; + + property reqId : String read FId; + function copy : TTerminologyOperationContext; + function deadCheck(var time : integer) : boolean; + procedure seeContext(vurl : String); + procedure clearContexts; + + procedure addNote(vs : TFHIRValueSetW; note : String); + function notes : String; + function hasNotes : boolean; + property OnGetCurrentRequestCount : TGetCurrentRequestCountEvent read FOnGetCurrentRequestCount write FOnGetCurrentRequestCount; + + class function renderCoded(system : TCodeSystemProvider) : String; overload; + class function renderCoded(system, version : String) : String; overload; + class function renderCoded(system, version, code : String) : String; overload; + class function renderCoded(system, version, code, display : String) : String; overload; + class function renderCoded(code : TFhirCodingW) : String; overload; + class function renderCoded(code : TFhirCodeableConceptW) : String; overload; + end; + + TTrueFalseUnknown = (bTrue, bFalse, bUnknown); + + TFhirExpansionParamsVersionRuleMode = (fvmDefault, fvmCheck, fvmOverride); + + { TFhirExpansionParamsVersionRule } + + TFhirExpansionParamsVersionRule = class (TFslObject) + private + Fsystem : String; + Fversion : String; + FMode : TFhirExpansionParamsVersionRuleMode; + protected + function sizeInBytesV(magic : integer) : cardinal; override; + public + constructor Create(system, version : String); overload; + constructor Create(system, version : String; mode : TFhirExpansionParamsVersionRuleMode); overload; + + property system : String read FSystem write FSystem; + property version : String read FVersion write FVersion; + property mode : TFhirExpansionParamsVersionRuleMode read FMode write FMode; + + function asString : String; + end; + + { TFHIRTxOperationParams } + + TFHIRTxOperationParams = class (TFslObject) + private + FVersionRules : TFslList; + FactiveOnly: boolean; + FexcludeNested: boolean; + FGenerateNarrative: boolean; + FlimitedExpansion: boolean; + FexcludeNotForUI: boolean; + FexcludePostCoordinated: boolean; + FincludeDesignations: boolean; + FincludeDefinition: boolean; + FUid: String; + FMembershipOnly : boolean; + FDefaultToLatestVersion : boolean; + FIncompleteOK: boolean; + FProperties : TStringList; + FDisplayWarning : boolean; + FHTTPLanguages : THTTPLanguageList; + FDisplayLanguages : THTTPLanguageList; + FDesignations : TStringList; + FDiagnostics : boolean; + + FHasactiveOnly : boolean; + FHasExcludeNested : boolean; + FHasGenerateNarrative : boolean; + FHasLimitedExpansion : boolean; + + FHesExcludeNotForUI : boolean; + FHasExcludePostCoordinated : boolean; + FHasIncludeDesignations : boolean; + FHasIncludeDefinition : boolean; + FHasDefaultToLatestVersion : boolean; + FHasIncompleteOK : boolean; + FHasexcludeNotForUI : boolean; + FHasMembershipOnly : boolean; + FHasDisplayWarning : boolean; + FAltCodeRules : TAlternateCodeOptions; + + function GetHasDesignations: boolean; + function GetHasHTTPLanguages: boolean; + function GetHasDisplayLanguages: boolean; + procedure SetHTTPLanguages(value : THTTPLanguageList); + procedure SetDisplayLanguages(value : THTTPLanguageList); + procedure SetActiveOnly(value : boolean); + procedure SetExcludeNested(value : boolean); + procedure SetGenerateNarrative(value : boolean); + procedure SetLimitedExpansion(value : boolean); + procedure SetExcludeNotForUI(value : boolean); + procedure SetExcludePostCoordinated(value : boolean); + procedure SetIncludeDesignations(value : boolean); + procedure SetIncludeDefinition(value : boolean); + procedure SetDefaultToLatestVersion(value : boolean); + procedure SetIncompleteOK(value : boolean); + procedure SetDisplayWarning(value : boolean); + procedure SetMembershipOnly(value : boolean); + protected + function sizeInBytesV(magic : integer) : cardinal; override; + public + constructor Create; override; + destructor Destroy; override; + function link : TFHIRTxOperationParams; + + class function defaultProfile : TFHIRTxOperationParams; + + procedure seeParameter(name : String; value : TFHIRObject; isValidation, overwrite : boolean); + + property versionRules : TFslList read FVersionRules; + + function getVersionForRule(systemURI : String; mode : TFhirExpansionParamsVersionRuleMode) : String; + procedure seeVersionRule(url : String; mode : TFhirExpansionParamsVersionRuleMode); + + property activeOnly : boolean read FactiveOnly write SetActiveOnly; + property HTTPLanguages : THTTPLanguageList read FHTTPLanguages write SetHTTPLanguages; + property DisplayLanguages : THTTPLanguageList read FDisplayLanguages write SetDisplayLanguages; + function workingLanguages : THTTPLanguageList; + function langSummary : String; + property includeDefinition : boolean read FincludeDefinition write SetincludeDefinition; + property generateNarrative : boolean read FGenerateNarrative write SetGenerateNarrative; + property limitedExpansion : boolean read FlimitedExpansion write SetlimitedExpansion; // deprecated + property includeDesignations : boolean read FincludeDesignations write SetincludeDesignations; + property excludeNested : boolean read FexcludeNested write SetexcludeNested; + property excludeNotForUI : boolean read FexcludeNotForUI write SetexcludeNotForUI; + property excludePostCoordinated : boolean read FexcludePostCoordinated write SetexcludePostCoordinated; + property membershipOnly : boolean read FMembershipOnly write SetMembershipOnly; + property uid : String read FUid write FUid; + property defaultToLatestVersion : boolean read FDefaultToLatestVersion write SetDefaultToLatestVersion; + property incompleteOK : boolean read FIncompleteOK write SetIncompleteOK; + property displayWarning : boolean read FDisplayWarning write SetDisplayWarning; + property properties : TStringList read FProperties; + property altCodeRules : TAlternateCodeOptions read FAltCodeRules; + property designations : TStringList read FDesignations; + property diagnostics : boolean read FDiagnostics write FDiagnostics; + + + property hasActiveOnly : boolean read FHasactiveOnly; + property hasIncludeDefinition : boolean read FHasincludeDefinition; + property hasGenerateNarrative : boolean read FHasGenerateNarrative; + property hasLimitedExpansion : boolean read FHaslimitedExpansion; + property hasIncludeDesignations : boolean read FHasincludeDesignations; + property hasExcludeNested : boolean read FHasexcludeNested; + property hasExcludeNotForUI : boolean read FHasexcludeNotForUI; + property hasExcludePostCoordinated : boolean read FHasexcludePostCoordinated; + property hasMembershipOnly : boolean read FHasMembershipOnly; + property hasDefaultToLatestVersion : boolean read FHasDefaultToLatestVersion; + property hasIncompleteOK : boolean read FHasIncompleteOK; + property hasDisplayWarning : boolean read FHasDisplayWarning; + property hasHTTPLanguages : boolean read GetHasHTTPLanguages; + property hasDisplayLanguages : boolean read GetHasDisplayLanguages; + property hasDesignations : boolean read GetHasDesignations; + + function summary : string; + function verSummary : String; + function hash : String; + end; + + TGetProviderEvent = function (sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider of object; + TGetSystemVersionsEvent = procedure (sender : TObject; url : String; list : TStringlist) of object; + + { TTerminologyWorker } + + TTerminologyWorker = class (TFslObject) + protected + FOpContext : TTerminologyOperationContext; + FFactory : TFHIRFactory; + FOnGetCSProvider : TGetProviderEvent; + FOnListCodeSystemVersions : TGetSystemVersionsEvent; + FAdditionalResources : TFslMetadataResourceList; + FLanguages : TIETFLanguageDefinitions; + FI18n : TI18nSupport; + FLangList : THTTPLanguageList; + FNoCacheThisOne : boolean; + FParams : TFHIRTxOperationParams; + FRequiredSupplements : TStringList; + + function costDiags(e : ETooCostly) : ETooCostly; + function sizeInBytesV(magic : integer) : cardinal; override; + function vsHandle : TFHIRValueSetW; virtual; abstract; + procedure deadCheck(place : String); virtual; + function findInAdditionalResources(url, version, resourceType : String; error : boolean) : TFHIRMetadataResourceW; + function findCodeSystem(url, version : String; params : TFHIRTxOperationParams; kinds : TFhirCodeSystemContentModeSet; nullOk : boolean) : TCodeSystemProvider; + function listVersions(url : String) : String; + procedure loadSupplements(cse: TFHIRCodeSystemEntry; url: String); + procedure checkSupplements(cs: TCodeSystemProvider; src: TFHIRXVersionElementWrapper); + public + constructor Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); overload; + destructor Destroy; override; + property opContext : TTerminologyOperationContext read FOpContext; + end; + + { TFHIRCodeSystemInformationProvider } + + TFHIRCodeSystemInformationProvider = class (TTerminologyWorker) + public + procedure lookupCode(coding : TFHIRCodingW; profile : TFHIRTxOperationParams; props : TArray; resp : TFHIRLookupOpResponseW); + end; + +const + CODES_TFhirExpansionParamsVersionRuleMode : array [TFhirExpansionParamsVersionRuleMode] of String = ('Default', 'Check', 'Override'); + + LOOKUP_DEAD_TIME_SECS = 30; + +implementation + +{ TTerminologyOperationContext } + +constructor TTerminologyOperationContext.Create(i18n: TI18nSupport; id : String; langList : THTTPLanguageList; deadTime : cardinal; getRequestCount : TGetCurrentRequestCountEvent); +begin + inherited create; + FI18n := i18n; + FId := id; + FLangList := langList; + FContexts := TStringList.create; + FStartTime := GetTickCount64; + FOnGetCurrentRequestCount := getRequestCount; + FDeadTime := deadTime; + FNotes := TStringList.create; + FOwnsNotes := true; +end; + +destructor TTerminologyOperationContext.Destroy; +begin + if FOwnsNotes then + FNotes.free; + FLangList.free; + FI18n.free; + FContexts.free; + inherited Destroy; +end; + +function TTerminologyOperationContext.copy: TTerminologyOperationContext; +begin + result := TTerminologyOperationContext.create(FI18n.link, FId, FLangList.link, FDeadTime, OnGetCurrentRequestCount); + result.FContexts.assign(FContexts); + result.FStartTime := FStartTime; + result.FNotes.free; + result.FOwnsNotes := false; + result.FNotes := FNotes; +end; + +function TTerminologyOperationContext.deadCheck(var time : integer): boolean; +var + dt : UInt64; + rq : integer; +begin + time := FDeadTime; + if UnderDebugger then + exit(false); + + // once timelimit is hit, living on borrowed time until request counts build + if assigned(OnGetCurrentRequestCount) and (OnGetCurrentRequestCount > 10) then + time := time * 5; + + dt := FStartTime + (time * 1000); + result := GetTickCount64 > dt; +end; + +procedure TTerminologyOperationContext.seeContext(vurl: String); +var + r, s : String; +begin + if FContexts.IndexOf(vurl) > -1 then + begin + r := ''; + for s in FContexts do + CommaAdd(r, s); + raise ETerminologyError.create(FI18n.translate('VALUESET_CIRCULAR_REFERENCE', FLangList, [vurl, '['+r+']']), itProcessing); + end + else + FContexts.add(vurl); +end; + +procedure TTerminologyOperationContext.clearContexts; +begin + FContexts.clear; +end; + +procedure TTerminologyOperationContext.addNote(vs : TFHIRValueSetW; note: String); +var + s : string; +begin + s := DescribePeriodMS(GetTickCount64 - FStartTime)+' '+vs.vurl+': '+note; + Logging.log(s); + FNotes.add(s); +end; + +function TTerminologyOperationContext.notes: String; +begin + result := FNotes.Text; +end; + +function TTerminologyOperationContext.hasNotes: boolean; +begin + result := FNotes.Count > 0; +end; + +class function TTerminologyOperationContext.renderCoded(system: TCodeSystemProvider): String; +begin + result := system.systemUri+'|'+system.version; + if (system.sourcePackage <> '') then + result := result+' (from '+system.sourcePackage+')'; +end; + +class function TTerminologyOperationContext.renderCoded(system, version : String): String; +begin + if (version = '') then + result := system + else + result := system+'|'+version; +end; + +class function TTerminologyOperationContext.renderCoded(system, version, code : String): String; +begin + result := renderCoded(system, version)+'#'+code; +end; + +class function TTerminologyOperationContext.renderCoded(system, version, code, display : String): String; +begin + result := renderCoded(system, version, code)+' ("'+display+'")'; +end; + +class function TTerminologyOperationContext.renderCoded(code: TFhirCodingW): String; +begin + result := renderCoded(code.systemUri, code.version, code.code, code.display); +end; + +class function TTerminologyOperationContext.renderCoded(code: TFhirCodeableConceptW): String; +var + c : TFHIRCodingW; +begin + result := ''; + for c in code.codings.forEnum do + CommaAdd(result, renderCoded(c)); + result := '['+result+']'; +end; + +{ TTerminologyWorker } + +constructor TTerminologyWorker.Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); +begin + Create; + FFactory := factory; + FOpContext := opContext; + FOnGetCSProvider := getCS; + FOnListCodeSystemVersions := getVersions; + FAdditionalResources := txResources; + FLanguages := languages; + FI18n := i18n; + FRequiredSupplements := TStringList.create; +end; + +destructor TTerminologyWorker.Destroy; +begin + FLangList.free; + FLanguages.free; + FAdditionalResources.free; + FFactory.free; + FParams.free; + FI18n.free; + FOpContext.free; + FRequiredSupplements.free; + inherited; +end; + + +function isLaterVersion(test, base : String) : boolean; +begin + if TSemanticVersion.isValid(test) and TSemanticVersion.isValid(base) then + result := TSemanticVersion.isMoreRecent(test, base) + else + result := StringCompare(test, base) > 0; +end; + +function TTerminologyWorker.findInAdditionalResources(url, version, resourceType : String; error : boolean) : TFHIRMetadataResourceW; +var + r : TFHIRMetadataResourceW; + matches : TFslMetadataResourceList; + i, t : integer; +begin + if FAdditionalResources = nil then + exit(nil); + + matches := TFslMetadataResourceList.create; + try + for r in FAdditionalResources do + begin + deadCheck('findInAdditionalResources'); + if (url <> '') and ((r.url = url) or (r.vurl = url)) and ((version = '') or (version = r.version)) then + begin + if r.fhirType <> resourceType then + if error then + raise EFHIRException.Create('Attempt to reference '+url+' as a '+resourceType+' when it''s a '+r.fhirType) + else + exit(nil); + matches.add(r.link); + end; + end; + if matches.Count = 0 then + exit(nil) + else + begin + t := 0; + for i := 1 to matches.count - 1 do + if isLaterVersion(matches[i].version, matches[t].version) then + t := i; + exit(matches[t]); + end; + finally + matches.free; + end; +end; + +function TTerminologyWorker.findCodeSystem(url, version: String; params: TFHIRTxOperationParams; kinds : TFhirCodeSystemContentModeSet; nullOk: boolean): TCodeSystemProvider; +var + r, r2 : TFHIRMetadataResourceW; + cs, cs2 : TFhirCodeSystemW; + ts : TStringlist; + cse : TFHIRCodeSystemEntry; +begin + if (url = '') then + exit(nil); + if (url = URI_NDC) then + begin + result := nil; + end; + + cs := findInAdditionalResources(url, version, 'CodeSystem', not nullOk) as TFhirCodeSystemW; + if (cs <> nil) and (cs.content = cscmComplete) then + begin + cse := TFHIRCodeSystemEntry.Create(cs.link); + try + loadSupplements(cse, url); + exit(TFhirCodeSystemProvider.Create(FLanguages.link, FI18n.link, FFactory.link, cse.link)); + finally + cse.free; + end; + end; + + result := FOnGetCSProvider(self, url, version, FParams, true); + + if (result <> nil) then + exit(result); + + if (cs <> nil) and (cs.content in kinds) then + begin + cse := TFHIRCodeSystemEntry.Create(cs.link); + try + if cs.content <> cscmSupplement then + loadSupplements(cse, url); + exit(TFhirCodeSystemProvider.Create(FLanguages.link, FI18n.link, FFactory.link, cse.link)); + finally + cse.free; + end; + end; + + if not nullok then + if version = '' then + raise ETerminologySetup.create('Unable to provide support for code system '+url) + else + begin + ts := TStringList.Create; + try + FOnListCodeSystemVersions(self, url, ts); + if (ts.Count = 0) then + raise ETerminologySetup.create('Unable to provide support for code system '+url+' version '+version) + else + raise ETerminologySetup.create('Unable to provide support for code system '+url+' version '+version+' (known versions = '+ts.CommaText+')'); + finally + ts.free; + end; + + end; +end; + +function TTerminologyWorker.costDiags(e: ETooCostly): ETooCostly; +begin + e.diagnostics := FOpContext.notes; + result := e; +end; + +function TTerminologyWorker.sizeInBytesV(magic : integer) : cardinal; +begin + result := inherited sizeInBytesV(magic); + inc(result, FFactory.sizeInBytes(magic)); + inc(result, FParams.sizeInBytes(magic)); + inc(result, FAdditionalResources.sizeInBytes(magic)); +end; + +procedure TTerminologyWorker.deadCheck(place: String); +var + time : integer; +begin + SetThreadStatus(ClassName+'.'+place); + if FOpContext.deadCheck(time) then + begin + FOpContext.addNote(vsHandle, 'Operation took too long @ '+place+' ('+className+')'); + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY_TIME', FParams.HTTPlanguages, ['??', inttostr(time)]))); + end; +end; + +function TTerminologyWorker.listVersions(url: String): String; +var + ts : TStringList; + matches : TFslMetadataResourceList; + r : TFHIRMetadataResourceW; +begin + ts := TStringList.Create; + try + ts.Sorted := true; + ts.Duplicates := Classes.dupIgnore; + if FAdditionalResources <> nil then + begin + for r in FAdditionalResources do + begin + if (r.url = url) then + ts.Add(r.version); + end; + end; + FOnListCodeSystemVersions(self, url, ts); + result := ts.CommaText; + finally + ts.free; + end; +end; + +procedure TTerminologyWorker.loadSupplements(cse : TFHIRCodeSystemEntry; url : String); +var + r : TFHIRMetadataResourceW; + cs : TFhirCodeSystemW; +begin + for r in FAdditionalResources do + begin + if r is TFHIRCodeSystemW then + begin + cs := r as TFHIRCodeSystemW; + if (cs.supplements = url) then + cse.Supplements.add(cs.link); + end; + end; +end; + +procedure TTerminologyWorker.checkSupplements(cs : TCodeSystemProvider; src : TFHIRXVersionElementWrapper); +var + ext : TFHIRExtensionW; + i : integer; +begin + for ext in src.getExtensionsW(EXT_VSSUPPLEMENT).forEnum do + if not cs.hasSupplement(ext.valueAsString) then + raise ETerminologyError.create('ValueSet depends on supplement '''+ext.valueAsString+''' on '+cs.systemUri+' that is not known', itBusinessRule); + for i := FRequiredSupplements.count - 1 downto 0 do + if cs.hasSupplement(FRequiredSupplements[i]) then + FRequiredSupplements.delete(i); +end; + +{ TFHIRCodeSystemInformationProvider } + +procedure TFHIRCodeSystemInformationProvider.lookupCode(coding: TFHIRCodingW; profile: TFHIRTxOperationParams; props: TArray; resp: TFHIRLookupOpResponseW); +var + provider : TCodeSystemProvider; + ctxt : TCodeSystemProviderContext; + s : String; + p : TFHIRLookupOpRespPropertyW; + params : TFHIRTxOperationParams; + + function hasProp(name : String; def : boolean) : boolean; + begin + if (props = nil) or (length(props) = 0) then + result := def + else + result := StringArrayExistsInsensitive(props, name) or StringArrayExistsInsensitive(props, '*') ; + end; +begin + params := TFHIRTxOperationParams.Create; + try + params.defaultToLatestVersion := true; + provider := findCodeSystem(coding.systemUri, coding.version, profile, [cscmComplete, cscmFragment], false); + try + resp.name := provider.name(nil); + resp.systemUri := provider.systemUri; + s := provider.version; + if (s <> '') then + resp.version := s; + ctxt := provider.locate(coding.code); + try + if ctxt = nil then + raise ETerminologyError.Create('Unable to find code '+coding.code+' in '+coding.systemUri+' version '+s, itInvalid); + + if (hasProp('abstract', true) and provider.IsAbstract(ctxt)) then + begin + p := resp.addProp('abstract'); + p.value := FFactory.makeBoolean(true); + end; + if (hasProp('inactive', true)) then + begin + p := resp.addProp('inactive'); + p.value := FFactory.makeBoolean(provider.IsInactive(ctxt)); + end; + if hasProp('definition', true) and (provider.Definition(ctxt) <> '') then + begin + p := resp.addProp('definition'); + p.value := FFactory.makeString(provider.Definition(ctxt)); + end; + resp.code := coding.code; + resp.display := provider.Display(ctxt, FlangList); + provider.extendLookup(FFactory, ctxt, FlangList, props, resp); + finally + ctxt.free; + end; + finally + provider.free; + end; + finally + params.free; + end; +end; + +{ TFHIRTxOperationParams } + +constructor TFHIRTxOperationParams.Create; +begin + inherited; + FVersionRules := TFslList.create; + FProperties := TStringList.create; + FAltCodeRules := TAlternateCodeOptions.create; + FDesignations := TStringlist.create; + + FGenerateNarrative := true; +end; + +procedure TFHIRTxOperationParams.SetHTTPLanguages(value: THTTPLanguageList); +begin + FHTTPLanguages.free; + FHTTPLanguages := value; +end; + +procedure TFHIRTxOperationParams.SetDisplayLanguages(value: THTTPLanguageList); +begin + FDisplayLanguages.free; + FDisplayLanguages := value; +end; + +function TFHIRTxOperationParams.GetHasHTTPLanguages: boolean; +begin + result := (FHTTPLanguages <> nil) and (FHTTPLanguages.source <> ''); +end; + +function TFHIRTxOperationParams.GetHasDisplayLanguages: boolean; +begin + result := (FDisplayLanguages <> nil) and (FDisplayLanguages.source <> ''); +end; + +function TFHIRTxOperationParams.GetHasDesignations: boolean; +begin + result := designations.Count > 0; +end; + +procedure TFHIRTxOperationParams.SetActiveOnly(value : boolean); +begin + FActiveOnly := value; + FHasActiveOnly := true; +end; + +procedure TFHIRTxOperationParams.SetExcludeNested(value : boolean); +begin + FExcludeNested := value; + FHasExcludeNested:= true; +end; + +procedure TFHIRTxOperationParams.SetGenerateNarrative(value : boolean); +begin + FGenerateNarrative := value; + FHasGenerateNarrative := true; +end; + +procedure TFHIRTxOperationParams.SetLimitedExpansion(value : boolean); +begin + FLimitedExpansion := value; + FHasLimitedExpansion := true; +end; + +procedure TFHIRTxOperationParams.SetExcludeNotForUI(value : boolean); +begin + FExcludeNotForUI := value; + FHasExcludeNotForUI := true; +end; + +procedure TFHIRTxOperationParams.SetExcludePostCoordinated(value : boolean); +begin + FExcludePostCoordinated := value; + FHasExcludePostCoordinated := true; +end; + +procedure TFHIRTxOperationParams.SetIncludeDesignations(value : boolean); +begin + FIncludeDesignations := value; + FHasIncludeDesignations := true; +end; + +procedure TFHIRTxOperationParams.SetIncludeDefinition(value : boolean); +begin + FIncludeDefinition := value; + FHasIncludeDefinition := true; +end; + +procedure TFHIRTxOperationParams.SetDefaultToLatestVersion(value : boolean); +begin + FDefaultToLatestVersion := value; + FHasDefaultToLatestVersion := true; +end; + +procedure TFHIRTxOperationParams.SetIncompleteOK(value : boolean); +begin + FIncompleteOK := value; + FHasIncompleteOK := true; +end; + +procedure TFHIRTxOperationParams.SetDisplayWarning(value : boolean); +begin + FDisplayWarning := value; + FHasDisplayWarning := true; +end; + +procedure TFHIRTxOperationParams.SetMembershipOnly(value : boolean); +begin + FMembershipOnly := value; + FHasMembershipOnly := true; +end; + +function TFHIRTxOperationParams.sizeInBytesV(magic : integer) : cardinal; +begin + result := inherited sizeInBytesV(magic); + inc(result, FVersionRules.sizeInBytes(magic)); + inc(result, FHTTPLanguages.sizeInBytes(magic)); + inc(result, FDisplayLanguages.sizeInBytes(magic)); + inc(result, (FUid.length * sizeof(char)) + 12); +end; + +class function TFHIRTxOperationParams.defaultProfile: TFHIRTxOperationParams; +begin + result := TFHIRTxOperationParams.Create; +end; + +procedure TFHIRTxOperationParams.seeParameter(name: String; value: TFHIRObject; isValidation, overwrite: boolean); +begin + if (value <> nil) then + begin + if (name = 'displayLanguage') and (not HasHTTPLanguages or overwrite) then + DisplayLanguages := THTTPLanguageList.create(value.primitiveValue, not isValidation); + + if (name = 'includeAlternateCodes') then + altCodeRules.seeParam(value.primitiveValue); + if (name = 'designation') then + designations.add(value.primitiveValue); + end; +end; + +function TFHIRTxOperationParams.getVersionForRule(systemURI: String; mode: TFhirExpansionParamsVersionRuleMode): String; +var + rule : TFhirExpansionParamsVersionRule; +begin + for rule in FVersionRules do + if (rule.system = systemUri) and (rule.mode = mode) then + exit(rule.version); + result := ''; +end; + +procedure TFHIRTxOperationParams.seeVersionRule(url: String; mode: TFhirExpansionParamsVersionRuleMode); +var + sl : TArray; +begin + sl := url.split(['|']); + if (Length(sl) = 2) then + versionRules.Add(TFhirExpansionParamsVersionRule.Create(sl[0], sl[1], mode)) + else + raise ETerminologyError.Create('Unable to understand '+CODES_TFhirExpansionParamsVersionRuleMode[mode]+' system version "'+url+'"', itInvalid); +end; + +function TFHIRTxOperationParams.workingLanguages: THTTPLanguageList; +begin + if FDisplayLanguages <> nil then + result := FDisplayLanguages + else + result := FHTTPLanguages; +end; + +function TFHIRTxOperationParams.langSummary: String; +begin + if (FDisplayLanguages <> nil) and (FDisplayLanguages.source <> '') then + result := FDisplayLanguages.asString(false) + else if (FHTTPLanguages <> nil) and (FHTTPLanguages.source <> '') then + result := FHTTPLanguages.asString(false) + else + result := '--' +end; + +function TFHIRTxOperationParams.summary: string; + procedure b(s : String; v : boolean); + begin + if v then + CommaAdd(result, s); + end; + procedure s(s : String; v : String); + begin + if v <> '' then + CommaAdd(result, s+'='+v); + end; +begin + result := ''; + s('uid', FUid); + if (FProperties <> nil) then + s('properties', FProperties.commaText); + if (FHTTPLanguages <> nil) then + s('http-lang' , FHTTPLanguages.asString(true)); + if (FDisplayLanguages <> nil) then + s('disp-lang' , FDisplayLanguages.asString(true)); + if (FDesignations <> nil) then + s('designations', FDesignations.commaText); + b('active-only', FactiveOnly); + b('exclude-nested', FexcludeNested); + b('generate-narrative', FGenerateNarrative); + b('limited-exansion', FlimitedExpansion); + b('for-ui', FexcludeNotForUI); + b('exclude-post-coordinated', FexcludePostCoordinated); + b('include-designations', FincludeDesignations); + b('include-definition', FincludeDefinition); + b('membership-only', FMembershipOnly); + b('default-to-latest', FDefaultToLatestVersion); + b('incomplete-ok', FIncompleteOK); + b('display-warning', FDisplayWarning); +end; + +function TFHIRTxOperationParams.verSummary: String; +var + p : TFhirExpansionParamsVersionRule; +begin + result := ''; + for p in FVersionRules do + CommaAdd(result, p.asString); +end; + +destructor TFHIRTxOperationParams.Destroy; +begin + FAltCodeRules.free; + FVersionRules.free; + FHTTPLanguages.free; + FDisplayLanguages.free; + FProperties.free; + FDesignations.free; + inherited; +end; + +function TFHIRTxOperationParams.hash: String; +var + s : String; + l : TIETFLang; + t : TFhirExpansionParamsVersionRule; + function b(v : boolean):string; + begin + if v then + result := '1|' + else + result := '0|'; + end; +begin + s := FUid+'|'+ b(FMembershipOnly) + '|' + FProperties.CommaText+'|'+ + b(FactiveOnly)+b(FIncompleteOK)+b(FDisplayWarning)+b(FexcludeNested)+b(FGenerateNarrative)+b(FlimitedExpansion)+b(FexcludeNotForUI)+b(FexcludePostCoordinated)+ + b(FincludeDesignations)+b(FincludeDefinition)+b(FHasactiveOnly)+b(FHasExcludeNested)+b(FHasGenerateNarrative)+ + b(FHasLimitedExpansion)+b(FHesExcludeNotForUI)+b(FHasExcludePostCoordinated)+b(FHasIncludeDesignations)+ + b(FHasIncludeDefinition)+b(FHasDefaultToLatestVersion)+b(FHasIncompleteOK)+b(FHasDisplayWarning)+b(FHasexcludeNotForUI)+b(FHasMembershipOnly)+b(FDefaultToLatestVersion); + + if hasHTTPLanguages then + s := s + FHTTPLanguages.AsString(true)+'|'; + if hasDisplayLanguages then + s := s + '*'+FDisplayLanguages.AsString(true)+'|'; + if hasDesignations then + s := s + FDesignations.commaText+'|'; + for t in FVersionRules do + s := s + t.asString+'|'; + result := inttostr(HashStringToCode32(s)); +end; + +function TFHIRTxOperationParams.link: TFHIRTxOperationParams; +begin + result := TFHIRTxOperationParams(inherited Link); +end; + + +{ TFhirExpansionParamsVersionRule } + +constructor TFhirExpansionParamsVersionRule.Create(system, version: String; mode: TFhirExpansionParamsVersionRuleMode); +begin + inherited Create; + FSystem := system; + FVersion := version; + FMode := mode; +end; + +function TFhirExpansionParamsVersionRule.asString: String; +begin + result := Fsystem+'#'+Fversion+'/'+inttostr(ord(FMode)); +end; + +constructor TFhirExpansionParamsVersionRule.Create(system, version: String); +begin + inherited Create; + FSystem := system; + FVersion := version; +end; + +function TFhirExpansionParamsVersionRule.sizeInBytesV(magic : integer) : cardinal; +begin + result := inherited sizeInBytesV(magic); + inc(result, (Fsystem.length * sizeof(char)) + 12); + inc(result, (Fversion.length * sizeof(char)) + 12); +end; + + +end. + diff --git a/library/fhir/fhir_utilities.pas b/library/fhir/fhir_utilities.pas index 61f5d472c..171fa8bcd 100644 --- a/library/fhir/fhir_utilities.pas +++ b/library/fhir/fhir_utilities.pas @@ -88,6 +88,7 @@ function DetectFormat(bytes : TBytes) : TFHIRFormat; overload; function DetectFormat(oContent : TFslBuffer) : TFHIRFormat; overload; function csName(url : string) : String; +function csUriForProperty(code : String) : String; implementation @@ -509,5 +510,22 @@ function csName(url : string) : String; end; +function csUriForProperty(code : String) : String; +begin + if (code = 'status') then result := 'http://hl7.org/fhir/concept-properties#status' + else if (code = 'inactive') then result := 'http://hl7.org/fhir/concept-properties#inactive' + else if (code = 'effectiveDate') then result := 'http://hl7.org/fhir/concept-properties#effectiveDate' + else if (code = 'deprecationDate') then result := 'http://hl7.org/fhir/concept-properties#deprecationDate' + else if (code = 'retirementDate') then result := 'http://hl7.org/fhir/concept-properties#retirementDate' + else if (code = 'notSelectable') then result := 'http://hl7.org/fhir/concept-properties#notSelectable' + else if (code = 'parent') then result := 'http://hl7.org/fhir/concept-properties#parent' + else if (code = 'child') then result := 'http://hl7.org/fhir/concept-properties#child' + else if (code = 'partOf') then result := 'http://hl7.org/fhir/concept-properties#partOf' + else if (code = 'synonym') then result := 'http://hl7.org/fhir/concept-properties#synonym' + else if (code = 'comment') then result := 'http://hl7.org/fhir/concept-properties#comment' + else if (code = 'itemWeight') then result := 'http://hl7.org/fhir/concept-properties#itemWeight' + else + result := ''; +end; end. diff --git a/library/fhir/fhir_xhtml.pas b/library/fhir/fhir_xhtml.pas index b2fec97ee..b5d01a2f3 100644 --- a/library/fhir/fhir_xhtml.pas +++ b/library/fhir/fhir_xhtml.pas @@ -1301,11 +1301,11 @@ function FixRelativeReference(s : string; indent : integer) : String; function normaliseWhitespace(s : String) : String; var w : boolean; - b : TStringBuilder; + b : TFslStringBuilder; c : Char; begin w := false; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for c in s do begin diff --git a/library/fhir2/fhir2_common.pas b/library/fhir2/fhir2_common.pas index 30f9e4e42..1afd63842 100644 --- a/library/fhir2/fhir2_common.pas +++ b/library/fhir2/fhir2_common.pas @@ -178,7 +178,8 @@ TFhirOperationOutcome2 = class (TFhirOperationOutcomeW) function text : String; override; function code : TFhirIssueType; override; procedure addIssue(issue : TFhirOperationOutcomeIssueW; owns : boolean); override; - procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; code : TOpIssueCode; addIfDuplicate : boolean = false); overload; override; function hasIssues : boolean; override; function issues : TFslList; override; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; override; @@ -468,8 +469,8 @@ TFhirValueSetExpansionContains2 = class (TFhirValueSetExpansionContainsW) function contains : TFslList; override; procedure addDesignation(lang, use, value : String); override; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); override; - procedure addProperty(code : String; value : TFHIRObject); override; overload; - procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); override; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; override; + procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); overload; override; procedure addContains(contained : TFhirValueSetExpansionContainsW); override; procedure clearContains(); override; function properties : TFslList; override; @@ -571,7 +572,8 @@ TFhirCodeSystemConcept2 = class (TFhirCodeSystemConceptW) function display : String; override; function displayElement : TFHIRPrimitiveW; override; function definition : String; override; - function conceptList : TFhirCodeSystemConceptListW; override; + function conceptList : TFhirCodeSystemConceptListW; override; + function hasConcepts : boolean; override; function conceptCount : integer; override; function designationCount : integer; override; function designations : TFslList; override; @@ -616,6 +618,7 @@ TFhirCodeSystem2 = class (TFhirCodeSystemW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function isInactive(c : TFhirCodeSystemConceptW) : boolean; override; @@ -626,6 +629,7 @@ TFhirCodeSystem2 = class (TFhirCodeSystemW) function getChildren(c : TFhirCodeSystemConceptW) : TFhirCodeSystemConceptListW; override; function getCode(code : String) : TFhirCodeSystemConceptW; override; function buildImplicitValueSet : TFHIRValueSetW; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; function getDate: TFslDateTime; override; function getStatus: TPublicationStatus; override; @@ -634,7 +638,8 @@ TFhirCodeSystem2 = class (TFhirCodeSystemW) procedure setName(Value: String); override; procedure setStatus(Value: TPublicationStatus); override; procedure setUrl(Value: String); override; - procedure setVersion(Value: String); override; + procedure setVersion(Value: String); override; + function GetCaseSensitive: boolean; override; function getContent: TFhirCodeSystemContentMode; override; procedure setContent(Value: TFhirCodeSystemContentMode); override; function getCount: integer; override; @@ -642,6 +647,8 @@ TFhirCodeSystem2 = class (TFhirCodeSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function valueSet : String; override; function supplements : String; override; function getExperimental : boolean; override; @@ -690,6 +697,8 @@ TFHIRValueSet2 = class (TFHIRValueSetW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function source : String; override; function findContains(systemUri, version, code : String) : TFhirValueSetExpansionContainsW; override; function getExperimental : boolean; override; @@ -715,6 +724,8 @@ TFHIRLookupOpRespDesignation2 = class (TFHIRLookupOpRespDesignationW) procedure setUse(Value: TFHIRObject); override; end; + { TFHIRLookupOpResponse2 } + TFHIRLookupOpResponse2 = class (TFHIRLookupOpResponseW) public procedure load(params : TFHIRResourceV); overload; override; @@ -729,8 +740,14 @@ TFHIRLookupOpResponse2 = class (TFHIRLookupOpResponseW) procedure addExtension(name : String; value : boolean); overload; override; function getName: String; override; procedure setName(Value: String); override; + function getCode: String; override; + procedure setCode(Value: String); override; + function getSystem: String; override; + procedure setSystem(Value: String); override; function getDisplay: String; override; - procedure setDisplay(Value: String); override; + procedure setDisplay(Value: String); override; + function getIsAbstract: boolean; override; + procedure setIsAbstract(Value: boolean); override; end; { TFhirConceptMapGroupElementDependsOn2 } @@ -811,6 +828,8 @@ TFhirConceptMap2 = class (TFhirConceptMapW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function sourceDesc : String; override; function targetDesc : String; override; function getExperimental : boolean; override; @@ -1109,6 +1128,8 @@ TFHIRNamingSystem2 = class (TFHIRNamingSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; function getExperimental : boolean; override; @@ -1138,6 +1159,8 @@ TFhirTerminologyCapabilities2 = class (TFhirTerminologyCapabilitiesW) procedure setContext(Value: String); override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; public @@ -1166,6 +1189,8 @@ TFHIRTestScript2 = class (TFHIRTestScriptW) function getDate: TFslDateTime; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; procedure setDate(Value: TFslDateTime); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; @@ -1273,6 +1298,28 @@ procedure TFhirOperationOutcome2.addIssue(level: TIssueSeverity; cause: TFHIRIss iss.locationList.Add(path); end; +procedure TFhirOperationOutcome2.addIssue(level: TIssueSeverity; cause: TFhirIssueType; path, msgId, message: String; code: TOpIssueCode; addIfDuplicate: boolean); +var + iss : TFhirOperationOutcomeIssue; +begin + if not addIfDuplicate then + begin + for iss in (Fres as TFhirOperationOutcome).issueList do + if (iss.details <> nil) and (iss.details.text = message) then + exit(); + end; + + iss := (Fres as TFhirOperationOutcome).issueList.Append; + iss.code:= ExceptionTypeTranslations[cause]; + iss.severity := ISSUE_SEVERITY_MAP2[level]; + iss.details := TFHIRCodeableConcept.Create; + if (code <> oicVoid) then + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[code], ''); + iss.details.text := message; + iss.locationList.Add(path); + iss.addExtension('http://hl7.org/fhir/StructureDefinition/operationoutcome-message-id', msgid); +end; + function TFhirOperationOutcome2.code: TFhirIssueType; var a : TFhirIssueType; @@ -2952,6 +2999,16 @@ procedure TFHIRValueSet2.setPublisher(Value: String); vs.publisher := value; end; +function TFHIRValueSet2.getTitle: String; +begin + result := vs.name; +end; + +procedure TFHIRValueSet2.setTitle(value: String); +begin + // nothing +end; + procedure TFHIRValueSet2.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[value]; @@ -3202,6 +3259,11 @@ function TFhirCodeSystemConcept2.conceptList: TFhirCodeSystemConceptListW; result := FConceptList; end; +function TFhirCodeSystemConcept2.hasConcepts: boolean; +begin + result := (Element as TFhirCodeSystemConcept).hasConceptList; +end; + function TFhirCodeSystemConcept2.definition: String; begin result := (Element as TFhirCodeSystemConcept).definition; @@ -3407,17 +3469,17 @@ function TFHIRLookupOpResponse2.asParams: TFHIRResourceV; result := (op as TFHIROperationResponse).asParams; end; -function TFHIRLookupOpResponse2.GetDisplay: String; +function TFHIRLookupOpResponse2.getDisplay: String; begin result := (op as TFHIRLookupOpResponse).display; end; -function TFHIRLookupOpResponse2.GetName: String; +function TFHIRLookupOpResponse2.getName: String; begin result := (op as TFHIRLookupOpResponse).name; end; -function TFHIRLookupOpResponse2.GetVersion: String; +function TFHIRLookupOpResponse2.getVersion: String; begin result := (op as TFHIRLookupOpResponse).version; end; @@ -3432,17 +3494,47 @@ procedure TFHIRLookupOpResponse2.load(params: TFHIRResourceV); (op as TFHIRLookupOpResponse).load(params as TFhirParameters); end; -procedure TFHIRLookupOpResponse2.SetDisplay(Value: String); +procedure TFHIRLookupOpResponse2.setDisplay(Value: String); begin (op as TFHIRLookupOpResponse).display := value; end; -procedure TFHIRLookupOpResponse2.SetName(Value: String); +function TFHIRLookupOpResponse2.getIsAbstract: boolean; +begin + result := (op as TFHIRLookupOpResponse).abstract; +end; + +procedure TFHIRLookupOpResponse2.setIsAbstract(Value: boolean); +begin + (op as TFHIRLookupOpResponse).abstract := value; +end; + +procedure TFHIRLookupOpResponse2.setName(Value: String); begin (op as TFHIRLookupOpResponse).name := value; end; -procedure TFHIRLookupOpResponse2.SetVersion(Value: String); +function TFHIRLookupOpResponse2.getCode: String; +begin + result := (op as TFHIRLookupOpResponse).code; +end; + +procedure TFHIRLookupOpResponse2.setCode(Value: String); +begin + (op as TFHIRLookupOpResponse).code := value; +end; + +function TFHIRLookupOpResponse2.getSystem: String; +begin + result := (op as TFHIRLookupOpResponse).systemUri; +end; + +procedure TFHIRLookupOpResponse2.setSystem(Value: String); +begin + (op as TFHIRLookupOpResponse).systemUri := value; +end; + +procedure TFHIRLookupOpResponse2.setVersion(Value: String); begin (op as TFHIRLookupOpResponse).version := value; end; @@ -3651,6 +3743,11 @@ function TFhirCodeSystem2.buildImplicitValueSet: TFHIRValueSetW; result := TFHIRValueSet2.Create(vs.Link); end; +function TFhirCodeSystem2.hasAnyDisplays(langs: THTTPLanguageList): boolean; +begin + result := false; +end; + function TFhirCodeSystem2.concept(ndx: integer): TFhirCodeSystemConceptW; begin result := TFhirCodeSystemConcept2.Create(cs.conceptList[ndx].Link); @@ -3661,6 +3758,11 @@ function TFhirCodeSystem2.conceptCount: integer; result := cs.conceptList.Count; end; +function TFhirCodeSystem2.hasConcepts: boolean; +begin + result := cs.hasConceptList; +end; + function TFhirCodeSystem2.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -3853,6 +3955,16 @@ procedure TFhirCodeSystem2.setPublisher(Value: String); vs.publisher := value; end; +function TFhirCodeSystem2.getTitle: String; +begin + result := vs.name; +end; + +procedure TFhirCodeSystem2.setTitle(value: String); +begin + // nothing +end; + procedure TFhirCodeSystem2.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[status]; @@ -3868,6 +3980,11 @@ procedure TFhirCodeSystem2.setVersion(Value: String); vs.version := value; end; +function TFhirCodeSystem2.GetCaseSensitive: boolean; +begin + result := true; +end; + function TFhirCodeSystem2.supplements: String; begin result := ''; @@ -4310,6 +4427,16 @@ procedure TFhirConceptMap2.setPublisher(Value: String); cm.publisher := value; end; +function TFhirConceptMap2.getTitle: String; +begin + result := cm.name; +end; + +procedure TFhirConceptMap2.setTitle(value: String); +begin + // nothing +end; + function TFhirConceptMap2.getContext: String; begin result := cm.context; @@ -5754,6 +5881,17 @@ procedure TFHIRNamingSystem2.setPublisher(Value: String); nm.publisher := value; end; +function TFHIRNamingSystem2.getTitle: String; +begin + result := nm.name; +end; + +procedure TFHIRNamingSystem2.setTitle(value: String); +begin + // nothing + +end; + procedure TFHIRNamingSystem2.setStatus(Value: TPublicationStatus); begin nm.status := MAP_TPublicationStatus[value]; @@ -6034,6 +6172,16 @@ procedure TFhirTerminologyCapabilities2.setPublisher(Value: String); begin end; +function TFhirTerminologyCapabilities2.getTitle: String; +begin + result := ''; +end; + +procedure TFhirTerminologyCapabilities2.setTitle(value: String); +begin + // nothing +end; + procedure TFhirTerminologyCapabilities2.setStatus(Value: TPublicationStatus); begin @@ -6216,6 +6364,16 @@ procedure TFHIRTestScript2.setPublisher(Value: String); ts.publisher := value; end; +function TFHIRTestScript2.getTitle: String; +begin + result := ts.name; +end; + +procedure TFHIRTestScript2.setTitle(value: String); +begin + // nothing +end; + procedure TFHIRTestScript2.setStatus(Value: TPublicationStatus); begin diff --git a/library/fhir2/fhir2_context.pas b/library/fhir2/fhir2_context.pas index 6ca67777a..7a93417f7 100644 --- a/library/fhir2/fhir2_context.pas +++ b/library/fhir2/fhir2_context.pas @@ -56,8 +56,8 @@ TFHIRResourceProxy = class (TFHIRResourceProxyV) procedure loadResource; override; function wrapResource : TFHIRXVersionResourceWrapper; override; public - constructor Create(factory : TFHIRFactory; resource : TFHIRResource); overload; - constructor Create(factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; resource : TFHIRResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; destructor Destroy; override; function link : TFHIRResourceProxy; overload; @@ -143,15 +143,15 @@ implementation { TFHIRResourceProxy } -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; resource: TFHIRResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; resource: TFHIRResource); begin - inherited Create(resource, resource.urlGen, resource.versionGen); + inherited Create(packageId, resource, resource.urlGen, resource.versionGen); FFactory := factory; end; -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); begin - inherited Create(fhirVersionRelease2, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); + inherited Create(packageId, fhirVersionRelease2, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); FFactory := factory; FWorker := worker; FInfo := pi; @@ -186,7 +186,7 @@ procedure TFHIRResourceProxy.loadResource; if FInfo = nil then exit; // not lazy loading - FLock.lock; + FLock.lock('loadResource'); try if FResourceV <> nil then exit; @@ -197,7 +197,7 @@ procedure TFHIRResourceProxy.loadResource; p := FFactory.makeParser(FWorker, ffJson, nil); try - stream := TFileStream.Create(FInfo.filename, fmOpenRead); + stream := TFileStream.Create(FInfo.filename, fmOpenRead + fmShareDenyWrite); try try r := p.parseResource(stream); diff --git a/library/fhir2/fhir2_factory.pas b/library/fhir2/fhir2_factory.pas index 6c4ccb859..81088dd09 100644 --- a/library/fhir2/fhir2_factory.pas +++ b/library/fhir2/fhir2_factory.pas @@ -37,7 +37,7 @@ interface uses SysUtils, Classes, System.NetEncoding, - fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, fsl_i18n, fsl_ucum, fsl_web_stream, fhir_objects, fhir_parser, fhir_validator, fhir_narrative, fhir_factory, fhir_pathengine, fhir_xhtml, fhir_common, fhir_elementmodel, fhir_client, fhir_client_threaded, fhir_uris; @@ -70,8 +70,8 @@ TFHIRFactoryR2 = class (TFHIRFactory) function makeClientInt(worker : TFHIRWorkerContextV; langList : THTTPLanguageList; comm : TFHIRClientCommunicator) : TFhirClientV; overload; override; function makeHealthcareCard : THealthcareCard; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; - function makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; override; function getXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; function resetXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; @@ -84,6 +84,7 @@ TFHIRFactoryR2 = class (TFHIRFactory) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); override; function buildOperationOutcome(langList : THTTPLanguageList; e : Exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; + function buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; override; function makeByName(const name : String) : TFHIRObject; override; function makeBoolean(b : boolean): TFHIRObject; override; @@ -161,6 +162,34 @@ function TFHIRFactoryR2.buildOperationOutcome(langList : THTTPLanguageList; mess result := fhir2_utilities.BuildOperationOutcome(langList, message, ExceptionTypeTranslations[issueCode]); end; +function TFHIRFactoryR2.buildOperationOutcome(i18n: TI18nSupport; langList: THTTPLanguageList; exception: EFHIROperationException): TFhirResourceV; +var + op : TFHIROperationOutcome; + iss : TFHIROperationOutcomeIssue; +begin + op := TFHIROperationOutcome.create; + try + iss := TFHIROperationOutcomeIssue.create; + try + iss.severity := ISSUE_SEVERITY_MAP2[exception.level]; + iss.code := ExceptionTypeTranslations[exception.Cause]; + iss.locationList.Add(exception.Path); + iss.details := TFHIRCodeableConcept.create; + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[exception.Code], ''); + if (exception.MsgId <> '') then + iss.details.text := i18n.translate(exception.msgId, langlist, exception.Params) + else + iss.details.text := exception.message; + op.issueList.add(iss.link); + finally + iss.free; + end; + result := op.link; + finally + op.free; + end; +end; + function TFHIRFactoryR2.buildOperationOutcome(langList : THTTPLanguageList; e: Exception; issueCode: TFhirIssueType): TFhirResourceV; begin result := fhir2_utilities.BuildOperationOutcome(langList, e, ExceptionTypeTranslations[issueCode]); @@ -303,7 +332,7 @@ function TFHIRFactoryR2.makeCoding(system, version, code, display: String): TFHI if version <> '' then TFHIRCoding(result).version := version; if display <> '' then - TFHIRCoding(result).version := display; + TFHIRCoding(result).display := display; end; function TFHIRFactoryR2.makeCodeableConcept(coding: TFHIRCodingW): TFHIRObject; @@ -371,14 +400,14 @@ function TFHIRFactoryR2.makeInteger(s: string): TFHIRObject; result := TFhirInteger.Create(s); end; -function TFHIRFactoryR2.makeProxy(pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryR2.makeProxy(packageId : String; pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.create(self.link, lock, worker, pi); + result := TFHIRResourceProxy.create(packageId, self.link, lock, worker, pi); end; -function TFHIRFactoryR2.makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; +function TFHIRFactoryR2.makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.create(self.link, resource as TFHIRResource); + result := TFHIRResourceProxy.create(packageId, self.link, resource as TFHIRResource); end; function TFHIRFactoryR2.makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String): TFhirOperationOutcomeIssueW; diff --git a/library/fhir2/fhir2_narrative.pas b/library/fhir2/fhir2_narrative.pas index 8e067959f..457d44c63 100644 --- a/library/fhir2/fhir2_narrative.pas +++ b/library/fhir2/fhir2_narrative.pas @@ -1535,9 +1535,9 @@ procedure TFHIRNarrativeGenerator.renderCodeableConcept(cc: TFHIRCodeableConcept procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRXhtmlNode; showCodeDetails: boolean); var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (o.author <> nil) then begin @@ -1554,7 +1554,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Made: ').append(o.time.ToString); + s.append('Made: '); + s.append(o.time.ToString); end; if (o.Text <> '') then @@ -1562,7 +1563,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Annontation: ').append(o.Text); + s.append('Annontation: '); + s.append(o.Text); end; x.addText(s.toString()); @@ -1780,9 +1782,9 @@ function TFHIRNarrativeGenerator.displaySampledData(sd: TFHIRSampledData): Strin function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append('(system := "'); @@ -1790,7 +1792,8 @@ function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; s.append('" code '); s.append(q.code); s.append(' := "'); - s.append(lookupCode(q.system, '', q.code)).append('")'); + s.append(lookupCode(q.system, '', q.code)); + s.append('")'); result := s.toString(); finally @@ -1924,10 +1927,10 @@ function TFHIRNarrativeGenerator.displayTimeUnits(units: TFHIRUnitsOfTimeEnum): function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (name.Text <> '') then s.append(name.Text) @@ -1954,10 +1957,10 @@ function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (address.Text <> '') then s.append(address.Text) @@ -2001,9 +2004,9 @@ function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; function TFHIRNarrativeGenerator.displayContactPoint(contact: TFHIRContactPoint): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append(describeSystem(contact.system)); if (contact.value = '') then @@ -2866,7 +2869,7 @@ function TFHIRNarrativeGenerator.getChildrenForPath(elements: TFHIRElementDefini private String makeAnchor(String codeSystem, String code) begin String s := codeSystem+"-"+code; - StringBuilder b := TStringBuilder.Create(); + StringBuilder b := TFslStringBuilder.Create(); for (char c : s.toCharArray()) begin if (Character.isAlphabetic(c)) or (Character.isDigit(c)) or (c = ".") then b.append(c); diff --git a/library/fhir2/fhir2_narrative2.pas b/library/fhir2/fhir2_narrative2.pas index 0cb9fe110..240f7df76 100644 --- a/library/fhir2/fhir2_narrative2.pas +++ b/library/fhir2/fhir2_narrative2.pas @@ -110,7 +110,7 @@ implementation function TNarrativeGenerator.capitalize(s : String):String; begin - if( s = '') then + if (s = '') then result := '' else result := UpperCase(s.substring(0, 1)) + s.substring(1); @@ -1003,10 +1003,10 @@ function TNarrativeGenerator.displaySchedule(v : TFHIRTiming) : String; function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) @@ -1034,10 +1034,10 @@ function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; function TNarrativeGenerator.displayAddress(v : TFHIRAddress) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) diff --git a/library/fhir2/fhir2_operations.pas b/library/fhir2/fhir2_operations.pas index 41df13b47..a9eb744fa 100644 --- a/library/fhir2/fhir2_operations.pas +++ b/library/fhir2/fhir2_operations.pas @@ -138,6 +138,8 @@ TFHIRLookupOpRespDesignation = class (TFHIROperationObject) TFHIRLookupOpResponse = class (TFHIROperationResponse) private FName : String; + FCode : String; + FSystem : String; FVersion : String; FDisplay : String; FAbstract : Boolean; @@ -152,6 +154,8 @@ TFHIRLookupOpResponse = class (TFHIROperationResponse) procedure load(params : THTTPParameters); overload; override; function asParams : TFHIRParameters; override; property name : String read FName write FName; + property code : String read FCode write FCode; + property systemUri : String read FSystem write FSystem; property version : String read FVersion write FVersion; property display : String read FDisplay write FDisplay; property abstract : Boolean read FAbstract write FAbstract; @@ -1011,11 +1015,13 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters; try if (FName <> '') then result.addParameter('name', TFHIRString.Create(FName));{oz.5f} + if (FCode <> '') then + result.addParameter('code', TFHIRCode.Create(FCode)); if (FVersion <> '') then result.addParameter('version', TFHIRString.Create(FVersion));{oz.5f} if (FDisplay <> '') then result.addParameter('display', TFHIRString.Create(FDisplay));{oz.5f} - result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} + result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} for v1 in FDesignationList do result.AddParameter(v1.asParams('designation')); writeExtensions(result); diff --git a/library/fhir2/fhir2_pathengine.pas b/library/fhir2/fhir2_pathengine.pas index 7a5cb0c02..d38c1e74e 100644 --- a/library/fhir2/fhir2_pathengine.pas +++ b/library/fhir2/fhir2_pathengine.pas @@ -89,7 +89,7 @@ TFHIRPathEngine = class; TFHIRPathEngine = class (TFHIRPathEngineV) private worker : TFHIRWorkerContext; - FLog : TStringBuilder; + FLog : TFslStringBuilder; primitiveTypes, allTypes : TStringList; Fucum : TUcumServiceInterface; @@ -334,7 +334,7 @@ constructor TFHIRPathEngine.create(context: TFHIRWorkerContext; ucum : TUcumServ inherited Create; worker := context; FUcum := ucum; - FLog := TStringBuilder.Create; + FLog := TFslStringBuilder.Create; allTypes := TStringList.Create; primitiveTypes := TStringList.Create; if (worker <> nil) then @@ -410,11 +410,11 @@ destructor TFHIRPathEngine.Destroy; function TFHIRPathEngine.convertToString(items: TFHIRSelectionList): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; item : TFHIRSelection; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for item in items do diff --git a/library/fhir2/fhir2_pathnode.pas b/library/fhir2/fhir2_pathnode.pas index bbb50ae95..f4188be82 100644 --- a/library/fhir2/fhir2_pathnode.pas +++ b/library/fhir2/fhir2_pathnode.pas @@ -123,7 +123,7 @@ TFHIRPathExpressionNode = class (TFHIRPathExpressionNodeV) procedure SetFunctionId(const Value: TFHIRPathFunction); procedure SetTypes(const Value: TFHIRTypeDetails); procedure SetOpTypes(const Value: TFHIRTypeDetails); - procedure write(b : TStringBuilder); + procedure write(b : TFslStringBuilder); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -200,9 +200,9 @@ implementation function TFHIRPathExpressionNode.Canonical: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try write(b); result := b.ToString; @@ -402,11 +402,11 @@ function TFHIRPathExpressionNode.summary: String; function TFHIRPathExpressionNode.toString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; n : TFHIRPathExpressionNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try case kind of enkName: @@ -485,7 +485,7 @@ procedure TFHIRPathExpressionNode.visitAll(context : pointer; proc: TFHIRPathExp end; {$ENDIF} -procedure TFHIRPathExpressionNode.write(b: TStringBuilder); +procedure TFHIRPathExpressionNode.write(b: TFslStringBuilder); var f : boolean; n : TFHIRPathExpressionNode; diff --git a/library/fhir2/fhir2_profiles.pas b/library/fhir2/fhir2_profiles.pas index 9aa0397b5..fd0d23e3f 100644 --- a/library/fhir2/fhir2_profiles.pas +++ b/library/fhir2/fhir2_profiles.pas @@ -124,7 +124,7 @@ TBaseWorkerContextR2 = class abstract (TFHIRWorkerContext) FNamingSystems : TFslMap; procedure SetProfiles(const Value: TProfileManager); - procedure Load(feed: TFHIRBundle); + procedure Load(packageId : String; feed: TFHIRBundle); public constructor Create(factory : TFHIRFactory; pcm : TFHIRPackageManager); Override; destructor Destroy; Override; @@ -133,9 +133,11 @@ TBaseWorkerContextR2 = class abstract (TFHIRWorkerContext) property Profiles : TProfileManager read FProfiles; procedure seeResourceProxy(r : TFhirResourceProxy); overload; virtual; - procedure seeResource(res : TFHIRResourceV); overload; override; + procedure seeResource(packageId : string; res : TFHIRResourceV); overload; override; procedure seeResource(res : TFHIRResourceProxyV); overload; override; procedure dropResource(rtype, id : string); override; + procedure LoadCodeSystem(r : TFhirResourceProxyV); overload; override; + procedure LoadCodeSystem(r : TFhirResourceProxy); overload; virtual; procedure LoadFromDefinitions(filename : string); procedure LoadFromFolder(folder : string); procedure LoadFromFile(filename : string); overload; @@ -620,11 +622,11 @@ procedure TProfileUtilities.markDerived(outcome : TFhirElementDefinition); function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicing) : String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; d : TFhirString; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for d in slice.discriminatorList do @@ -633,7 +635,7 @@ function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicin first := false else b.append(', '); - b.append(d); + b.append(d.ToString); end; b.append('('); if (slice.orderedElement <> nil) then @@ -872,11 +874,11 @@ function TProfileUtilities.getProfileForDataType(type_ : TFhirElementDefinitionT function TProfileUtilities.typeCode(types : TFhirElementDefinitionTypeList) : String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; type_ : TFHIRElementDefinitionType; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for type_ in types do @@ -1509,7 +1511,7 @@ function TBaseWorkerContextR2.allResourceNames: TArray; i : integer; s : string; begin - FLock.Lock; + FLock.Lock('allResourceNames'); try SetLength(result, length(ALL_RESOURCE_TYPE_NAMES) - 1 + FCustomResources.Count); for a := low(TFHIRResourceType) to high(TFHIRResourceType) do @@ -1559,6 +1561,16 @@ procedure TBaseWorkerContextR2.dropResource(rtype, id: string); Profiles.DropProfile(frtStructureDefinition, id); end; +procedure TBaseWorkerContextR2.LoadCodeSystem(r: TFhirResourceProxyV); +begin + loadCodeSystem(r as TFHIRResourceProxy); +end; + +procedure TBaseWorkerContextR2.LoadCodeSystem(r: TFhirResourceProxy); +begin + // nothing +end; + function TBaseWorkerContextR2.fetchResource(t: TFhirResourceType; url, version: String): TFhirResource; var r : TFHIRResourceProxy; @@ -1604,7 +1616,7 @@ function TBaseWorkerContextR2.getChildMap(profile: TFHIRStructureDefinition; ele function TBaseWorkerContextR2.getCustomResource(name: String): TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('getCustomResource'); try result := FCustomResources[name].Link; finally @@ -1671,7 +1683,7 @@ function TBaseWorkerContextR2.getStructure(ns, name: String): TFHIRStructureDefi function TBaseWorkerContextR2.hasCustomResource(name: String): boolean; begin - FLock.Lock; + FLock.Lock('hasCustomResource'); try result := FCustomResources.ContainsKey(name); finally @@ -1683,7 +1695,7 @@ function TBaseWorkerContextR2.hasCustomResourceDefinition(sd: TFHIRStructureDefi var cr : TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('hasCustomResourceDefinition'); try result := false; for cr in FCustomResources.Values do @@ -1750,9 +1762,9 @@ procedure TBaseWorkerContextR2.LoadFromDefinitions(filename: string); xml.source := vcl; xml.Parse; if xml.resource is TFhirBundle then - Load(xml.resource as TFhirBundle) + Load(filename, xml.resource as TFhirBundle) else - SeeResource(xml.resource as TFHIRResource); + SeeResource(filename, xml.resource as TFHIRResource); finally xml.free; end; @@ -1788,10 +1800,10 @@ procedure TBaseWorkerContextR2.LoadFromFile(filename: string; parser : TFHIRPars if parser.resource is TFhirBundle then begin for be in TFhirBundle(parser.resource).entryList do - SeeResource(be.resource) + SeeResource(filename, be.resource) end else - SeeResource(parser.resource as TFHIRResource); + SeeResource(filename, parser.resource as TFHIRResource); finally fn.free; end; @@ -1835,7 +1847,7 @@ function TBaseWorkerContextR2.nonSecureResourceNames: TArray; procedure TBaseWorkerContextR2.registerCustomResource(cr: TFHIRCustomResourceInformation); begin - FLock.Lock; + FLock.Lock('registerCustomResource'); try FCustomResources.Add(cr.name, cr.Link); finally @@ -1848,11 +1860,11 @@ procedure TBaseWorkerContextR2.seeResource(res : TFHIRResourceProxyV); seeResourceProxy(res as TFHIRResourceProxy) end; -procedure TBaseWorkerContextR2.seeResource(res: TFHIRResourceV); +procedure TBaseWorkerContextR2.seeResource(packageId : String; res: TFHIRResourceV); var proxy : TFHIRResourceProxy; begin - proxy := TFHIRResourceProxy.Create(factory.link, res.link as TFHIRResource); + proxy := TFHIRResourceProxy.Create(packageId, factory.link, res.link as TFHIRResource); try SeeResourceProxy(proxy); finally @@ -1860,7 +1872,7 @@ procedure TBaseWorkerContextR2.seeResource(res: TFHIRResourceV); end; end; -procedure TBaseWorkerContextR2.Load(feed: TFHIRBundle); +procedure TBaseWorkerContextR2.Load(packageId : String; feed: TFHIRBundle); var i : integer; r : TFhirResource; @@ -1868,7 +1880,7 @@ procedure TBaseWorkerContextR2.Load(feed: TFHIRBundle); for i := 0 to feed.entryList.count - 1 do begin r := feed.entryList[i].resource; - SeeResource(r); + SeeResource(packageId, r); end; end; @@ -1889,7 +1901,7 @@ procedure TBaseWorkerContextR2.setNonSecureTypes(names: array of String); var i : integer; begin - FLock.Lock; + FLock.Lock('setNonSecureTypes'); try SetLength(FNonSecureNames, length(names)); for i := 0 to length(names)-1 do @@ -2045,7 +2057,7 @@ function TProfileManager.getProfileStructure(source: TFHirStructureDefinition; u else begin StringSplit(url, '#', id, code); - lock.Lock; + lock.Lock('getProfileStructure'); try profile := FProfilesByURL[id].Link; finally @@ -2070,7 +2082,7 @@ function TProfileManager.Link: TProfileManager; procedure TProfileManager.Unload; begin - lock.Lock; + lock.Lock('Unload'); try FProfilesById.Clear; FProfilesByURL.Clear; diff --git a/library/fhir2/fhir2_types.pas b/library/fhir2/fhir2_types.pas index ff7bebc25..6a185edbe 100644 --- a/library/fhir2/fhir2_types.pas +++ b/library/fhir2/fhir2_types.pas @@ -8125,7 +8125,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FExtensionList.Count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String; diff --git a/library/fhir2/fhir2_utilities.pas b/library/fhir2/fhir2_utilities.pas index 246d87ec3..1843f5136 100644 --- a/library/fhir2/fhir2_utilities.pas +++ b/library/fhir2/fhir2_utilities.pas @@ -1897,10 +1897,10 @@ function getConformanceResourceUrl(res : TFHIRResource) : string; function TFHIROperationOutcomeHelper.asExceptionMessage: String; var - b : TStringBuilder; + b : TFslStringBuilder; issue : TFhirOperationOutcomeIssue; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for issue in issueList do begin @@ -2679,7 +2679,7 @@ function TFHIRBundleHelper.findResource(ref: TFHIRReference): TFhirResource; function TFHIRBundleHelper.generatePresentation: String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure addNarrative(br : boolean; n : TFhirNarrative); begin if br then @@ -2704,7 +2704,7 @@ function TFHIRBundleHelper.generatePresentation: String; if type_ = BundleTypeDocument then begin cmp := entryList[0].resource as TFhirComposition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try // header b.append( @@ -3694,12 +3694,12 @@ function TFHIRStringListHelper.hasValue(value: String): boolean; function TFHIRStringListHelper.summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; v : TFHIRString; begin f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for v in self do begin diff --git a/library/fhir2/fhir2_validator.pas b/library/fhir2/fhir2_validator.pas index 1c9c908a4..9f4397d14 100644 --- a/library/fhir2/fhir2_validator.pas +++ b/library/fhir2/fhir2_validator.pas @@ -402,10 +402,10 @@ function TNodeStack.push(element: TFHIRMMElement; count: integer; definition: TF function TNodeStack.addToLiteralPath(path: Array of String): String; var - b: TStringBuilder; + b: TFslStringBuilder; p: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(literalPath); for p in path do diff --git a/library/fhir2/tests/fhir2_tests_pathengine.pas b/library/fhir2/tests/fhir2_tests_pathengine.pas index 2bbaae0b2..a60155e43 100644 --- a/library/fhir2/tests/fhir2_tests_pathengine.pas +++ b/library/fhir2/tests/fhir2_tests_pathengine.pas @@ -177,7 +177,7 @@ procedure TFluentPathTest.FluentPathTest(Name: String); begin p := TFHIRXmlParser.Create(TTestingWorkerContext.Use, nil); try - f := TFileStream.Create(IncludeTrailingBackslash('C:\\work\\org.hl7.fhir\\build\\publish')+input, fmOpenRead); + f := TFileStream.Create(IncludeTrailingBackslash('C:\\work\\org.hl7.fhir\\build\\publish')+input, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir3/fhir3_common.pas b/library/fhir3/fhir3_common.pas index 32ff37765..10988cec2 100644 --- a/library/fhir3/fhir3_common.pas +++ b/library/fhir3/fhir3_common.pas @@ -179,6 +179,7 @@ TFhirOperationOutcome3 = class (TFhirOperationOutcomeW) function code : TFhirIssueType; override; procedure addIssue(issue : TFhirOperationOutcomeIssueW; free : boolean); override; procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; code : TOpIssueCode; addIfDuplicate : boolean = false); overload; override; function hasIssues : boolean; override; function issues : TFslList; override; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; override; @@ -531,8 +532,8 @@ TFhirValueSetExpansionContains3 = class (TFhirValueSetExpansionContainsW) function contains : TFslList; override; procedure addDesignation(lang, use, value : String); override; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); override; - procedure addProperty(code : String; value : TFHIRObject); override; overload; - procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); override; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; override; + procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); overload; override; procedure addContains(contained : TFhirValueSetExpansionContainsW); override; procedure clearContains(); override; function properties : TFslList; override; @@ -665,6 +666,8 @@ TFHIRValueSet3 = class (TFHIRValueSetW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function source : String; override; function findContains(systemUri, version, code : String) : TFhirValueSetExpansionContainsW; override; function getExperimental : boolean; override; @@ -706,6 +709,7 @@ TFhirCodeSystemConcept3 = class (TFhirCodeSystemConceptW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function designationCount : integer; override; function designations : TFslList; override; @@ -731,6 +735,8 @@ TFhirCodeSystemProperty3 = class (TFhirCodeSystemPropertyW) TFhirCodeSystem3 = class (TFhirCodeSystemW) private function cs : TFhirCodeSystem; + function hasLanguage(cc: TFhirCodeSystemConcept; langs: THTTPLanguageList + ): boolean; public function wrapExtension(extension : TFHIRObject) : TFHIRExtensionW; override; function GetLanguage: String; override; @@ -746,7 +752,8 @@ TFhirCodeSystem3 = class (TFhirCodeSystemW) procedure setName(Value: String); override; procedure setStatus(Value: TPublicationStatus); override; procedure setUrl(Value: String); override; - procedure setVersion(Value: String); override; + procedure setVersion(Value: String); override; + function GetCaseSensitive: boolean; override; function getContent: TFhirCodeSystemContentMode; override; procedure setContent(Value: TFhirCodeSystemContentMode); override; function getCount: integer; override; @@ -756,6 +763,8 @@ TFhirCodeSystem3 = class (TFhirCodeSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getExperimental : boolean; override; procedure setExperimental(value : boolean); override; @@ -767,6 +776,7 @@ TFhirCodeSystem3 = class (TFhirCodeSystemW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function isInactive(c : TFhirCodeSystemConceptW) : boolean; override; @@ -777,6 +787,7 @@ TFhirCodeSystem3 = class (TFhirCodeSystemW) function getChildren(c : TFhirCodeSystemConceptW) : TFhirCodeSystemConceptListW; override; function getCode(code : String) : TFhirCodeSystemConceptW; override; function buildImplicitValueSet : TFHIRValueSetW; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; end; TFHIRLookupOpRequest3 = class (TFHIRLookupOpRequestW) @@ -815,6 +826,8 @@ TFHIRLookupOpRespDesignation3 = class (TFHIRLookupOpRespDesignationW) procedure setUse(Value: TFHIRObject); override; end; + { TFHIRLookupOpResponse3 } + TFHIRLookupOpResponse3 = class (TFHIRLookupOpResponseW) public procedure load(params : TFHIRResourceV); overload; override; @@ -829,8 +842,14 @@ TFHIRLookupOpResponse3 = class (TFHIRLookupOpResponseW) procedure addExtension(name : String; value : boolean); overload; override; function getName: String; override; procedure setName(Value: String); override; + function getCode: String; override; + procedure setCode(Value: String); override; + function getSystem: String; override; + procedure setSystem(Value: String); override; function getDisplay: String; override; - procedure setDisplay(Value: String); override; + procedure setDisplay(Value: String); override; + function getIsAbstract: boolean; override; + procedure setIsAbstract(Value: boolean); override; end; { TFhirConceptMapGroupElementDependsOn3 } @@ -906,6 +925,8 @@ TFhirConceptMap3 = class (TFhirConceptMapW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function sourceDesc : String; override; function targetDesc : String; override; function getExperimental : boolean; override; @@ -1226,6 +1247,8 @@ TFHIRNamingSystem3 = class (TFHIRNamingSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; function getExperimental : boolean; override; @@ -1266,6 +1289,8 @@ TFhirTerminologyCapabilities3 = class (TFhirTerminologyCapabilitiesW) procedure setContext(Value: String); override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; public @@ -1308,6 +1333,8 @@ TFHIRTestScript3 = class (TFHIRTestScriptW) function getDate: TFslDateTime; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; procedure setDate(Value: TFslDateTime); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; @@ -1416,6 +1443,31 @@ procedure TFhirOperationOutcome3.addIssue(level: TIssueSeverity; cause: TFHIRIss iss.expressionList.Add(path); end; +procedure TFhirOperationOutcome3.addIssue(level: TIssueSeverity; + cause: TFhirIssueType; path, msgId, message: String; code: TOpIssueCode; + addIfDuplicate: boolean); +var + iss : TFhirOperationOutcomeIssue; +begin + if not addIfDuplicate then + begin + for iss in (Fres as TFhirOperationOutcome).issueList do + if (iss.details <> nil) and (iss.details.text = message) then + exit(); + end; + + iss := (Fres as TFhirOperationOutcome).issueList.Append; + iss.code:= ExceptionTypeTranslations[cause]; + iss.severity := ISSUE_SEVERITY_MAP2[level]; + iss.details := TFHIRCodeableConcept.Create; + if (code <> oicVoid) then + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[code], ''); + iss.details.text := message; + iss.locationList.Add(path); + iss.expressionList.Add(path); + iss.addExtension('http://hl7.org/fhir/StructureDefinition/operationoutcome-message-id', msgid); +end; + function TFhirOperationOutcome3.code: TFhirIssueType; var a : TFhirIssueType; @@ -3382,6 +3434,16 @@ procedure TFHIRValueSet3.setPublisher(Value: String); vs.publisher := value; end; +function TFHIRValueSet3.getTitle: String; +begin + result := vs.title; +end; + +procedure TFHIRValueSet3.setTitle(value: String); +begin + vs.title := value; +end; + procedure TFHIRValueSet3.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[value]; @@ -3706,17 +3768,17 @@ function TFHIRLookupOpResponse3.asParams: TFHIRResourceV; result := (op as TFHIROperationResponse).asParams; end; -function TFHIRLookupOpResponse3.GetDisplay: String; +function TFHIRLookupOpResponse3.getDisplay: String; begin result := (op as TFHIRLookupOpResponse).display; end; -function TFHIRLookupOpResponse3.GetName: String; +function TFHIRLookupOpResponse3.getName: String; begin result := (op as TFHIRLookupOpResponse).name; end; -function TFHIRLookupOpResponse3.GetVersion: String; +function TFHIRLookupOpResponse3.getVersion: String; begin result := (op as TFHIRLookupOpResponse).version; end; @@ -3731,17 +3793,47 @@ procedure TFHIRLookupOpResponse3.load(params: TFHIRResourceV); (op as TFHIRLookupOpResponse).load(params as TFHIRParameters); end; -procedure TFHIRLookupOpResponse3.SetDisplay(Value: String); +procedure TFHIRLookupOpResponse3.setDisplay(Value: String); begin (op as TFHIRLookupOpResponse).display := value; end; -procedure TFHIRLookupOpResponse3.SetName(Value: String); +function TFHIRLookupOpResponse3.getIsAbstract: boolean; +begin + result := (op as TFHIRLookupOpResponse).abstract; +end; + +procedure TFHIRLookupOpResponse3.setIsAbstract(Value: boolean); +begin + (op as TFHIRLookupOpResponse).abstract := value; +end; + +procedure TFHIRLookupOpResponse3.setName(Value: String); begin (op as TFHIRLookupOpResponse).name := value; end; -procedure TFHIRLookupOpResponse3.SetVersion(Value: String); +function TFHIRLookupOpResponse3.getCode: String; +begin + result := (op as TFHIRLookupOpResponse).code; +end; + +procedure TFHIRLookupOpResponse3.setCode(Value: String); +begin + (op as TFHIRLookupOpResponse).code := value; +end; + +function TFHIRLookupOpResponse3.getSystem: String; +begin + result := (op as TFHIRLookupOpResponse).systemUri; +end; + +procedure TFHIRLookupOpResponse3.setSystem(Value: String); +begin + (op as TFHIRLookupOpResponse).systemUri := value; +end; + +procedure TFHIRLookupOpResponse3.setVersion(Value: String); begin (op as TFHIRLookupOpResponse).version := value; end; @@ -4068,6 +4160,11 @@ function TFhirCodeSystemConcept3.conceptCount: integer; result := c.conceptList.Count; end; +function TFhirCodeSystemConcept3.hasConcepts: boolean; +begin + result := c.hasConceptList; +end; + function TFhirCodeSystemConcept3.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -4182,6 +4279,46 @@ function TFhirCodeSystem3.buildImplicitValueSet: TFHIRValueSetW; result := TFHIRValueSet3.Create(cs.buildImplicitValueSet); end; +function TFhirCodeSystem3.hasLanguage(cc : TFhirCodeSystemConcept; langs: THTTPLanguageList): boolean; +var + cc1 : TFhirCodeSystemConcept; + d : TFhirCodeSystemConceptDesignation; + hl : boolean; +begin + if langs.matches(cs.Language, false) and (cc.display <> '') then + exit(true); + + result := false; + + for d in cc.designationList do + if langs.matches(d.language, false) then + exit(true); + + for cc1 in cc.conceptList do + begin + hl := hasLanguage(cc1, langs); + if (hl) then + exit(true); + end; +end; + +function TFhirCodeSystem3.hasAnyDisplays(langs: THTTPLanguageList): boolean; +var + cc : TFhirCodeSystemConcept; + hl : boolean; +begin + result := false; + if (langs.count > 0) then + begin + for cc in cs.conceptList do + begin + hl := hasLanguage(cc, langs); + if (hl) then + exit(true); + end; + end; +end; + function TFhirCodeSystem3.concept(ndx: integer): TFhirCodeSystemConceptW; begin result := TFhirCodeSystemConcept3.Create(cs.conceptList[ndx].Link); @@ -4192,6 +4329,11 @@ function TFhirCodeSystem3.conceptCount: integer; result := cs.conceptList.Count; end; +function TFhirCodeSystem3.hasConcepts: boolean; +begin + result := cs.hasConceptList; +end; + function TFhirCodeSystem3.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -4379,6 +4521,16 @@ procedure TFhirCodeSystem3.setPublisher(Value: String); cs.publisher := value; end; +function TFhirCodeSystem3.getTitle: String; +begin + result := cs.title; +end; + +procedure TFhirCodeSystem3.setTitle(value: String); +begin + cs.title := value; +end; + function TFhirCodeSystem3.getExperimental: boolean; begin result := cs.experimental; @@ -4404,6 +4556,11 @@ procedure TFhirCodeSystem3.setVersion(Value: String); cs.version := Value; end; +function TFhirCodeSystem3.GetCaseSensitive: boolean; +begin + result := cs.caseSensitive; +end; + function TFhirCodeSystem3.supplements: String; begin result := ''; @@ -4942,6 +5099,16 @@ procedure TFhirConceptMap3.setPublisher(Value: String); cm.publisher := value; end; +function TFhirConceptMap3.getTitle: String; +begin + result := cm.title; +end; + +procedure TFhirConceptMap3.setTitle(value: String); +begin + cm.title := value; +end; + function TFhirConceptMap3.getContext: String; begin result := cm.context; @@ -6474,6 +6641,16 @@ procedure TFHIRNamingSystem3.setPublisher(Value: String); nm.publisher := value; end; +function TFHIRNamingSystem3.getTitle: String; +begin + result := nm.title; +end; + +procedure TFHIRNamingSystem3.setTitle(value: String); +begin + nm.title := value; +end; + procedure TFHIRNamingSystem3.setStatus(Value: TPublicationStatus); begin nm.status := MAP_TPublicationStatus[value]; @@ -6770,6 +6947,16 @@ procedure TFhirTerminologyCapabilities3.setPublisher(Value: String); begin end; +function TFhirTerminologyCapabilities3.getTitle: String; +begin + result := ''; +end; + +procedure TFhirTerminologyCapabilities3.setTitle(value: String); +begin + // nothing +end; + procedure TFhirTerminologyCapabilities3.setStatus(Value: TPublicationStatus); begin end; @@ -6992,6 +7179,16 @@ procedure TFHIRTestScript3.setPublisher(Value: String); ts.publisher := value; end; +function TFHIRTestScript3.getTitle: String; +begin + result := ts.title; +end; + +procedure TFHIRTestScript3.setTitle(value: String); +begin + ts.title := value; +end; + procedure TFHIRTestScript3.setStatus(Value: TPublicationStatus); begin ts.Status := MAP_TPublicationStatus[Value]; diff --git a/library/fhir3/fhir3_context.pas b/library/fhir3/fhir3_context.pas index 7ef663d26..4685abc68 100644 --- a/library/fhir3/fhir3_context.pas +++ b/library/fhir3/fhir3_context.pas @@ -57,8 +57,8 @@ TFHIRResourceProxy = class (TFHIRResourceProxyV) procedure loadResource; override; function wrapResource : TFHIRXVersionResourceWrapper; override; public - constructor Create(factory : TFHIRFactory; resource : TFHIRResource); overload; - constructor Create(factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; resource : TFHIRResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; destructor Destroy; override; function link : TFHIRResourceProxy; overload; @@ -145,18 +145,18 @@ implementation { TFHIRResourceProxy } -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; resource: TFHIRResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; resource: TFHIRResource); begin if resource is TFHIRMetadataResource then - inherited Create(resource, TFHIRMetadataResource(resource).url, TFHIRMetadataResource(resource).version) + inherited Create(packageId, resource, TFHIRMetadataResource(resource).url, TFHIRMetadataResource(resource).version) else - inherited Create(resource, '', ''); + inherited Create(packageId, resource, '', ''); FFactory := factory; end; -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); begin - inherited Create(fhirVersionRelease3, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); + inherited Create(packageId, fhirVersionRelease3, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); FFactory := factory; FWorker := worker; FInfo := pi; @@ -191,7 +191,7 @@ procedure TFHIRResourceProxy.loadResource; if FInfo = nil then exit; // not lazy loading - FLock.lock; + FLock.lock('loadResource'); try if FResourceV <> nil then exit; @@ -202,7 +202,7 @@ procedure TFHIRResourceProxy.loadResource; p := FFactory.makeParser(FWorker, ffJson, nil); try - stream := TFileStream.Create(FInfo.filename, fmOpenRead); + stream := TFileStream.Create(FInfo.filename, fmOpenRead + fmShareDenyWrite); try try r := p.parseResource(stream); diff --git a/library/fhir3/fhir3_factory.pas b/library/fhir3/fhir3_factory.pas index d575ea44e..d429327a3 100644 --- a/library/fhir3/fhir3_factory.pas +++ b/library/fhir3/fhir3_factory.pas @@ -38,7 +38,7 @@ interface uses SysUtils, Classes, System.NetEncoding, - fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, fsl_i18n, fsl_ucum, fsl_web_stream, fhir_objects, fhir_parser, fhir_validator, fhir_narrative, fhir_factory, fhir_pathengine, fhir_xhtml, fhir_common, fhir_elementmodel, fhir_client, fhir_client_threaded, fhir_uris; @@ -71,8 +71,8 @@ TFHIRFactoryR3 = class (TFHIRFactory) function makeClientInt(worker : TFHIRWorkerContextV; langList : THTTPLanguageList; comm : TFHIRClientCommunicator) : TFhirClientV; overload; override; function makeHealthcareCard : THealthcareCard; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; - function makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; override; function getXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; function resetXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; @@ -85,6 +85,7 @@ TFHIRFactoryR3 = class (TFHIRFactory) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); override; function buildOperationOutcome(langList : THTTPLanguageList; e : Exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; + function buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; override; function makeByName(const name : String) : TFHIRObject; override; function makeBoolean(b : boolean): TFHIRObject; override; @@ -161,6 +162,34 @@ function TFHIRFactoryR3.buildOperationOutcome(langList : THTTPLanguageList; mess result := fhir3_utilities.BuildOperationOutcome(langList, message, ExceptionTypeTranslations[issueCode]); end; +function TFHIRFactoryR3.buildOperationOutcome(i18n: TI18nSupport; langList: THTTPLanguageList; exception: EFHIROperationException): TFhirResourceV; +var + op : TFHIROperationOutcome; + iss : TFHIROperationOutcomeIssue; +begin + op := TFHIROperationOutcome.create; + try + iss := TFHIROperationOutcomeIssue.create; + try + iss.severity := ISSUE_SEVERITY_MAP2[exception.level]; + iss.code := ExceptionTypeTranslations[exception.Cause]; + iss.expressionList.Add(exception.Path); + iss.details := TFHIRCodeableConcept.create; + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[exception.Code], ''); + if (exception.MsgId <> '') then + iss.details.text := i18n.translate(exception.msgId, langlist, exception.Params) + else + iss.details.text := exception.message; + op.issueList.add(iss.link); + finally + iss.free; + end; + result := op.link; + finally + op.free; + end; +end; + function TFHIRFactoryR3.buildOperationOutcome(langList : THTTPLanguageList; e: Exception; issueCode: TFhirIssueType): TFhirResourceV; begin result := fhir3_utilities.BuildOperationOutcome(langList, e, ExceptionTypeTranslations[issueCode]); @@ -303,7 +332,7 @@ function TFHIRFactoryR3.makeCoding(system, version, code, display: String): TFHI if version <> '' then TFHIRCoding(result).version := version; if display <> '' then - TFHIRCoding(result).version := display; + TFHIRCoding(result).display := display; end; function TFHIRFactoryR3.makeCodeableConcept(coding: TFHIRCodingW): TFHIRObject; @@ -371,14 +400,14 @@ function TFHIRFactoryR3.makeInteger(s: string): TFHIRObject; result := TFhirInteger.Create(s); end; -function TFHIRFactoryR3.makeProxy(pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryR3.makeProxy(packageId : String; pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, lock, worker, pi); + result := TFHIRResourceProxy.Create(packageId, self.link, lock, worker, pi); end; -function TFHIRFactoryR3.makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; +function TFHIRFactoryR3.makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, resource as TFHIRResource); + result := TFHIRResourceProxy.Create(packageId, self.link, resource as TFHIRResource); end; function TFHIRFactoryR3.makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String): TFhirOperationOutcomeIssueW; diff --git a/library/fhir3/fhir3_liquid.pas b/library/fhir3/fhir3_liquid.pas index 50f6e22b1..d8baa0916 100644 --- a/library/fhir3/fhir3_liquid.pas +++ b/library/fhir3/fhir3_liquid.pas @@ -63,7 +63,7 @@ TFHIRLiquidEngineContext = class (TFslObject) TFHIRLiquidNode = class abstract (TFslObject) protected procedure closeUp(); virtual; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; public function link : TFHIRLiquidNode; overload; end; @@ -71,10 +71,10 @@ TFHIRLiquidNode = class abstract (TFslObject) TFHIRLiquidConstant = class (TFHIRLiquidNode) private FConstant : String; - b : TStringBuilder; + b : TFslStringBuilder; protected procedure closeUp; override; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -88,7 +88,7 @@ TFHIRLiquidStatement = class (TFHIRLiquidNode) FStatement : String; FCompiled : TFHIRPathExpressionNode; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public destructor Destroy; override; @@ -104,7 +104,7 @@ TFHIRLiquidIf = class (TFHIRLiquidNode) FThenBody : TFSLList; FElseBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -123,7 +123,7 @@ TFHIRLiquidLoop = class (TFHIRLiquidNode) FCompiled : TFHIRPathExpressionNode; FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -140,7 +140,7 @@ TFHIRLiquidInclude = class (TFHIRLiquidNode) FPage : String; FParams : TFslMap; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -281,7 +281,7 @@ procedure TFHIRLiquidConstant.closeUp; constructor TFHIRLiquidConstant.Create; begin inherited; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; end; destructor TFHIRLiquidConstant.Destroy; @@ -290,7 +290,7 @@ destructor TFHIRLiquidConstant.Destroy; inherited; end; -procedure TFHIRLiquidConstant.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidConstant.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); begin b.append(FConstant); end; @@ -314,7 +314,7 @@ destructor TFHIRLiquidStatement.Destroy; inherited; end; -procedure TFHIRLiquidStatement.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidStatement.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); begin if (FCompiled = nil) then FCompiled := ctxt.FEngine.fpe.parse(FStatement); @@ -350,7 +350,7 @@ destructor TFHIRLiquidIf.Destroy; inherited; end; -procedure TFHIRLiquidIf.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidIf.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var ok : boolean; list : TFSLList; @@ -396,7 +396,7 @@ destructor TFHIRLiquidLoop.Destroy; inherited; end; -procedure TFHIRLiquidLoop.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidLoop.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var list : TFHIRSelectionList; n : TFHIRLiquidNode; @@ -635,12 +635,12 @@ function TFHIRLiquidParser.parseLoop(cnt: String): TFHIRLiquidNode; function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; var - b : TStringBuilder; + b : TFslStringBuilder; res : TFHIRLiquidStatement; begin grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '}') and (next2() = '}')) do b.append(grab()); @@ -662,11 +662,11 @@ function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; function TFHIRLiquidParser.parseTag(ch: char): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '%') and(next2() = '}')) do b.append(grab()); @@ -705,11 +705,11 @@ destructor TFHIRLiquidEngine.Destroy; function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(self, document, appContext.link); try @@ -782,7 +782,7 @@ destructor TFHIRLiquidInclude.Destroy; inherited; end; -procedure TFHIRLiquidInclude.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidInclude.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var src : String; doc : TFHIRLiquidDocument; diff --git a/library/fhir3/fhir3_maputils.pas b/library/fhir3/fhir3_maputils.pas index cea5f0d1a..23fa6fdf2 100644 --- a/library/fhir3/fhir3_maputils.pas +++ b/library/fhir3/fhir3_maputils.pas @@ -94,16 +94,16 @@ TFHIRStructureMapUtilities = class (TFslObject) fpe : TFHIRPathEngine; FLib : TFslMap; FServices : TTransformerServices; - procedure renderContained(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderUses(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderImports(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); - procedure renderDoco(b : TStringBuilder; doco : String); - procedure RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); - procedure RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource); - procedure renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget); - procedure renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); - procedure renderConceptMap(b : TStringBuilder; map : TFHIRConceptMap); + procedure renderContained(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); + procedure renderDoco(b : TFslStringBuilder; doco : String); + procedure RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); + procedure RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource); + procedure renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget); + procedure renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); + procedure renderConceptMap(b : TFslStringBuilder; map : TFHIRConceptMap); function getGroup(map : TFHIRConceptMap; source, target : String) : TFHIRConceptMapGroup; function fromEnum(s : String; codes : Array of String) : integer; @@ -175,10 +175,10 @@ destructor TFHIRStructureMapUtilities.Destroy; function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; var - b : TStringBuilder; + b : TFslStringBuilder; g : TFhirStructureMapGroup; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try b.append('map "'); b.append(map.Url); @@ -197,7 +197,7 @@ function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; end; end; -procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRStructureMapStructure; begin @@ -214,7 +214,7 @@ procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRS b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRUri; begin @@ -228,7 +228,7 @@ procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFH b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); +procedure TFHIRStructureMapUtilities.renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); var gi : TFHIRStructureMapGroupInput; r : TFHIRStructureMapGroupRule; @@ -263,7 +263,7 @@ procedure TFHIRStructureMapUtilities.renderGroup(b : TStringBuilder; g : TFHIRSt b.append(#13#10'endgroup'#13#10); end; -procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); +procedure TFHIRStructureMapUtilities.RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); var first, ifirst : boolean; rs : TFHIRStructureMapGroupRuleSource; @@ -339,7 +339,7 @@ procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStr end; end; -procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource); +procedure TFHIRStructureMapUtilities.RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource); begin b.append(rs.Context); if (rs.Element <> '') then @@ -372,7 +372,7 @@ procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget); +procedure TFHIRStructureMapUtilities.renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget); var first : boolean; rtp : TFHIRStructureMapGroupRuleTargetParameter; @@ -433,7 +433,7 @@ procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIR // end; end; -procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); +procedure TFHIRStructureMapUtilities.renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); begin if (rtp.Value is TFHIRBoolean) then b.append((rtp.Value as TFHIRBoolean).StringValue) @@ -455,9 +455,9 @@ procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rt function TFHIRStructureMapUtilities.render(map: TFHIRConceptMap): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try renderConceptMap(b, map); result := b.toString(); @@ -466,7 +466,7 @@ function TFHIRStructureMapUtilities.render(map: TFHIRConceptMap): String; end; end; -procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TFHIRConceptMap); +procedure TFHIRStructureMapUtilities.renderConceptMap(b: TFslStringBuilder; map: TFHIRConceptMap); const CHARS_EQUIVALENCE : array [TFhirConceptMapEquivalenceEnum] of string = ('??', ':', '==', '=', '<-', '<=', '>-', '>=', '~', '||', '--'); var @@ -594,7 +594,7 @@ procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TF end; end; -procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderContained(b: TFslStringBuilder; map: TFHIRStructureMap); var r : TFHIRResource; begin @@ -603,7 +603,7 @@ procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFH renderConceptMap(b, r as TFhirConceptMap); end; -procedure TFHIRStructureMapUtilities.renderDoco(b : TStringBuilder; doco : String); +procedure TFHIRStructureMapUtilities.renderDoco(b : TFslStringBuilder; doco : String); begin if (doco <> '') then begin diff --git a/library/fhir3/fhir3_narrative.pas b/library/fhir3/fhir3_narrative.pas index 3cbc588c4..a0bea894c 100644 --- a/library/fhir3/fhir3_narrative.pas +++ b/library/fhir3/fhir3_narrative.pas @@ -1537,9 +1537,9 @@ procedure TFHIRNarrativeGenerator.renderCodeableConcept(cc: TFHIRCodeableConcept procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRXhtmlNode; showCodeDetails: boolean); var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (o.author <> nil) then begin @@ -1556,7 +1556,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Made: ').append(o.time.ToString); + s.append('Made: '); + s.append(o.time.ToString); end; if (o.Text <> '') then @@ -1564,7 +1565,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Annontation: ').append(o.Text); + s.append('Annontation: '); + s.append(o.Text); end; x.addText(s.toString()); @@ -1782,9 +1784,9 @@ function TFHIRNarrativeGenerator.displaySampledData(sd: TFHIRSampledData): Strin function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append('(system := "'); @@ -1792,7 +1794,8 @@ function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; s.append('" code '); s.append(q.code); s.append(' := "'); - s.append(lookupCode(q.system, '', q.code)).append('")'); + s.append(lookupCode(q.system, '', q.code)); + s.append('")'); result := s.toString(); finally @@ -1929,10 +1932,10 @@ function TFHIRNarrativeGenerator.displayTimeUnits(units: TFHIRUnitsOfTimeEnum): function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (name.Text <> '') then s.append(name.Text) @@ -1959,10 +1962,10 @@ function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (address.Text <> '') then s.append(address.Text) @@ -2006,9 +2009,9 @@ function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; function TFHIRNarrativeGenerator.displayContactPoint(contact: TFHIRContactPoint): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append(describeSystem(contact.system)); if (contact.value = '') then @@ -2871,7 +2874,7 @@ function TFHIRNarrativeGenerator.getChildrenForPath(elements: TFHIRElementDefini private String makeAnchor(String codeSystem, String code) begin String s := codeSystem+"-"+code; - StringBuilder b := TStringBuilder.Create(); + StringBuilder b := TFslStringBuilder.Create(); for (char c : s.toCharArray()) begin if (Character.isAlphabetic(c)) or (Character.isDigit(c)) or (c = ".") then b.append(c); diff --git a/library/fhir3/fhir3_narrative2.pas b/library/fhir3/fhir3_narrative2.pas index 2b96574e3..ad15c6416 100644 --- a/library/fhir3/fhir3_narrative2.pas +++ b/library/fhir3/fhir3_narrative2.pas @@ -1003,10 +1003,10 @@ function TNarrativeGenerator.displaySchedule(v : TFHIRTiming) : String; function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) @@ -1034,10 +1034,10 @@ function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; function TNarrativeGenerator.displayAddress(v : TFHIRAddress) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) diff --git a/library/fhir3/fhir3_operations.pas b/library/fhir3/fhir3_operations.pas index d9b96e7e2..d240f18f1 100644 --- a/library/fhir3/fhir3_operations.pas +++ b/library/fhir3/fhir3_operations.pas @@ -458,8 +458,11 @@ TFHIRLookupOpRespProperty_ = class (TFHIROperationObject) TFHIRLookupOpResponse = class (TFHIROperationResponse) private FName : String; + FCode : String; + FSystem : String; FVersion : String; - FDisplay : String; + FDisplay : String; + FAbstract : Boolean; FDesignationList : TFslList; FProperty_List : TFslList; protected @@ -472,8 +475,11 @@ TFHIRLookupOpResponse = class (TFHIROperationResponse) procedure load(params : THTTPParameters); overload; override; function asParams : TFHIRParameters; override; property name : String read FName write FName; + property code : String read FCode write FCode; + property systemUri : String read FSystem write FSystem; property version : String read FVersion write FVersion; - property display : String read FDisplay write FDisplay; + property display : String read FDisplay write FDisplay; + property abstract : Boolean read FAbstract write FAbstract; property designationList : TFslList read FDesignationList; property property_List : TFslList read FProperty_List; end; @@ -2834,6 +2840,7 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); var p : TFhirParametersParameter; begin + FAbstract := params.bool['abstract']; FName := params.str['name']; FVersion := params.str['version']; FDisplay := params.str['display']; @@ -2850,7 +2857,8 @@ procedure TFHIRLookupOpResponse.load(params : THTTPParameters); begin FName := params['name']; FVersion := params['version']; - FDisplay := params['display']; + FDisplay := params['display']; + FAbstract := StrToBoolDef(params['abstract'], false); loadExtensions(params); end; @@ -2870,11 +2878,16 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters; try if (FName <> '') then result.addParameter('name', TFHIRString.Create(FName));{oz.5f} + if (FCode <> '') then + result.addParameter('code', TFHIRCode.Create(FCode)); + if (FSystem <> '') then + result.addParameter('system', TFHIRUri.Create(FSystem)); if (FVersion <> '') then result.addParameter('version', TFHIRString.Create(FVersion));{oz.5f} if (FDisplay <> '') then result.addParameter('display', TFHIRString.Create(FDisplay));{oz.5f} - for v1 in FDesignationList do + result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} + for v1 in FDesignationList do result.AddParameter(v1.asParams('designation')); for v2 in FProperty_List do result.AddParameter(v2.asParams('property')); diff --git a/library/fhir3/fhir3_pathengine.pas b/library/fhir3/fhir3_pathengine.pas index 7be286879..14ba5bed6 100644 --- a/library/fhir3/fhir3_pathengine.pas +++ b/library/fhir3/fhir3_pathengine.pas @@ -143,7 +143,7 @@ TFHIRPathLexeR3 = class (TFHIRPathLexer) TFHIRPathEngine = class (TFHIRPathEngineV) private worker : TFHIRWorkerContext; - FLog : TStringBuilder; + FLog : TFslStringBuilder; primitiveTypes, allTypes : TStringList; FOnResolveConstant: TFHIRResolveConstantEvent; FUcum : TUcumServiceInterface; @@ -1119,7 +1119,7 @@ constructor TFHIRPathEngine.Create(context: TFHIRWorkerContext; ucum : TUcumServ inherited Create; worker := context; self.FUcum := ucum; - FLog := TStringBuilder.Create; + FLog := TFslStringBuilder.Create; allTypes := TStringList.Create; primitiveTypes := TStringList.Create; if (worker <> nil) then @@ -1244,11 +1244,11 @@ destructor TFHIRPathEngine.Destroy; function TFHIRPathEngine.convertToString(items: TFHIRSelectionList): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; item : TFHIRSelection; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for item in items do diff --git a/library/fhir3/fhir3_pathnode.pas b/library/fhir3/fhir3_pathnode.pas index a6c92fdfd..cc90e080a 100644 --- a/library/fhir3/fhir3_pathnode.pas +++ b/library/fhir3/fhir3_pathnode.pas @@ -189,7 +189,7 @@ TFHIRPathExpressionNode = class (TFHIRPathExpressionNodeV) procedure SetFunctionId(const Value: TFHIRPathFunction); procedure SetTypes(const Value: TFHIRTypeDetails); procedure SetOpTypes(const Value: TFHIRTypeDetails); - procedure write(b : TStringBuilder); + procedure write(b : TFslStringBuilder); procedure SetConstant(const Value: TFHIRObject); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -267,9 +267,9 @@ implementation function TFHIRPathExpressionNode.Canonical: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try write(b); result := b.ToString; @@ -504,11 +504,11 @@ function isToken(s : String) : boolean; function TFHIRPathExpressionNode.toString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; n : TFHIRPathExpressionNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try case kind of enkName: @@ -593,7 +593,7 @@ procedure TFHIRPathExpressionNode.visitAll(context : pointer; proc: TFHIRPathExp end; {$ENDIF} -procedure TFHIRPathExpressionNode.write(b: TStringBuilder); +procedure TFHIRPathExpressionNode.write(b: TFslStringBuilder); var f : boolean; n : TFHIRPathExpressionNode; @@ -602,7 +602,7 @@ procedure TFHIRPathExpressionNode.write(b: TStringBuilder); enkName: b.Append(FName); enkConstant: - b.Append(FConstant); + b.Append(FConstant.toString); enkFunction: begin b.Append(CODES_TFHIRPathFunctions[FFunctionId]); diff --git a/library/fhir3/fhir3_profiles.pas b/library/fhir3/fhir3_profiles.pas index 8fe938237..519692e88 100644 --- a/library/fhir3/fhir3_profiles.pas +++ b/library/fhir3/fhir3_profiles.pas @@ -124,7 +124,7 @@ TBaseWorkerContextR3 = class abstract (TFHIRWorkerContext) FNamingSystems : TFslMap; procedure SetProfiles(const Value: TProfileManager); - procedure Load(feed: TFHIRBundle); + procedure Load(packageId : String; feed: TFHIRBundle); public constructor Create(factory : TFHIRFactory; pcm : TFHIRPackageManager); Override; destructor Destroy; Override; @@ -133,9 +133,11 @@ TBaseWorkerContextR3 = class abstract (TFHIRWorkerContext) property Profiles : TProfileManager read FProfiles; procedure seeResourceProxy(r : TFhirResourceProxy); overload; virtual; - procedure seeResource(res : TFHIRResourceV); overload; override; + procedure seeResource(packageId : String; res : TFHIRResourceV); overload; override; procedure seeResource(res : TFHIRResourceProxyV); overload; override; procedure dropResource(rtype, id : string); override; + procedure LoadCodeSystem(r : TFhirResourceProxyV); overload; override; + procedure LoadCodeSystem(r : TFhirResourceProxy); overload; virtual; procedure LoadFromDefinitions(filename : string); procedure LoadFromFolder(folder : string); procedure LoadFromFile(filename : string); overload; @@ -623,11 +625,11 @@ procedure TProfileUtilities.markDerived(outcome : TFhirElementDefinition); function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicing) : String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; d : TFhirElementDefinitionSlicingDiscriminator; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for d in slice.discriminatorList do @@ -636,7 +638,7 @@ function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicin first := false else b.append(', '); - b.append(d); + b.append(d.toString); end; b.append('('); if (slice.orderedElement <> nil) then @@ -872,11 +874,11 @@ function TProfileUtilities.getProfileForDataType(type_ : TFhirElementDefinitionT function TProfileUtilities.typeCode(types : TFhirElementDefinitionTypeList) : String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; type_ : TFHIRElementDefinitionType; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for type_ in types do @@ -1512,7 +1514,7 @@ function TBaseWorkerContextR3.allResourceNames: TArray; i : integer; s : string; begin - FLock.Lock; + FLock.Lock('allResourceNames'); try SetLength(result, length(ALL_RESOURCE_TYPE_NAMES) - 1 + FCustomResources.Count); for a := low(TFHIRResourceType) to high(TFHIRResourceType) do @@ -1561,6 +1563,16 @@ procedure TBaseWorkerContextR3.dropResource(rtype, id: string); Profiles.DropProfile(frtStructureDefinition, id); end; +procedure TBaseWorkerContextR3.LoadCodeSystem(r: TFhirResourceProxyV); +begin + loadCodeSystem(r as TFHIRResourceProxy); +end; + +procedure TBaseWorkerContextR3.LoadCodeSystem(r: TFhirResourceProxy); +begin + // nothing +end; + function TBaseWorkerContextR3.fetchResource(t: TFhirResourceType; url, version: String): TFhirResource; var r : TFHIRResourceProxy; @@ -1607,7 +1619,7 @@ function TBaseWorkerContextR3.getChildMap(profile: TFHIRStructureDefinition; ele function TBaseWorkerContextR3.getCustomResource(name: String): TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('getCustomResource'); try if FCustomResources.TryGetValue(name, result) then result.Link @@ -1677,7 +1689,7 @@ function TBaseWorkerContextR3.getStructure(ns, name: String): TFHIRStructureDefi function TBaseWorkerContextR3.hasCustomResource(name: String): boolean; begin - FLock.Lock; + FLock.Lock('hasCustomResource'); try result := FCustomResources.ContainsKey(name); finally @@ -1689,7 +1701,7 @@ function TBaseWorkerContextR3.hasCustomResourceDefinition(sd: TFHIRStructureDefi var cr : TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('hasCustomResourceDefinition'); try result := false; for cr in FCustomResources.Values do @@ -1760,9 +1772,9 @@ procedure TBaseWorkerContextR3.LoadFromDefinitions(filename: string); fp.source := vcl; fp.Parse; if fp.resource is TFhirBundle then - Load(fp.resource as TFhirBundle) + Load(filename, fp.resource as TFhirBundle) else - SeeResource(fp.resource as TFHIRResource); + SeeResource(filename, fp.resource as TFHIRResource); finally fp.free; end; @@ -1798,10 +1810,10 @@ procedure TBaseWorkerContextR3.LoadFromFile(filename: string; parser : TFHIRPars if parser.resource is TFhirBundle then begin for be in TFhirBundle(parser.resource).entryList do - SeeResource(be.resource) + SeeResource(filename, be.resource) end else - SeeResource(parser.resource as TFHIRResource); + SeeResource(filename, parser.resource as TFHIRResource); finally fn.free; end; @@ -1845,7 +1857,7 @@ function TBaseWorkerContextR3.nonSecureResourceNames: TArray; procedure TBaseWorkerContextR3.registerCustomResource(cr: TFHIRCustomResourceInformation); begin - FLock.Lock; + FLock.Lock('registerCustomResource'); try FCustomResources.Add(cr.name, cr.Link); finally @@ -1858,11 +1870,11 @@ procedure TBaseWorkerContextR3.seeResource(res : TFHIRResourceProxyV); seeResourceProxy(res as TFHIRResourceProxy) end; -procedure TBaseWorkerContextR3.seeResource(res: TFHIRResourceV); +procedure TBaseWorkerContextR3.seeResource(packageId : String; res: TFHIRResourceV); var proxy : TFHIRResourceProxy; begin - proxy := TFHIRResourceProxy.Create(factory.link, res.link as TFHIRResource); + proxy := TFHIRResourceProxy.Create(packageId, factory.link, res.link as TFHIRResource); try SeeResourceProxy(proxy); finally @@ -1870,7 +1882,7 @@ procedure TBaseWorkerContextR3.seeResource(res: TFHIRResourceV); end; end; -procedure TBaseWorkerContextR3.Load(feed: TFHIRBundle); +procedure TBaseWorkerContextR3.Load(packageId : String; feed: TFHIRBundle); var i : integer; r : TFhirResource; @@ -1878,7 +1890,7 @@ procedure TBaseWorkerContextR3.Load(feed: TFHIRBundle); for i := 0 to feed.entryList.count - 1 do begin r := feed.entryList[i].resource; - SeeResource(r); + SeeResource(packageId, r); end; end; @@ -1899,7 +1911,7 @@ procedure TBaseWorkerContextR3.setNonSecureTypes(names: array of String); var i : integer; begin - FLock.Lock; + FLock.Lock('setNonSecureTypes'); try SetLength(FNonSecureNames, length(names)); for i := 0 to length(names)-1 do @@ -2055,7 +2067,7 @@ function TProfileManager.getProfileStructure(source: TFHirStructureDefinition; u else begin StringSplit(url, '#', id, code); - lock.Lock; + lock.Lock('getProfileStructure'); try profile := FProfilesByURL[id].Link; finally @@ -2080,7 +2092,7 @@ function TProfileManager.Link: TProfileManager; procedure TProfileManager.Unload; begin - lock.Lock; + lock.Lock('Unload'); try FProfilesById.Clear; FProfilesByURL.Clear; diff --git a/library/fhir3/fhir3_types.pas b/library/fhir3/fhir3_types.pas index c7456f8a3..9beed2674 100644 --- a/library/fhir3/fhir3_types.pas +++ b/library/fhir3/fhir3_types.pas @@ -11142,7 +11142,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FExtensionList.count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String; diff --git a/library/fhir3/fhir3_utilities.pas b/library/fhir3/fhir3_utilities.pas index bdf052930..c6afefc48 100644 --- a/library/fhir3/fhir3_utilities.pas +++ b/library/fhir3/fhir3_utilities.pas @@ -2071,10 +2071,10 @@ function getConformanceResourceUrl(res : TFHIRResource) : string; function TFHIROperationOutcomeHelper.asExceptionMessage: String; var - b : TStringBuilder; + b : TFslStringBuilder; issue : TFhirOperationOutcomeIssue; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for issue in issueList do begin @@ -3065,9 +3065,9 @@ procedure TFHIRResourceHelper.SetmlId(const Value: String); function patSummary(pat : TFHIRPatient) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(HumanNamesAsText(pat.nameList)); b.Append(' '); @@ -3082,9 +3082,9 @@ function patSummary(pat : TFHIRPatient) : string; function groupSummary(grp : TFHIRGroup) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(grp.name); if (grp.code <> nil) then @@ -3171,7 +3171,7 @@ function TFHIRBundleHelper.findResource(ref: TFHIRReference): TFhirResource; function TFHIRBundleHelper.generatePresentation: String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure addNarrative(br : boolean; n : TFhirNarrative); begin if br then @@ -3196,7 +3196,7 @@ function TFHIRBundleHelper.generatePresentation: String; if type_ = BundleTypeDocument then begin cmp := entryList[0].resource as TFhirComposition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try // header b.append( @@ -4311,12 +4311,12 @@ function TFHIRStringListHelper.hasValue(value: String): boolean; function TFHIRStringListHelper.summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; v : TFHIRString; begin f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for v in self do begin @@ -5148,6 +5148,8 @@ function TFhirCodeSystemHelper.GetSystem: String; function TFhirCodeSystemHelper.isAbstract(concept: TFhirCodeSystemConcept): boolean; var p : TFhirCodeSystemConceptProperty; + pd : TFhirCodeSystemProperty; + c, s : String; begin result := false; for p in concept.property_List do @@ -5155,8 +5157,18 @@ function TFhirCodeSystemHelper.isAbstract(concept: TFhirCodeSystemConcept): bool if (p.code = 'abstract') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); end; + s := csUriForProperty('notSelectable'); + c := 'notSelectable'; + if (s <> '') then + for pd in property_List do + if pd.uri = s then + begin + c := pd.code; + break; + end; + for p in concept.property_List do - if (p.code = 'notSelectable') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then + if (p.code = c) and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); end; @@ -5822,11 +5834,11 @@ function TFhirIdentifierListHelper.withCommas: String; function makeFileName(s : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ws : boolean; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ws := true; for ch in s do @@ -6023,7 +6035,7 @@ function TFhirReferenceHelper.GetEditString: String; if reference <> '' then result := reference else - result := '"'+display+'"'; + result := '''+display+'''; end; function TFhirReferenceHelper.getId: String; @@ -6893,7 +6905,4 @@ function TFHIRPractitionerRoleHelper.summary: String; begin result := '??'; end; - end. - - diff --git a/library/fhir3/fhir3_validator.pas b/library/fhir3/fhir3_validator.pas index 572e539db..822144489 100644 --- a/library/fhir3/fhir3_validator.pas +++ b/library/fhir3/fhir3_validator.pas @@ -416,10 +416,10 @@ function TNodeStack.push(element: TFHIRMMElement; count: integer; definition: TF function TNodeStack.addToLiteralPath(path: Array of String): String; var - b: TStringBuilder; + b: TFslStringBuilder; p: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(literalPath); for p in path do diff --git a/library/fhir3/tests/fhir3_tests_liquid.pas b/library/fhir3/tests/fhir3_tests_liquid.pas index cccbcf06d..4dbb520ff 100644 --- a/library/fhir3/tests/fhir3_tests_liquid.pas +++ b/library/fhir3/tests/fhir3_tests_liquid.pas @@ -126,7 +126,7 @@ function TLiquidEngineTest.loadResource : TFhirResource; fn := FHIR_PUB_FILE(test.str['focus'].replace('/', '-')+'.xml'); p := TFHIRXmlParser.Create(TTestingWorkerContext.Use, nil); try - f := TFileStream.Create(fn, fmOpenRead); + f := TFileStream.Create(fn, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir3/tests/fhir3_tests_pathengine.pas b/library/fhir3/tests/fhir3_tests_pathengine.pas index e079b4aa3..0538030b4 100644 --- a/library/fhir3/tests/fhir3_tests_pathengine.pas +++ b/library/fhir3/tests/fhir3_tests_pathengine.pas @@ -176,7 +176,7 @@ procedure TFHIRPathTest.FHIRPathTest(Name: String); begin p := TFHIRXmlParser.Create(TTestingWorkerContext.Use, nil); try - f := TFileStream.Create(IncludeTrailingBackslash('C:\\work\\org.hl7.fhir\\build\\publish')+input, fmOpenRead); + f := TFileStream.Create(IncludeTrailingBackslash('C:\\work\\org.hl7.fhir\\build\\publish')+input, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir4/InstanceValidator.pas b/library/fhir4/InstanceValidator.pas index 7e2e39a3a..27d72a4ad 100644 --- a/library/fhir4/InstanceValidator.pas +++ b/library/fhir4/InstanceValidator.pas @@ -157,9 +157,9 @@ TInstanceValidator = class (TFslObject) function resolveType(type_ : String; list : TFhirElementDefinitionTypeList) : TFhirElementDefinition; overload; virtual; function sliceMatches(hostContext : TFhirValidatorHostContext; element : TFhirMMElement; path : String; slicer : TFhirElementDefinition; ed : TFhirElementDefinition; profile : TFhirStructureDefinition; errors : TFslList; stack : TNodeStack) : boolean; overload; virtual; function evaluateSlicingExpression(hostContext : TFhirValidatorHostContext; element : TFhirMMElement; path : String; profile : TFhirStructureDefinition; expression : TFHIRPathExpressionNode) : boolean; overload; virtual; - procedure buildPattternExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); overload; virtual; - procedure buildCodeableConceptExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; cc : TFhirCodeableConcept); overload; virtual; - procedure buildFixedExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); overload; virtual; + procedure buildPattternExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); overload; virtual; + procedure buildCodeableConceptExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; cc : TFhirCodeableConcept); overload; virtual; + procedure buildFixedExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); overload; virtual; procedure start(hostContext : TFhirValidatorHostContext; errors : TFslList; resource : TFhirMMElement; element : TFhirMMElement; defn : TFhirStructureDefinition; stack : TNodeStack); overload; virtual; procedure validateCodeSystem(errors : TFslList; cs : TFhirMMElement; stack : TNodeStack); overload; virtual; procedure validateQuestionannaireResponse(errors : TFslList; element : TFhirMMElement; stack : TNodeStack); overload; virtual; @@ -685,10 +685,10 @@ procedure TInstanceValidator.checkMaxValueSet(errors : TFslList '', 'Unable to determine type_ of target resource')) then begin ok := false; - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); for type_ in container.type_List do begin if (not ok) and (type_.code = 'Reference') then @@ -1682,10 +1682,10 @@ function TInstanceValidator.describeReference(reference : String) : String; function TInstanceValidator.describeTypes(types : TFhirElementDefinitionTypeList) : String; var - b : TStringBuilder; + b : TFslStringBuilder; t : TFhirElementDefinitionType; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try for t in types do b.append(','+t.code); @@ -2217,7 +2217,7 @@ function TInstanceValidator.resolve(uri : String; ref : String) : String; var up : TArray; rp : TArray; - b : TStringBuilder; + b : TFslStringBuilder; i : integer; begin if (uri = '') then @@ -2227,7 +2227,7 @@ function TInstanceValidator.resolve(uri : String; ref : String) : String; rp := ref.split(['/']); if (context.getResourceNames().contains(up[length(up) - 2])) and (context.getResourceNames().contains(rp[0])) then begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try for i := 0 to length(up) - 3 do begin @@ -2370,7 +2370,7 @@ function TInstanceValidator.sliceMatches(hostContext : TFhirValidatorHostContext var n : TFhirPathExpressionNode; t : cardinal; - expression : TStringBuilder; + expression : TFslStringBuilder; s : TFhirElementDefinitionSlicingDiscriminator; discriminator : String; criteriaElement : TFhirElementDefinition; @@ -2387,7 +2387,7 @@ function TInstanceValidator.sliceMatches(hostContext : TFhirValidatorHostContext if (n = nil) then begin t := getTickCount; - expression := TStringBuilder.Create('true'); + expression := TFslStringBuilder.Create('true'); for s in slicer.slicing.discriminatorList do begin discriminator := s.path; @@ -2480,7 +2480,7 @@ function TInstanceValidator.evaluateSlicingExpression(hostContext : TFhirValidat result := ok; end; -procedure TInstanceValidator.buildPattternExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); +procedure TInstanceValidator.buildPattternExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); var pattern : TFhirType; cc : TFhirCodeableConcept; @@ -2495,7 +2495,7 @@ procedure TInstanceValidator.buildPattternExpression(ed : TFhirElementDefinition raise EDefinitionException.Create('Unsupported fixed pattern type_ for discriminator(' + discriminator + ') for slice ' + ed.id + ': ' + pattern.fhirType); end; -procedure TInstanceValidator.buildCodeableConceptExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; cc : TFhirCodeableConcept); +procedure TInstanceValidator.buildCodeableConceptExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; cc : TFhirCodeableConcept); var c : TFhirCoding; first : boolean; @@ -2535,7 +2535,7 @@ procedure TInstanceValidator.buildCodeableConceptExpression(ed : TFhirElementDef expression.append(').exists()'); end; -procedure TInstanceValidator.buildFixedExpression(ed : TFhirElementDefinition; expression : TStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); +procedure TInstanceValidator.buildFixedExpression(ed : TFhirElementDefinition; expression : TFslStringBuilder; discriminator : String; criteriaElement : TFhirElementDefinition); var fixed : TFhirType; cc : TFhirCodeableConcept; diff --git a/library/fhir4/fhir4_common.pas b/library/fhir4/fhir4_common.pas index 714e42d28..68881f25a 100644 --- a/library/fhir4/fhir4_common.pas +++ b/library/fhir4/fhir4_common.pas @@ -177,6 +177,7 @@ TFhirOperationOutcome4 = class (TFhirOperationOutcomeW) function code : TFhirIssueType; override; procedure addIssue(issue : TFhirOperationOutcomeIssueW; free : boolean); override; procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; code : TOpIssueCode; addIfDuplicate : boolean = false); overload; override; function hasIssues : boolean; override; function issues : TFslList; override; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; override; @@ -476,8 +477,8 @@ TFhirValueSetExpansionContains4 = class (TFhirValueSetExpansionContainsW) function contains : TFslList; override; procedure addDesignation(lang, use, value : String); override; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); override; - procedure addProperty(code : String; value : TFHIRObject); override; overload; - procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); override; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; override; + procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); overload; override; procedure addContains(contained : TFhirValueSetExpansionContainsW); override; procedure clearContains(); override; function properties : TFslList; override; @@ -612,6 +613,8 @@ TFHIRValueSet4 = class (TFHIRValueSetW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(value : String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function source : String; override; function findContains(systemUri, version, code : String) : TFhirValueSetExpansionContainsW; override; function getExperimental : boolean; override; @@ -656,6 +659,8 @@ TFHIRLookupOpRespDesignation4 = class (TFHIRLookupOpRespDesignationW) procedure setUse(Value: TFHIRObject); override; end; + { TFHIRLookupOpResponse4 } + TFHIRLookupOpResponse4 = class (TFHIRLookupOpResponseW) public procedure load(params : TFHIRResourceV); overload; override; @@ -670,8 +675,14 @@ TFHIRLookupOpResponse4 = class (TFHIRLookupOpResponseW) procedure addExtension(name : String; value : boolean); overload; override; function getName: String; override; procedure setName(Value: String); override; + function getCode: String; override; + procedure setCode(Value: String); override; + function getSystem: String; override; + procedure setSystem(Value: String); override; function getDisplay: String; override; - procedure setDisplay(Value: String); override; + procedure setDisplay(Value: String); override; + function getIsAbstract: boolean; override; + procedure setIsAbstract(Value: boolean); override; end; { TFhirCodeSystemConceptProperty4 } @@ -711,6 +722,7 @@ TFhirCodeSystemConcept4 = class (TFhirCodeSystemConceptW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function designationCount : integer; override; function designations : TFslList; override; @@ -737,6 +749,8 @@ TFhirCodeSystemProperty4 = class (TFhirCodeSystemPropertyW) TFhirCodeSystem4 = class (TFhirCodeSystemW) private function cs : TFhirCodeSystem; + function hasLanguage(cc: TFhirCodeSystemConcept; langs: THTTPLanguageList + ): boolean; public function wrapExtension(extension : TFHIRObject) : TFHIRExtensionW; override; function GetLanguage: String; override; @@ -750,7 +764,8 @@ TFhirCodeSystem4 = class (TFhirCodeSystemW) procedure setName(Value: String); override; procedure setStatus(Value: TPublicationStatus); override; procedure setUrl(Value: String); override; - procedure setVersion(Value: String); override; + procedure setVersion(Value: String); override; + function GetCaseSensitive: boolean; override; function getContent: TFhirCodeSystemContentMode; override; procedure setContent(Value: TFhirCodeSystemContentMode); override; function getCount: integer; override; @@ -766,6 +781,7 @@ TFhirCodeSystem4 = class (TFhirCodeSystemW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function isInactive(c : TFhirCodeSystemConceptW) : boolean; override; @@ -779,9 +795,12 @@ TFhirCodeSystem4 = class (TFhirCodeSystemW) function getDate: TFslDateTime; override; function getStatus: TPublicationStatus; override; function buildImplicitValueSet : TFHIRValueSetW; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getExperimental : boolean; override; procedure setExperimental(value : boolean); override; end; @@ -859,6 +878,8 @@ TFhirConceptMap4 = class (TFhirConceptMapW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function sourceDesc : String; override; function getExperimental : boolean; override; procedure setExperimental(value : boolean); override; @@ -1180,6 +1201,8 @@ TFHIRNamingSystem4 = class (TFHIRNamingSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; function getExperimental : boolean; override; @@ -1254,6 +1277,8 @@ TFhirTerminologyCapabilities4 = class (TFhirTerminologyCapabilitiesW) procedure setContext(Value: String); override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; public @@ -1280,6 +1305,8 @@ TFHIRTestScript4 = class (TFHIRTestScriptW) function getDate: TFslDateTime; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; procedure setDate(Value: TFslDateTime); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; @@ -1393,6 +1420,36 @@ procedure TFhirOperationOutcome4.addIssue(level: TIssueSeverity; cause: TFHIRIss iss.expressionList.Add(path); end; +procedure TFhirOperationOutcome4.addIssue(level: TIssueSeverity; + cause: TFhirIssueType; path, msgId, message: String; code: TOpIssueCode; + addIfDuplicate: boolean); +var + iss : TFhirOperationOutcomeIssue; +begin + if (message = '') then + raise EFslException.Create('Attempt to create an issue with no message'); + if (cause = itNull) then + raise EFslException.Create('Attempt to create an issue with no cause'); + + if not addIfDuplicate then + begin + for iss in (Fres as TFhirOperationOutcome).issueList do + if (iss.details <> nil) and (iss.details.text = message) then + exit(); + end; + + iss := (Fres as TFhirOperationOutcome).issueList.Append; + iss.code:= ExceptionTypeTranslations[cause]; + iss.severity := ISSUE_SEVERITY_MAP2[level]; + iss.details := TFHIRCodeableConcept.Create; + if (code <> oicVoid) then + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[code], ''); + iss.details.text := message; + iss.locationList.Add(path); + iss.expressionList.Add(path); + iss.addExtension('http://hl7.org/fhir/StructureDefinition/operationoutcome-message-id', msgid); +end; + function TFhirOperationOutcome4.code: TFhirIssueType; var a : TFhirIssueType; @@ -3045,6 +3102,16 @@ procedure TFHIRValueSet4.setPublisher(value: String); vs.publisher := value; end; +function TFHIRValueSet4.getTitle: String; +begin + result := vs.title; +end; + +procedure TFHIRValueSet4.setTitle(value: String); +begin + vs.title := value; +end; + procedure TFHIRValueSet4.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[value]; @@ -3383,17 +3450,17 @@ function TFHIRLookupOpResponse4.asParams: TFHIRResourceV; result := (op as TFHIROperationResponse).asParams; end; -function TFHIRLookupOpResponse4.GetDisplay: String; +function TFHIRLookupOpResponse4.getDisplay: String; begin result := (op as TFHIRLookupOpResponse).display; end; -function TFHIRLookupOpResponse4.GetName: String; +function TFHIRLookupOpResponse4.getName: String; begin result := (op as TFHIRLookupOpResponse).name; end; -function TFHIRLookupOpResponse4.GetVersion: String; +function TFHIRLookupOpResponse4.getVersion: String; begin result := (op as TFHIRLookupOpResponse).version; end; @@ -3408,17 +3475,48 @@ procedure TFHIRLookupOpResponse4.load(params: TFHIRResourceV); (op as TFHIRLookupOpResponse).load(params as TFhirParameters); end; -procedure TFHIRLookupOpResponse4.SetDisplay(Value: String); +procedure TFHIRLookupOpResponse4.setDisplay(Value: String); begin (op as TFHIRLookupOpResponse).display := value; end; -procedure TFHIRLookupOpResponse4.SetName(Value: String); +function TFHIRLookupOpResponse4.getIsAbstract: boolean; +begin + result := (op as TFHIRLookupOpResponse).abstract; +end; + +procedure TFHIRLookupOpResponse4.setIsAbstract(Value: boolean); +begin + (op as TFHIRLookupOpResponse).abstract := value; +end; + + +procedure TFHIRLookupOpResponse4.setName(Value: String); begin (op as TFHIRLookupOpResponse).name := value; end; -procedure TFHIRLookupOpResponse4.SetVersion(Value: String); +function TFHIRLookupOpResponse4.getCode: String; +begin + result := (op as TFHIRLookupOpResponse).code; +end; + +procedure TFHIRLookupOpResponse4.setCode(Value: String); +begin + (op as TFHIRLookupOpResponse).code := value; +end; + +function TFHIRLookupOpResponse4.getSystem: String; +begin + result := (op as TFHIRLookupOpResponse).systemUri; +end; + +procedure TFHIRLookupOpResponse4.setSystem(Value: String); +begin + (op as TFHIRLookupOpResponse).systemUri := value; +end; + +procedure TFHIRLookupOpResponse4.setVersion(Value: String); begin (op as TFHIRLookupOpResponse).version := value; end; @@ -3753,6 +3851,11 @@ function TFhirCodeSystemConcept4.conceptCount: integer; result := c.conceptList.Count; end; +function TFhirCodeSystemConcept4.hasConcepts: boolean; +begin + result := c.hasConceptList; +end; + function TFhirCodeSystemConcept4.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -3870,6 +3973,46 @@ function TFhirCodeSystem4.buildImplicitValueSet: TFHIRValueSetW; result := TFHIRValueSet4.Create(cs.buildImplicitValueSet); end; +function TFhirCodeSystem4.hasLanguage(cc : TFhirCodeSystemConcept; langs: THTTPLanguageList): boolean; +var + cc1 : TFhirCodeSystemConcept; + d : TFhirCodeSystemConceptDesignation; + hl : boolean; +begin + if langs.matches(cs.Language, false) and (cc.display <> '') then + exit(true); + + result := false; + + for d in cc.designationList do + if langs.matches(d.language, false) then + exit(true); + + for cc1 in cc.conceptList do + begin + hl := hasLanguage(cc1, langs); + if (hl) then + exit(true); + end; +end; + +function TFhirCodeSystem4.hasAnyDisplays(langs: THTTPLanguageList): boolean; +var + cc : TFhirCodeSystemConcept; + hl : boolean; +begin + result := false; + if (langs.count > 0) then + begin + for cc in cs.conceptList do + begin + hl := hasLanguage(cc, langs); + if (hl) then + exit(true); + end; + end; +end; + function TFhirCodeSystem4.concept(ndx: integer): TFhirCodeSystemConceptW; begin result := TFhirCodeSystemConcept4.Create(cs.conceptList[ndx].Link, cs); @@ -3880,6 +4023,11 @@ function TFhirCodeSystem4.conceptCount: integer; result := cs.conceptList.Count; end; +function TFhirCodeSystem4.hasConcepts: boolean; +begin + result := cs.hasConceptList; +end; + function TFhirCodeSystem4.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -4068,6 +4216,16 @@ procedure TFhirCodeSystem4.setPublisher(Value: String); cs.publisher := value; end; +function TFhirCodeSystem4.getTitle: String; +begin + result := cs.title; +end; + +procedure TFhirCodeSystem4.setTitle(value: String); +begin + cs.title := value; +end; + function TFhirCodeSystem4.getExperimental: boolean; begin result := cs.experimental; @@ -4093,6 +4251,11 @@ procedure TFhirCodeSystem4.setVersion(Value: String); cs.version := value; end; +function TFhirCodeSystem4.GetCaseSensitive: boolean; +begin + result := cs.caseSensitive; +end; + function TFhirCodeSystem4.supplements: String; begin result := cs.supplements; @@ -4635,6 +4798,16 @@ procedure TFhirConceptMap4.setPublisher(Value: String); cm.publisher := value; end; +function TFhirConceptMap4.getTitle: String; +begin + result := cm.title; +end; + +procedure TFhirConceptMap4.setTitle(value: String); +begin + cm.title := value; +end; + function TFhirConceptMap4.getContext: String; begin result := cm.context; @@ -6181,6 +6354,16 @@ procedure TFHIRNamingSystem4.setPublisher(Value: String); nm.publisher := value; end; +function TFHIRNamingSystem4.getTitle: String; +begin + result := nm.title; +end; + +procedure TFHIRNamingSystem4.setTitle(value: String); +begin + nm.title := value; +end; + procedure TFHIRNamingSystem4.setStatus(Value: TPublicationStatus); begin nm.status := MAP_TPublicationStatus[value]; @@ -6574,6 +6757,16 @@ procedure TFhirTerminologyCapabilities4.setPublisher(Value: String); tc.publisher := value; end; +function TFhirTerminologyCapabilities4.getTitle: String; +begin + result := tc.title; +end; + +procedure TFhirTerminologyCapabilities4.setTitle(value: String); +begin + tc.title := value; +end; + procedure TFhirTerminologyCapabilities4.setStatus(Value: TPublicationStatus); begin @@ -6805,6 +6998,16 @@ procedure TFHIRTestScript4.setPublisher(Value: String); ts.publisher := value; end; +function TFHIRTestScript4.getTitle: String; +begin + result := ts.title; +end; + +procedure TFHIRTestScript4.setTitle(value: String); +begin + ts.title := value; +end; + procedure TFHIRTestScript4.setStatus(Value: TPublicationStatus); begin diff --git a/library/fhir4/fhir4_context.pas b/library/fhir4/fhir4_context.pas index 999511476..538ab878b 100644 --- a/library/fhir4/fhir4_context.pas +++ b/library/fhir4/fhir4_context.pas @@ -58,8 +58,8 @@ TFHIRResourceProxy = class (TFHIRResourceProxyV) procedure loadResource; override; function wrapResource : TFHIRXVersionResourceWrapper; override; public - constructor Create(factory : TFHIRFactory; resource : TFHIRResource); overload; - constructor Create(factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; resource : TFHIRResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; destructor Destroy; override; function link : TFHIRResourceProxy; overload; @@ -169,7 +169,7 @@ TResourceMemoryCache = class (TFslObject) function Link : TResourceMemoryCache; overload; property List : TFslList read FList; - procedure load(rType, id : String; stream : TStream); + procedure load(packageId : String; rType, id : String; stream : TStream); property Packages : TArray read FPackages write FPackages; property ResourceTypes : TArray read FResourceTypes write FResourceTypes; property OnLog : TWorkProgressEvent read FOnLog write FOnLog; @@ -185,18 +185,19 @@ implementation { TFHIRResourceProxy } -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; resource: TFHIRResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; resource: TFHIRResource); begin if resource is TFHIRMetadataResource then - inherited Create(resource, TFHIRMetadataResource(resource).url, TFHIRMetadataResource(resource).version) + inherited Create(packageId, resource, TFHIRMetadataResource(resource).url, TFHIRMetadataResource(resource).version) else - inherited Create(resource, '', ''); + inherited Create(packageId, resource, '', ''); + resource.SourcePackage := packageId; FFactory := factory; end; -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); begin - inherited Create(fhirVersionRelease4, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); + inherited Create(packageId, fhirVersionRelease4, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); FFactory := factory; FWorker := worker; FInfo := pi; @@ -231,7 +232,7 @@ procedure TFHIRResourceProxy.loadResource; if FInfo = nil then exit; // not lazy loading - FLock.lock; + FLock.lock('loadResource'); try if FResourceV <> nil then exit; @@ -242,7 +243,7 @@ procedure TFHIRResourceProxy.loadResource; p := FFactory.makeParser(FWorker, ffJson, nil); try - stream := TFileStream.Create(FInfo.filename, fmOpenRead); + stream := TFileStream.Create(FInfo.filename, fmOpenRead + fmShareDenyWrite); try try r := p.parseResource(stream); @@ -256,8 +257,9 @@ procedure TFHIRResourceProxy.loadResource; finally p.free; end; - try + try FResourceV := r; + FResourceV.SourcePackage := packageId; finally FLock.unlock; end; @@ -353,7 +355,7 @@ procedure TFHIRWorkerContext.loadFromCache(cache: TResourceMemoryCache); begin cache.checkLoaded(pcm); for r in cache.List do - SeeResource(r); + SeeResource('', r); end; { TFHIRCustomResourceInformation } @@ -425,7 +427,7 @@ function TResourceMemoryCache.Link: TResourceMemoryCache; result := TResourceMemoryCache(inherited link); end; -procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); +procedure TResourceMemoryCache.load(packageId : String; rType, id: String; stream: TStream); var p : TFHIRJsonParser; begin @@ -433,6 +435,7 @@ procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); try p.source := stream; p.Parse; + p.resource.SourcePackage := packageId; FList.add(p.resource.link as TFhirResource); finally p.free; diff --git a/library/fhir4/fhir4_factory.pas b/library/fhir4/fhir4_factory.pas index 578f0882b..fb6d57a83 100644 --- a/library/fhir4/fhir4_factory.pas +++ b/library/fhir4/fhir4_factory.pas @@ -37,7 +37,7 @@ interface uses SysUtils, Classes, System.NetEncoding, - fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, fsl_i18n, fsl_ucum, fsl_web_stream, fhir_objects, fhir_parser, fhir_validator, fhir_narrative, fhir_factory, fhir_pathengine, fhir_xhtml, fhir_common, fhir_elementmodel, fhir_client, fhir_client_threaded, fhir_uris; @@ -71,8 +71,8 @@ TFHIRFactoryR4 = class (TFHIRFactory) function makeClientInt(worker : TFHIRWorkerContextV; langList : THTTPLanguageList; comm : TFHIRClientCommunicator) : TFhirClientV; overload; override; function makeHealthcareCard : THealthcareCard; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; - function makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; override; function getXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; function resetXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; @@ -85,6 +85,7 @@ TFHIRFactoryR4 = class (TFHIRFactory) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); override; function buildOperationOutcome(langList : THTTPLanguageList; e : Exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; + function buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; override; function makeByName(const name : String) : TFHIRObject; override; function makeBoolean(b : boolean): TFHIRObject; override; @@ -167,6 +168,37 @@ function TFHIRFactoryR4.buildOperationOutcome(langList : THTTPLanguageList; e: E result := fhir4_utilities.BuildOperationOutcome(langList, e, ExceptionTypeTranslations[issueCode]); end; +function TFHIRFactoryR4.buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; +var + op : TFHIROperationOutcome; + iss : TFHIROperationOutcomeIssue; +begin + op := TFHIROperationOutcome.create; + try + iss := TFHIROperationOutcomeIssue.create; + try + iss.severity := ISSUE_SEVERITY_MAP2[exception.level]; + iss.code := ExceptionTypeTranslations[exception.Cause]; + iss.expressionList.Add(exception.Path); + iss.details := TFHIRCodeableConcept.create; + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[exception.Code], ''); + if (exception.MsgId <> '') then + begin + exception.Message := i18n.translate(exception.msgId, langlist, exception.Params); + iss.details.text := exception.Message; + end + else + iss.details.text := exception.message; + op.issueList.add(iss.link); + finally + iss.free; + end; + result := op.link; + finally + op.free; + end; +end; + function TFHIRFactoryR4.canonicalResources: TArray; var i : integer; @@ -309,7 +341,7 @@ function TFHIRFactoryR4.makeCoding(system, version, code, display: String): TFHI if version <> '' then TFHIRCoding(result).version := version; if display <> '' then - TFHIRCoding(result).version := display; + TFHIRCoding(result).display := display; end; function TFHIRFactoryR4.makeCodeableConcept(coding: TFHIRCodingW): TFHIRObject; @@ -369,14 +401,14 @@ function TFHIRFactoryR4.makeInteger(s: string): TFHIRObject; result := TFhirInteger.Create(s); end; -function TFHIRFactoryR4.makeProxy(pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryR4.makeProxy(packageId : String; pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, lock, worker, pi); + result := TFHIRResourceProxy.Create(packageId, self.link, lock, worker, pi); end; -function TFHIRFactoryR4.makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; +function TFHIRFactoryR4.makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, resource as TFHIRResource); + result := TFHIRResourceProxy.Create(packageId, self.link, resource as TFHIRResource); end; function TFHIRFactoryR4.makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String): TFhirOperationOutcomeIssueW; diff --git a/library/fhir4/fhir4_graphdefinition.pas b/library/fhir4/fhir4_graphdefinition.pas index 16697977f..8ac039181 100644 --- a/library/fhir4/fhir4_graphdefinition.pas +++ b/library/fhir4/fhir4_graphdefinition.pas @@ -55,12 +55,12 @@ TFHIRGraphDefinitionParser4 = class (TFHIRGraphDefinitionParser) procedure readLinkList(list : TFhirGraphDefinitionLinkList); function readDefinition : TFhirGraphDefinition; - procedure writeCompartment(b : TStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); - procedure writePathItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeSearchItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeLinklist(b : TStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); - procedure writeHeader(b : TStringBuilder; definition : TFhirGraphDefinition); - procedure writeDefinition(b : TStringBuilder; definition : TFhirGraphDefinition); + procedure writeCompartment(b : TFslStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); + procedure writePathItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeSearchItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeLinklist(b : TFslStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); + procedure writeHeader(b : TFslStringBuilder; definition : TFhirGraphDefinition); + procedure writeDefinition(b : TFslStringBuilder; definition : TFhirGraphDefinition); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -321,10 +321,10 @@ function TFHIRGraphDefinitionParser4.readSearchLink: TFhirGraphDefinitionLink; function TFHIRGraphDefinitionParser4.asString(definition: TFhirResourceV; header: boolean): String; var t : TFhirGraphDefinition; - b : TStringBuilder; + b : TFslStringBuilder; begin t := definition as TFhirGraphDefinition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if header then writeHeader(b, t); @@ -335,7 +335,7 @@ function TFHIRGraphDefinitionParser4.asString(definition: TFhirResourceV; header end; end; -procedure TFHIRGraphDefinitionParser4.writeCompartment(b: TStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); +procedure TFHIRGraphDefinitionParser4.writeCompartment(b: TFslStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); begin if cr.use = GraphCompartmentUseCondition then b.Append('where ') @@ -351,7 +351,7 @@ procedure TFHIRGraphDefinitionParser4.writeCompartment(b: TStringBuilder; cr: TF end; end; -procedure TFHIRGraphDefinitionParser4.writeDefinition(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser4.writeDefinition(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin b.Append(CODES_TFhirResourceTypesEnum[definition.start]); if definition.profile <> '' then @@ -363,12 +363,12 @@ procedure TFHIRGraphDefinitionParser4.writeDefinition(b: TStringBuilder; definit writeLinklist(b, definition.link_List, 2); end; -procedure TFHIRGraphDefinitionParser4.writeHeader(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser4.writeHeader(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin end; -procedure TFHIRGraphDefinitionParser4.writeLinklist(b: TStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); +procedure TFHIRGraphDefinitionParser4.writeLinklist(b: TFslStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); var i : integer; begin @@ -392,7 +392,7 @@ procedure TFHIRGraphDefinitionParser4.writeLinklist(b: TStringBuilder; list: TFh end; end; -procedure TFHIRGraphDefinitionParser4.writePathItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser4.writePathItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); var i : integer; cr : TFhirGraphDefinitionLinkTargetCompartment; @@ -449,7 +449,7 @@ procedure TFHIRGraphDefinitionParser4.writePathItem(b: TStringBuilder; item: TFh end; end; -procedure TFHIRGraphDefinitionParser4.writeSearchItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser4.writeSearchItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); begin b.Append('search '); b.Append(CODES_TFhirResourceTypesEnum[item.targetList[0].type_]); diff --git a/library/fhir4/fhir4_ips.pas b/library/fhir4/fhir4_ips.pas index f2d4637da..77925545c 100644 --- a/library/fhir4/fhir4_ips.pas +++ b/library/fhir4/fhir4_ips.pas @@ -1,5 +1,33 @@ unit fhir4_ips; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface @@ -1060,22 +1088,22 @@ procedure TIPSWrapper.addAttachment(attachment : TFslBuffer; fn : String; kind : class function TIPSWrapper.fromStream(stream: TStream): TIPSWrapper; begin - raise Exception.Create('Not done yet'); + raise EFslException.Create('Not done yet'); end; class function TIPSWrapper.fromStream(stream: TFslStream): TIPSWrapper; begin - raise Exception.Create('Not done yet'); + raise EFslException.Create('Not done yet'); end; procedure TIPSWrapper.saveToStream(stream: TStream); begin - raise Exception.Create('Not done yet'); + raise EFslException.Create('Not done yet'); end; procedure TIPSWrapper.saveToStream(stream: TFslStream); begin - raise Exception.Create('Not done yet'); + raise EFslException.Create('Not done yet'); end; @@ -1137,4 +1165,8 @@ function TIPSWrapper.saveToBytes: TBytes; end; // decode(result); end; + + end. + + diff --git a/library/fhir4/fhir4_liquid.pas b/library/fhir4/fhir4_liquid.pas index b7cfb6737..3afaadf3a 100644 --- a/library/fhir4/fhir4_liquid.pas +++ b/library/fhir4/fhir4_liquid.pas @@ -74,7 +74,7 @@ TFHIRLiquidEngineContext = class (TFslObject) TFHIRLiquidNode = class abstract (TFslObject) protected procedure closeUp(); virtual; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; public function link : TFHIRLiquidNode; overload; end; @@ -82,10 +82,10 @@ TFHIRLiquidNode = class abstract (TFslObject) TFHIRLiquidConstant = class (TFHIRLiquidNode) private FConstant : String; - b : TStringBuilder; + b : TFslStringBuilder; protected procedure closeUp; override; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -100,7 +100,7 @@ TFHIRLiquidStatement = class (TFHIRLiquidNode) FStatement : String; FCompiled : TFHIRPathExpressionNode; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public destructor Destroy; override; @@ -117,7 +117,7 @@ TFHIRLiquidIf = class (TFHIRLiquidNode) FThenBody : TFSLList; FElseBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -137,7 +137,7 @@ TFHIRLiquidLoop = class (TFHIRLiquidNode) FCompiled : TFHIRPathExpressionNode; FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -155,7 +155,7 @@ TFHIRLiquidComment = class (TFHIRLiquidNode) private FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -171,7 +171,7 @@ TFHIRLiquidInclude = class (TFHIRLiquidNode) FPage : String; FParams : TFslMap; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -329,7 +329,7 @@ procedure TFHIRLiquidConstant.closeUp; constructor TFHIRLiquidConstant.Create; begin inherited; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; end; destructor TFHIRLiquidConstant.Destroy; @@ -338,7 +338,7 @@ destructor TFHIRLiquidConstant.Destroy; inherited; end; -procedure TFHIRLiquidConstant.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidConstant.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); begin b.append(FConstant); end; @@ -367,7 +367,7 @@ destructor TFHIRLiquidStatement.Destroy; inherited; end; -procedure TFHIRLiquidStatement.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidStatement.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -413,7 +413,7 @@ destructor TFHIRLiquidIf.Destroy; inherited; end; -procedure TFHIRLiquidIf.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidIf.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var ok : boolean; list : TFSLList; @@ -441,10 +441,10 @@ function TFHIRLiquidIf.link: TFHIRLiquidIf; function TFHIRLiquidIf.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% if '+condition+' %}'); for n in FThenBody do @@ -486,7 +486,7 @@ destructor TFHIRLiquidLoop.Destroy; inherited; end; -procedure TFHIRLiquidLoop.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidLoop.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var list : TFHIRSelectionList; n : TFHIRLiquidNode; @@ -517,10 +517,10 @@ function TFHIRLiquidLoop.link: TFHIRLiquidLoop; function TFHIRLiquidLoop.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% loop '+condition+' %}'); for n in FBody do @@ -562,10 +562,10 @@ function TFHIRLiquidDocument.link: TFHIRLiquidDocument; function TFHIRLiquidDocument.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for n in FBody do b.Append(n.ToString); @@ -776,12 +776,12 @@ function TFHIRLiquidParser.parseLoop(cnt: String): TFHIRLiquidNode; function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; var - b : TStringBuilder; + b : TFslStringBuilder; res : TFHIRLiquidStatement; begin grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '}') and (next2() = '}')) do b.append(grab()); @@ -804,12 +804,12 @@ function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; function TFHIRLiquidParser.parseTag(ch: char): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin FLast := FCurrent; grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '%') and(next2() = '}')) do b.append(grab()); @@ -873,11 +873,11 @@ destructor TFHIRLiquidEngine.Destroy; function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject; OnDebug: TFHIRLiquidEngineDebugEvent): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -898,11 +898,11 @@ function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFH function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -997,7 +997,7 @@ destructor TFHIRLiquidInclude.Destroy; inherited; end; -procedure TFHIRLiquidInclude.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidInclude.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var src : String; doc : TFHIRLiquidDocument; @@ -1035,10 +1035,10 @@ function TFHIRLiquidInclude.link: TFHIRLiquidInclude; function TFHIRLiquidInclude.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% include '+FPage+' %}'); for s in FParams.Keys do @@ -1071,7 +1071,7 @@ destructor TFHIRLiquidComment.Destroy; inherited; end; -procedure TFHIRLiquidComment.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidComment.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -1090,10 +1090,10 @@ function TFHIRLiquidComment.link: TFHIRLiquidComment; function TFHIRLiquidComment.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% comment %}'); for n in FBody do diff --git a/library/fhir4/fhir4_maputils.pas b/library/fhir4/fhir4_maputils.pas index 88909b052..fd7816956 100644 --- a/library/fhir4/fhir4_maputils.pas +++ b/library/fhir4/fhir4_maputils.pas @@ -166,16 +166,16 @@ TFHIRStructureMapUtilities = class (TFslObject) FServices : TTransformerServices; FFactory : TFHIRFactoryR4; FOnDebug: TFHIRStructureMapDebugEvent; - procedure renderContained(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderUses(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderImports(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); - procedure renderDoco(b : TStringBuilder; doco : String); - procedure RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); - procedure RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); - procedure renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); - procedure renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); - procedure renderConceptMap(b : TStringBuilder; map : TFHIRConceptMap); + procedure renderContained(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); + procedure renderDoco(b : TFslStringBuilder; doco : String); + procedure RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); + procedure RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); + procedure renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); + procedure renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); + procedure renderConceptMap(b : TFslStringBuilder; map : TFHIRConceptMap); function getGroup(map : TFHIRConceptMap; source, target : String) : TFHIRConceptMapGroup; function fromEnum(s : String; codes : Array of String; lexer : TFHIRPathLexer) : integer; @@ -352,10 +352,10 @@ function TFHIRStructureMapUtilities.determineTypeFromSourceType(map: TFHIRStruct function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; var - b : TStringBuilder; + b : TFslStringBuilder; g : TFhirStructureMapGroup; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try b.append('map "'); b.append(map.Url); @@ -374,7 +374,7 @@ function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; end; end; -procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRStructureMapStructure; begin @@ -398,7 +398,7 @@ procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRS b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRUri; begin @@ -412,7 +412,7 @@ procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFH b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); +procedure TFHIRStructureMapUtilities.renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); var gi : TFHIRStructureMapGroupInput; r : TFHIRStructureMapGroupRule; @@ -482,7 +482,7 @@ function matchesname(n : string; source : TFhirStructureMapGroupRuleSourceList) end; end; -procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); +procedure TFHIRStructureMapUtilities.RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); var first, ifirst : boolean; rs : TFHIRStructureMapGroupRuleSource; @@ -580,7 +580,7 @@ procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStr b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); begin b.append(rs.Context); if (rs.context = '@search') then @@ -639,7 +639,7 @@ procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); var first : boolean; rtp : TFHIRStructureMapGroupRuleTargetParameter; @@ -706,7 +706,7 @@ procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); +procedure TFHIRStructureMapUtilities.renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); begin if (rtp.Value is TFHIRBoolean) then b.append((rtp.Value as TFHIRBoolean).StringValue) @@ -728,9 +728,9 @@ procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rt function TFHIRStructureMapUtilities.render(map: TFHIRConceptMap): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try renderConceptMap(b, map); result := b.toString(); @@ -809,7 +809,7 @@ function TPrefixInformation.sizeInBytesV(magic : integer) : cardinal; inc(result, (FUrl.length * sizeof(char)) + 12); end; -procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TFHIRConceptMap); +procedure TFHIRStructureMapUtilities.renderConceptMap(b: TFslStringBuilder; map: TFHIRConceptMap); const CHARS_EQUIVALENCE : array [TFhirConceptMapEquivalenceEnum] of string = ('??', '-', '==', '=', '<-', '<=', '>-', '>=', '~', '||', '--'); var @@ -964,7 +964,7 @@ procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TF end; end; -procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderContained(b: TFslStringBuilder; map: TFHIRStructureMap); var r : TFHIRResource; begin @@ -973,7 +973,7 @@ procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFH renderConceptMap(b, r as TFhirConceptMap); end; -procedure TFHIRStructureMapUtilities.renderDoco(b : TStringBuilder; doco : String); +procedure TFHIRStructureMapUtilities.renderDoco(b : TFslStringBuilder; doco : String); begin if (doco <> '') then begin @@ -2184,7 +2184,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl b : TFHIRObject; types : TArray; uses_ : TFhirStructureMapStructure; - sb : TStringBuilder; + sb : TFslStringBuilder; cc : TFhirCodeableConcept; begin case tgt.Transform of @@ -2280,7 +2280,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl end; MapTransformAPPEND : begin - sb := TStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); + sb := TFslStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); try for i := 1 to tgt.parameterList.count - 1 do sb.append(getParamString(vars, tgt.parameterList[i])); diff --git a/library/fhir4/fhir4_narrative.pas b/library/fhir4/fhir4_narrative.pas index 381bdaebd..fce63b127 100644 --- a/library/fhir4/fhir4_narrative.pas +++ b/library/fhir4/fhir4_narrative.pas @@ -1547,9 +1547,9 @@ procedure TFHIRNarrativeGenerator.renderCodeableConcept(cc: TFHIRCodeableConcept procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRXhtmlNode; showCodeDetails: boolean); var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (o.author <> nil) then begin @@ -1566,7 +1566,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Made: ').append(o.time.ToString); + s.append('Made: '); + s.append(o.time.ToString); end; if (o.Text <> '') then @@ -1574,7 +1575,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Annontation: ').append(o.Text); + s.append('Annontation: '); + s.append(o.Text); end; x.addText(s.toString()); @@ -1799,9 +1801,9 @@ function TFHIRNarrativeGenerator.displaySampledData(sd: TFHIRSampledData): Strin function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append('(system := "'); @@ -1809,7 +1811,8 @@ function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; s.append('" code '); s.append(q.code); s.append(' := "'); - s.append(lookupCode(q.system, '', q.code)).append('")'); + s.append(lookupCode(q.system, '', q.code)); + s.append('")'); result := s.toString(); finally @@ -1946,10 +1949,10 @@ function TFHIRNarrativeGenerator.displayTimeUnits(units: TFHIRUnitsOfTimeEnum): function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (name.Text <> '') then s.append(name.Text) @@ -1976,10 +1979,10 @@ function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (address.Text <> '') then s.append(address.Text) @@ -2023,9 +2026,9 @@ function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; function TFHIRNarrativeGenerator.displayContactPoint(contact: TFHIRContactPoint): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append(describeSystem(contact.system)); if (contact.value = '') then @@ -2888,7 +2891,7 @@ function TFHIRNarrativeGenerator.getChildrenForPath(elements: TFHIRElementDefini private String makeAnchor(String codeSystem, String code) begin String s := codeSystem+"-"+code; - StringBuilder b := TStringBuilder.Create(); + StringBuilder b := TFslStringBuilder.Create(); for (char c : s.toCharArray()) begin if (Character.isAlphabetic(c)) or (Character.isDigit(c)) or (c = ".") then b.append(c); diff --git a/library/fhir4/fhir4_narrative2.pas b/library/fhir4/fhir4_narrative2.pas index 83a875700..4f2cf20b1 100644 --- a/library/fhir4/fhir4_narrative2.pas +++ b/library/fhir4/fhir4_narrative2.pas @@ -1001,10 +1001,10 @@ function TNarrativeGenerator.displaySchedule(v : TFHIRTiming) : String; function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) @@ -1032,10 +1032,10 @@ function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; function TNarrativeGenerator.displayAddress(v : TFHIRAddress) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) diff --git a/library/fhir4/fhir4_operations.pas b/library/fhir4/fhir4_operations.pas index 950d55db3..e320e04b8 100644 --- a/library/fhir4/fhir4_operations.pas +++ b/library/fhir4/fhir4_operations.pas @@ -520,8 +520,11 @@ TFHIRLookupOpRespProperty_ = class (TFHIROperationObject) TFHIRLookupOpResponse = class (TFHIROperationResponse) private FName : String; + FCode : String; + FSystem : String; FVersion : String; - FDisplay : String; + FDisplay : String; + FAbstract : Boolean; FDesignationList : TFslList; FProperty_List : TFslList; protected @@ -534,8 +537,11 @@ TFHIRLookupOpResponse = class (TFHIROperationResponse) procedure load(params : THTTPParameters); overload; override; function asParams : TFHIRParameters; override; property name : String read FName write FName; + property code : String read FCode write FCode; + property systemUri : String read FSystem write FSystem; property version : String read FVersion write FVersion; - property display : String read FDisplay write FDisplay; + property display : String read FDisplay write FDisplay; + property abstract : Boolean read FAbstract write FAbstract; property designationList : TFslList read FDesignationList; property property_List : TFslList read FProperty_List; end; @@ -3314,6 +3320,7 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); var p : TFhirParametersParameter; begin + FAbstract := params.bool['abstract']; FName := params.str['name']; FVersion := params.str['version']; FDisplay := params.str['display']; @@ -3330,7 +3337,8 @@ procedure TFHIRLookupOpResponse.load(params : THTTPParameters); begin FName := params['name']; FVersion := params['version']; - FDisplay := params['display']; + FDisplay := params['display']; + FAbstract := StrToBoolDef(params['abstract'], false); loadExtensions(params); end; @@ -3350,6 +3358,10 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters; try if (FName <> '') then result.addParameter('name', TFHIRString.Create(FName));{oz.5f} + if (FCode <> '') then + result.addParameter('code', TFHIRCode.Create(FCode)); + if (FSystem <> '') then + result.addParameter('system', TFHIRUri.Create(FSystem)); if (FVersion <> '') then result.addParameter('version', TFHIRString.Create(FVersion));{oz.5f} if (FDisplay <> '') then @@ -3358,6 +3370,7 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters; result.AddParameter(v1.asParams('designation')); for v2 in FProperty_List do result.AddParameter(v2.asParams('property')); + result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} writeExtensions(result); result.link; finally diff --git a/library/fhir4/fhir4_pathengine.pas b/library/fhir4/fhir4_pathengine.pas index 1df622154..9fcf43681 100644 --- a/library/fhir4/fhir4_pathengine.pas +++ b/library/fhir4/fhir4_pathengine.pas @@ -147,7 +147,7 @@ TFHIRPathLexer4 = class (TFHIRPathLexer) TFHIRPathEngine = class (TFHIRPathEngineV) private worker : TFHIRWorkerContext; - FLog : TStringBuilder; + FLog : TFslStringBuilder; allTypes, primitiveTypes : TStringList; FOnResolveConstant: TFHIRResolveConstantEvent; FUcum : TUcumServiceInterface; @@ -1127,7 +1127,7 @@ constructor TFHIRPathEngine.Create(context: TFHIRWorkerContext; ucum : TUcumServ inherited Create; worker := context; self.FUcum := ucum; - FLog := TStringBuilder.Create; + FLog := TFslStringBuilder.Create; allTypes := TStringList.Create; primitiveTypes := TStringList.Create; if (worker <> nil) then @@ -1252,11 +1252,11 @@ destructor TFHIRPathEngine.Destroy; function TFHIRPathEngine.convertToString(items: TFHIRSelectionList): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; item : TFHIRSelection; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for item in items do @@ -3649,7 +3649,7 @@ function TFHIRPathEngine.funcSplit(context: TFHIRPathExecutionContext; focus: TF var nl : TFHIRSelectionList; param, s : String; - p : TStringArray; + p : TArray; begin nl := execute(context, focus, exp.Parameters[0], true); try diff --git a/library/fhir4/fhir4_pathnode.pas b/library/fhir4/fhir4_pathnode.pas index ffb83aa88..ae826bbd6 100644 --- a/library/fhir4/fhir4_pathnode.pas +++ b/library/fhir4/fhir4_pathnode.pas @@ -188,7 +188,7 @@ TFHIRPathExpressionNode = class (TFHIRPathExpressionNodeV) procedure SetFunctionId(const Value: TFHIRPathFunction); procedure SetTypes(const Value: TFHIRTypeDetails); procedure SetOpTypes(const Value: TFHIRTypeDetails); - procedure write(b : TStringBuilder); + procedure write(b : TFslStringBuilder); procedure SetConstant(const Value: TFHIRObject); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -266,9 +266,9 @@ implementation function TFHIRPathExpressionNode.Canonical: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try write(b); result := b.ToString; @@ -503,11 +503,11 @@ function isToken(s : String) : boolean; function TFHIRPathExpressionNode.toString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; n : TFHIRPathExpressionNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try case kind of enkName: @@ -592,7 +592,7 @@ procedure TFHIRPathExpressionNode.visitAll(context : pointer; proc: TFHIRPathExp end; {$ENDIF} -procedure TFHIRPathExpressionNode.write(b: TStringBuilder); +procedure TFHIRPathExpressionNode.write(b: TFslStringBuilder); var f : boolean; n : TFHIRPathExpressionNode; @@ -601,7 +601,7 @@ procedure TFHIRPathExpressionNode.write(b: TStringBuilder); enkName: b.Append(FName); enkConstant: - b.Append(FConstant); + b.Append(FConstant.ToString); enkFunction: begin b.Append(CODES_TFHIRPathFunctions[FFunctionId]); diff --git a/library/fhir4/fhir4_profiles.pas b/library/fhir4/fhir4_profiles.pas index b8605450b..523c994b4 100644 --- a/library/fhir4/fhir4_profiles.pas +++ b/library/fhir4/fhir4_profiles.pas @@ -127,7 +127,7 @@ TBaseWorkerContextR4 = class abstract (TFHIRWorkerContext) FNamingSystems : TFslMap; procedure SetProfiles(const Value: TProfileManager); - procedure Load(feed: TFHIRBundle); + procedure Load(packageId : String; feed: TFHIRBundle); public constructor Create(factory : TFHIRFactory; pcm : TFHIRPackageManager); Override; destructor Destroy; Override; @@ -136,9 +136,11 @@ TBaseWorkerContextR4 = class abstract (TFHIRWorkerContext) property Profiles : TProfileManager read FProfiles; procedure seeResourceProxy(r : TFhirResourceProxy); overload; virtual; - procedure seeResource(res : TFHIRResourceV); overload; override; + procedure seeResource(packageId : String; res : TFHIRResourceV); overload; override; procedure seeResource(res : TFHIRResourceProxyV); overload; override; procedure dropResource(rtype, id : string); override; + procedure LoadCodeSystem(r : TFhirResourceProxyV); overload; override; + procedure LoadCodeSystem(r : TFhirResourceProxy); overload; virtual; procedure LoadFromDefinitions(filename : string); procedure LoadFromFolder(folder : string); procedure LoadFromFile(filename : string); overload; @@ -653,11 +655,11 @@ destructor TProfileUtilities.Destroy; // //function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicing) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // d : TFhirElementDefinitionSlicingDiscriminator; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for d in slice.discriminatorList do @@ -902,11 +904,11 @@ function TProfileUtilities.populateByProfile(profile: TFHIRStructureDefinition): // //function TProfileUtilities.typeCode(types : TFhirElementDefinitionTypeList) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // type_ : TFHIRElementDefinitionType; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for type_ in types do @@ -1533,7 +1535,7 @@ function TBaseWorkerContextR4.allResourceNames: TArray; i : integer; s : string; begin - FLock.Lock; + FLock.Lock('allResourceNames'); try SetLength(result, length(ALL_RESOURCE_TYPE_NAMES) - 1 + FCustomResources.Count); for a := low(TFHIRResourceType) to high(TFHIRResourceType) do @@ -1582,6 +1584,16 @@ procedure TBaseWorkerContextR4.dropResource(rtype, id: string); Profiles.DropProfile(frtStructureDefinition, id); end; +procedure TBaseWorkerContextR4.LoadCodeSystem(r: TFhirResourceProxyV); +begin + loadCodeSystem(r as TFHIRResourceProxy); +end; + +procedure TBaseWorkerContextR4.LoadCodeSystem(r: TFhirResourceProxy); +begin + // nothing +end; + function TBaseWorkerContextR4.fetchResource(t: TFhirResourceType; url, version: String): TFhirResource; var r : TFHIRResourceProxy; @@ -1628,7 +1640,7 @@ function TBaseWorkerContextR4.getChildMap(profile: TFHIRStructureDefinition; ele function TBaseWorkerContextR4.getCustomResource(name: String): TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('getCustomResource'); try if FCustomResources.TryGetValue(name, result) then result.Link @@ -1698,7 +1710,7 @@ function TBaseWorkerContextR4.getStructure(ns, name: String): TFHIRStructureDefi function TBaseWorkerContextR4.hasCustomResource(name: String): boolean; begin - FLock.Lock; + FLock.Lock('hasCustomResource'); try result := FCustomResources.ContainsKey(name); finally @@ -1710,7 +1722,7 @@ function TBaseWorkerContextR4.hasCustomResourceDefinition(sd: TFHIRStructureDefi var cr : TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('hasCustomResourceDefinition'); try result := false; for cr in FCustomResources.Values do @@ -1786,9 +1798,9 @@ procedure TBaseWorkerContextR4.LoadFromDefinitions(filename: string); fp.source := vcl; fp.Parse; if fp.resource is TFhirBundle then - Load(fp.resource as TFhirBundle) + Load(filename, fp.resource as TFhirBundle) else - SeeResource(fp.resource as TFHIRResource); + SeeResource(filename, fp.resource as TFHIRResource); finally fp.free; end; @@ -1824,10 +1836,10 @@ procedure TBaseWorkerContextR4.LoadFromFile(filename: string; parser : TFHIRPars if parser.resource is TFhirBundle then begin for be in TFhirBundle(parser.resource).entryList do - SeeResource(be.resource) + SeeResource(filename, be.resource) end else - SeeResource(parser.resource as TFHIRResource); + SeeResource(filename, parser.resource as TFHIRResource); finally fn.free; end; @@ -1865,7 +1877,7 @@ function TBaseWorkerContextR4.nonSecureResourceNames: TArray; procedure TBaseWorkerContextR4.registerCustomResource(cr: TFHIRCustomResourceInformation); begin - FLock.Lock; + FLock.Lock('registerCustomResource'); try FCustomResources.Add(cr.name, cr.Link); finally @@ -1878,11 +1890,12 @@ procedure TBaseWorkerContextR4.seeResource(res : TFHIRResourceProxyV); seeResourceProxy(res as TFHIRResourceProxy) end; -procedure TBaseWorkerContextR4.seeResource(res: TFHIRResourceV); +procedure TBaseWorkerContextR4.seeResource(packageId : String; res: TFHIRResourceV); var proxy : TFHIRResourceProxy; begin - proxy := TFHIRResourceProxy.Create(factory.link, res.link as TFHIRResource); + res.SourcePackage := packageId; + proxy := TFHIRResourceProxy.Create(packageId, factory.link, res.link as TFHIRResource); try SeeResourceProxy(proxy); finally @@ -1890,7 +1903,7 @@ procedure TBaseWorkerContextR4.seeResource(res: TFHIRResourceV); end; end; -procedure TBaseWorkerContextR4.Load(feed: TFHIRBundle); +procedure TBaseWorkerContextR4.Load(packageId : String; feed: TFHIRBundle); var i : integer; r : TFhirResource; @@ -1898,7 +1911,7 @@ procedure TBaseWorkerContextR4.Load(feed: TFHIRBundle); for i := 0 to feed.entryList.count - 1 do begin r := feed.entryList[i].resource; - SeeResource(r); + SeeResource(packageId, r); end; end; @@ -1925,7 +1938,7 @@ procedure TBaseWorkerContextR4.setNonSecureTypes(names: array of String); var i : integer; begin - FLock.Lock; + FLock.Lock('setNonSecureTypes'); try SetLength(FNonSecureNames, length(names)); for i := 0 to length(names)-1 do @@ -2098,7 +2111,7 @@ function TProfileManager.getProfileStructure(source: TFHirStructureDefinition; u else begin StringSplit(url, '#', id, code); - lock.Lock; + lock.Lock('getProfileStructure'); try profile := FProfilesByURL[id].Link; finally @@ -2123,7 +2136,7 @@ function TProfileManager.Link: TProfileManager; procedure TProfileManager.Unload; begin - lock.Lock; + lock.Lock('Unload'); try FProfilesById.Clear; FProfilesByURL.Clear; diff --git a/library/fhir4/fhir4_types.pas b/library/fhir4/fhir4_types.pas index 26c7715cf..0ea21043b 100644 --- a/library/fhir4/fhir4_types.pas +++ b/library/fhir4/fhir4_types.pas @@ -13299,7 +13299,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FextensionList.Count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String; diff --git a/library/fhir4/fhir4_utilities.pas b/library/fhir4/fhir4_utilities.pas index 1ad51fb58..fd9832e95 100644 --- a/library/fhir4/fhir4_utilities.pas +++ b/library/fhir4/fhir4_utilities.pas @@ -2156,10 +2156,10 @@ function getConformanceResourceUrl(res : TFHIRResource) : string; function TFHIROperationOutcomeHelper.asExceptionMessage: String; var - b : TStringBuilder; + b : TFslStringBuilder; issue : TFhirOperationOutcomeIssue; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for issue in issueList do begin @@ -3148,9 +3148,9 @@ procedure TFHIRResourceHelper.SetmlId(const Value: String); function patSummary(pat : TFHIRPatient) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(HumanNamesAsText(pat.nameList)); b.Append(' '); @@ -3165,9 +3165,9 @@ function patSummary(pat : TFHIRPatient) : string; function groupSummary(grp : TFHIRGroup) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(grp.name); if (grp.code <> nil) then @@ -3253,7 +3253,7 @@ function TFHIRBundleHelper.findResource(ref: TFHIRReference): TFhirResource; function TFHIRBundleHelper.generatePresentation: String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure addNarrative(br : boolean; n : TFhirNarrative); begin if br then @@ -3278,25 +3278,23 @@ function TFHIRBundleHelper.generatePresentation: String; if type_ = BundleTypeDocument then begin cmp := entryList[0].resource as TFhirComposition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try // header - b.append( - ''+#13#10+ - ''+#13#10+ - ' '+#13#10+ - ' '+cmp.title+''+#13#10+ - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); + b.appendLine(' '); + b.appendLine(' '+cmp.title+''); + b.appendLine(''); + b.appendLine(''); sbj := findResource(cmp.subject) as TFhirDomainResource; addNarrative(false, sbj.text); addNarrative(true, cmp.text); for section in cmp.sectionList do processSection(section); // foooter - b.append( - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); result := b.tostring; finally @@ -4405,12 +4403,12 @@ function TFHIRStringListHelper.hasValue(value: String): boolean; function TFHIRStringListHelper.summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; v : TFHIRString; begin f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for v in self do begin @@ -5260,13 +5258,27 @@ function TFhirCodeSystemHelper.GetSystem: String; function TFhirCodeSystemHelper.isAbstract(concept: TFhirCodeSystemConcept): boolean; var p : TFhirCodeSystemConceptProperty; + pd : TFhirCodeSystemProperty; + c, s : String; begin result := false; for p in concept.property_List do + begin if (p.code = 'abstract') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); + end; + s := csUriForProperty('notSelectable'); + c := 'notSelectable'; + if (s <> '') then + for pd in property_List do + if pd.uri = s then + begin + c := pd.code; + break; + end; + for p in concept.property_List do - if (p.code = 'notSelectable') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then + if (p.code = c) and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); end; @@ -5911,11 +5923,11 @@ function TFhirIdentifierListHelper.withCommas: String; function makeFileName(s : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ws : boolean; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ws := true; for ch in s do @@ -7585,4 +7597,3 @@ function TFhirBundleEntryListHelper.append(url: String): TFHIRBundleEntry; end; end. - diff --git a/library/fhir4/fhir4_validator.pas b/library/fhir4/fhir4_validator.pas index 3033a463d..b07796e4a 100644 --- a/library/fhir4/fhir4_validator.pas +++ b/library/fhir4/fhir4_validator.pas @@ -462,10 +462,10 @@ function TNodeStack.push(element: TFHIRMMElement; count: integer; definition: TF function TNodeStack.addToLiteralPath(path: Array of String): String; var - b: TStringBuilder; + b: TFslStringBuilder; p: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(literalPath); for p in path do diff --git a/library/fhir4/tests/fhir4_tests_graphql.pas b/library/fhir4/tests/fhir4_tests_graphql.pas index 178f1bcec..6d5e58b1b 100644 --- a/library/fhir4/tests/fhir4_tests_graphql.pas +++ b/library/fhir4/tests/fhir4_tests_graphql.pas @@ -230,7 +230,7 @@ procedure TFHIRGraphQLTest.TestCase(name : String); var parts : TArray; gql : TFHIRGraphQLEngine; - str : TStringBuilder; + str : TFslStringBuilder; ok : boolean; msg : String; filename : String; @@ -271,7 +271,7 @@ procedure TFHIRGraphQLTest.TestCase(name : String); if ok then begin assertTrue(output <> '$error', 'Expected to fail, but didn''t'); - str := TStringBuilder.Create; + str := TFslStringBuilder.Create; try gql.output.write(str, 0); StringToFile(str.ToString, TestSettings.fhirTestFile(['r4', 'graphql', output+'.out']), TEncoding.UTF8); diff --git a/library/fhir4/tests/fhir4_tests_liquid.pas b/library/fhir4/tests/fhir4_tests_liquid.pas index 503546c46..ddedb4327 100644 --- a/library/fhir4/tests/fhir4_tests_liquid.pas +++ b/library/fhir4/tests/fhir4_tests_liquid.pas @@ -123,7 +123,7 @@ function TLiquidEngineTest4.loadResource : TFhirResource; fn := TestSettings.fhirTestFile(['r4', 'examples', test.str['focus'].replace('/', '-').toLower+'.xml']); p := TFHIRXmlParser.Create(TTestingWorkerContext4.Use, engine.engine.context.langList.link); try - f := TFileStream.Create(fn, fmOpenRead); + f := TFileStream.Create(fn, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir4/tests/fhir4_tests_pathengine.pas b/library/fhir4/tests/fhir4_tests_pathengine.pas index 6167c32da..0f659f53d 100644 --- a/library/fhir4/tests/fhir4_tests_pathengine.pas +++ b/library/fhir4/tests/fhir4_tests_pathengine.pas @@ -77,7 +77,7 @@ procedure TFHIRPathTest4.setup; resources := TFslMap.Create('resources'); if gTests = nil then gTests := TMXmlParser.ParseFile(TestSettings.fhirTestFile(['r5', 'fhirpath', 'tests-fhir-r4.xml']), [xpDropWhitespace, xpDropComments]); - ucum := TUcumServices.Create(nil); + ucum := TUcumServices.Create(nil, nil); ucum.Import(partnerFile('ucum.dat')); engine := TFHIRPathEngine.Create(TTestingWorkerContext4.Use, TUcumServiceImplementation.Create(ucum.link)); end; @@ -181,7 +181,7 @@ procedure TFHIRPathTest4.TestCase(Name: String); else p := TFHIRXmlParser.Create(TTestingWorkerContext4.Use, nil); try - f := TFileStream.Create(TestSettings.fhirTestFile(['r4', input]), fmOpenRead); + f := TFileStream.Create(TestSettings.fhirTestFile(['r4', input]), fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir4b/fhir4b_common.pas b/library/fhir4b/fhir4b_common.pas index 0112d9471..4e8971bb9 100644 --- a/library/fhir4b/fhir4b_common.pas +++ b/library/fhir4b/fhir4b_common.pas @@ -178,6 +178,7 @@ TFhirOperationOutcome4B = class (TFhirOperationOutcomeW) function code : TFhirIssueType; override; procedure addIssue(issue : TFhirOperationOutcomeIssueW; free : boolean); override; procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; code : TOpIssueCode; addIfDuplicate : boolean = false); overload; override; function hasIssues : boolean; override; function issues : TFslList; override; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; override; @@ -477,8 +478,8 @@ TFhirValueSetExpansionContains4B = class (TFhirValueSetExpansionContainsW) function contains : TFslList; override; procedure addDesignation(lang, use, value : String); override; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); override; - procedure addProperty(code : String; value : TFHIRObject); override; overload; - procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); override; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; override; + procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); overload; override; procedure addContains(contained : TFhirValueSetExpansionContainsW); override; procedure clearContains(); override; function properties : TFslList; override; @@ -590,6 +591,9 @@ TFHIRValueSet4B = class (TFHIRValueSetW) procedure setVersion(value : String); override; function getDescription : String; override; procedure setDescription(value : String); override; + + function getExperimental : boolean; override; + procedure setExperimental(value : boolean); override; function checkCompose(place, role : String) : boolean; override; function getComposeExtensions : TFslList; override; function checkExpansion(place, role : String) : boolean; override; @@ -613,6 +617,8 @@ TFHIRValueSet4B = class (TFHIRValueSetW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(value : String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function source : String; override; function findContains(systemUri, version, code : String) : TFhirValueSetExpansionContainsW; override; end; @@ -653,6 +659,8 @@ TFHIRLookupOpRespDesignation4B = class (TFHIRLookupOpRespDesignationW) procedure setUse(Value: TFHIRObject); override; end; + { TFHIRLookupOpResponse4B } + TFHIRLookupOpResponse4B = class (TFHIRLookupOpResponseW) public procedure load(params : TFHIRResourceV); overload; override; @@ -667,8 +675,14 @@ TFHIRLookupOpResponse4B = class (TFHIRLookupOpResponseW) procedure addExtension(name : String; value : boolean); overload; override; function getName: String; override; procedure setName(Value: String); override; + function getCode: String; override; + procedure setCode(Value: String); override; + function getSystem: String; override; + procedure setSystem(Value: String); override; function getDisplay: String; override; - procedure setDisplay(Value: String); override; + procedure setDisplay(Value: String); override; + function getIsAbstract: boolean; override; + procedure setIsAbstract(Value: boolean); override; end; { TFhirCodeSystemConceptProperty4B } @@ -708,6 +722,7 @@ TFhirCodeSystemConcept4B = class (TFhirCodeSystemConceptW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function designationCount : integer; override; function designations : TFslList; override; @@ -734,6 +749,8 @@ TFhirCodeSystemProperty4B = class (TFhirCodeSystemPropertyW) TFhirCodeSystem4B = class (TFhirCodeSystemW) private function cs : TFhirCodeSystem; + function hasLanguage(cc: TFhirCodeSystemConcept; langs: THTTPLanguageList + ): boolean; public function wrapExtension(extension : TFHIRObject) : TFHIRExtensionW; override; function GetLanguage: String; override; @@ -748,6 +765,7 @@ TFhirCodeSystem4B = class (TFhirCodeSystemW) procedure setStatus(Value: TPublicationStatus); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; + function GetCaseSensitive: boolean; override; function getContent: TFhirCodeSystemContentMode; override; procedure setContent(Value: TFhirCodeSystemContentMode); override; function getCount: integer; override; @@ -763,6 +781,7 @@ TFhirCodeSystem4B = class (TFhirCodeSystemW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function isInactive(c : TFhirCodeSystemConceptW) : boolean; override; @@ -776,9 +795,12 @@ TFhirCodeSystem4B = class (TFhirCodeSystemW) function getDate: TFslDateTime; override; function getStatus: TPublicationStatus; override; function buildImplicitValueSet : TFHIRValueSetW; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getExperimental : boolean; override; procedure setExperimental(value : boolean); override; end; @@ -856,6 +878,8 @@ TFhirConceptMap4B = class (TFhirConceptMapW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function sourceDesc : String; override; function targetDesc : String; override; function getExperimental : boolean; override; @@ -1179,6 +1203,8 @@ TFHIRNamingSystem4B = class (TFHIRNamingSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; function getExperimental : boolean; override; @@ -1253,6 +1279,8 @@ TFhirTerminologyCapabilities4B = class (TFhirTerminologyCapabilitiesW) procedure setContext(Value: String); override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; public @@ -1279,6 +1307,8 @@ TFHIRTestScript4B = class (TFHIRTestScriptW) function getDate: TFslDateTime; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; procedure setDate(Value: TFslDateTime); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; @@ -1387,6 +1417,31 @@ procedure TFhirOperationOutcome4B.addIssue(level: TIssueSeverity; cause: TFHIRIs iss.expressionList.Add(path); end; +procedure TFhirOperationOutcome4B.addIssue(level: TIssueSeverity; + cause: TFhirIssueType; path, msgId, message: String; code: TOpIssueCode; + addIfDuplicate: boolean); +var + iss : TFhirOperationOutcomeIssue; +begin + if not addIfDuplicate then + begin + for iss in (Fres as TFhirOperationOutcome).issueList do + if (iss.details <> nil) and (iss.details.text = message) then + exit(); + end; + + iss := (Fres as TFhirOperationOutcome).issueList.Append; + iss.code:= ExceptionTypeTranslations[cause]; + iss.severity := ISSUE_SEVERITY_MAP2[level]; + iss.details := TFHIRCodeableConcept.Create; + if (code <> oicVoid) then + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[code], ''); + iss.details.text := message; + iss.locationList.Add(path); + iss.expressionList.Add(path); + iss.addExtension('http://hl7.org/fhir/StructureDefinition/operationoutcome-message-id', msgid); +end; + function TFhirOperationOutcome4B.code: TFhirIssueType; var a : TFhirIssueType; @@ -3039,6 +3094,16 @@ procedure TFHIRValueSet4B.setPublisher(value: String); vs.publisher := value; end; +function TFHIRValueSet4B.getTitle: String; +begin + result := vs.title; +end; + +procedure TFHIRValueSet4B.setTitle(value: String); +begin + vs.title := value; +end; + procedure TFHIRValueSet4B.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[value]; @@ -3064,6 +3129,11 @@ procedure TFHIRValueSet4B.setDescription(value: String); vs.Description := value; end; +procedure TFHIRValueSet4B.setExperimental(value: boolean); +begin + vs.experimental := value; +end; + procedure TFHIRValueSet4B.SetLanguage(const Value: String); begin (resource as TFHIRResource).language := value; @@ -3074,6 +3144,11 @@ function TFHIRValueSet4B.getDescription: String; result := vs.Description; end; +function TFHIRValueSet4B.getExperimental: boolean; +begin + result := vs.experimental; +end; + function TFHIRValueSet4B.GetLanguage: String; begin result := (resource as TFHIRResource).language; @@ -3365,17 +3440,17 @@ function TFHIRLookupOpResponse4B.asParams: TFHIRResourceV; result := (op as TFHIROperationResponse).asParams; end; -function TFHIRLookupOpResponse4B.GetDisplay: String; +function TFHIRLookupOpResponse4B.getDisplay: String; begin result := (op as TFHIRLookupOpResponse).display; end; -function TFHIRLookupOpResponse4B.GetName: String; +function TFHIRLookupOpResponse4B.getName: String; begin result := (op as TFHIRLookupOpResponse).name; end; -function TFHIRLookupOpResponse4B.GetVersion: String; +function TFHIRLookupOpResponse4B.getVersion: String; begin result := (op as TFHIRLookupOpResponse).version; end; @@ -3390,17 +3465,47 @@ procedure TFHIRLookupOpResponse4B.load(params: TFHIRResourceV); (op as TFHIRLookupOpResponse).load(params as TFhirParameters); end; -procedure TFHIRLookupOpResponse4B.SetDisplay(Value: String); +procedure TFHIRLookupOpResponse4B.setDisplay(Value: String); begin (op as TFHIRLookupOpResponse).display := value; end; -procedure TFHIRLookupOpResponse4B.SetName(Value: String); +function TFHIRLookupOpResponse4B.getIsAbstract: boolean; +begin + result := (op as TFHIRLookupOpResponse).abstract; +end; + +procedure TFHIRLookupOpResponse4B.setIsAbstract(Value: boolean); +begin + (op as TFHIRLookupOpResponse).abstract := value; +end; + +procedure TFHIRLookupOpResponse4B.setName(Value: String); begin (op as TFHIRLookupOpResponse).name := value; end; -procedure TFHIRLookupOpResponse4B.SetVersion(Value: String); +function TFHIRLookupOpResponse4B.getCode: String; +begin + result := (op as TFHIRLookupOpResponse).code; +end; + +procedure TFHIRLookupOpResponse4B.setCode(Value: String); +begin + (op as TFHIRLookupOpResponse).code := value; +end; + +function TFHIRLookupOpResponse4B.getSystem: String; +begin + result := (op as TFHIRLookupOpResponse).systemUri; +end; + +procedure TFHIRLookupOpResponse4B.setSystem(Value: String); +begin + (op as TFHIRLookupOpResponse).systemUri := value; +end; + +procedure TFHIRLookupOpResponse4B.setVersion(Value: String); begin (op as TFHIRLookupOpResponse).version := value; end; @@ -3734,6 +3839,11 @@ function TFhirCodeSystemConcept4B.conceptCount: integer; result := c.conceptList.Count; end; +function TFhirCodeSystemConcept4B.hasConcepts: boolean; +begin + result := c.hasConceptList; +end; + function TFhirCodeSystemConcept4B.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -3848,6 +3958,47 @@ function TFhirCodeSystem4B.buildImplicitValueSet: TFHIRValueSetW; result := TFHIRValueSet4B.Create(cs.buildImplicitValueSet); end; + +function TFhirCodeSystem4B.hasLanguage(cc : TFhirCodeSystemConcept; langs: THTTPLanguageList): boolean; +var + cc1 : TFhirCodeSystemConcept; + d : TFhirCodeSystemConceptDesignation; + hl , false: boolean; +begin + if langs.matches(cs.Language, false) and (cc.display <> '') then + exit(true); + + result := false; + + for d in cc.designationList do + if langs.matches(d.language, false) then + exit(true); + + for cc1 in cc.conceptList do + begin + hl := hasLanguage(cc1, langs); + if (hl) then + exit(true); + end; +end; + +function TFhirCodeSystem4B.hasAnyDisplays(langs: THTTPLanguageList): boolean; +var + cc : TFhirCodeSystemConcept; + hl : boolean; +begin + result := false; + if (langs.count > 0) then + begin + for cc in cs.conceptList do + begin + hl := hasLanguage(cc, langs); + if (hl) then + exit(true); + end; + end; +end; + function TFhirCodeSystem4B.concept(ndx: integer): TFhirCodeSystemConceptW; begin result := TFhirCodeSystemConcept4B.Create(cs.conceptList[ndx].Link, cs); @@ -3858,6 +4009,11 @@ function TFhirCodeSystem4B.conceptCount: integer; result := cs.conceptList.Count; end; +function TFhirCodeSystem4B.hasConcepts: boolean; +begin + result := cs.hasConceptList; +end; + function TFhirCodeSystem4B.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -4046,6 +4202,16 @@ procedure TFhirCodeSystem4B.setPublisher(Value: String); cs.publisher := value; end; +function TFhirCodeSystem4B.getTitle: String; +begin + result := cs.title; +end; + +procedure TFhirCodeSystem4B.setTitle(value: String); +begin + cs.title := value; +end; + function TFhirCodeSystem4B.getExperimental: boolean; begin result := cs.experimental; @@ -4071,6 +4237,11 @@ procedure TFhirCodeSystem4B.setVersion(Value: String); cs.version := value; end; +function TFhirCodeSystem4B.GetCaseSensitive: boolean; +begin + result := cs.caseSensitive; +end; + function TFhirCodeSystem4B.supplements: String; begin result := cs.supplements; @@ -4608,6 +4779,16 @@ procedure TFhirConceptMap4B.setPublisher(Value: String); cm.publisher := value; end; +function TFhirConceptMap4B.getTitle: String; +begin + result := cm.title; +end; + +procedure TFhirConceptMap4B.setTitle(value: String); +begin + cm.title := value; +end; + function TFhirConceptMap4B.getContext: String; begin result := cm.context; @@ -6148,6 +6329,16 @@ procedure TFHIRNamingSystem4B.setPublisher(Value: String); nm.publisher := value; end; +function TFHIRNamingSystem4B.getTitle: String; +begin + result := nm.title; +end; + +procedure TFHIRNamingSystem4B.setTitle(value: String); +begin + nm.title := value; +end; + procedure TFHIRNamingSystem4B.setStatus(Value: TPublicationStatus); begin nm.status := MAP_TPublicationStatus[value]; @@ -6541,6 +6732,16 @@ procedure TFhirTerminologyCapabilities4B.setPublisher(Value: String); tc.publisher := value; end; +function TFhirTerminologyCapabilities4B.getTitle: String; +begin + result := tc.title; +end; + +procedure TFhirTerminologyCapabilities4B.setTitle(value: String); +begin + tc.title := value; +end; + procedure TFhirTerminologyCapabilities4B.setStatus(Value: TPublicationStatus); begin @@ -6772,6 +6973,16 @@ procedure TFHIRTestScript4B.setPublisher(Value: String); ts.publisher := value; end; +function TFHIRTestScript4B.getTitle: String; +begin + result := ts.title; +end; + +procedure TFHIRTestScript4B.setTitle(value: String); +begin + ts.title := value; +end; + procedure TFHIRTestScript4B.setStatus(Value: TPublicationStatus); begin diff --git a/library/fhir4b/fhir4b_context.pas b/library/fhir4b/fhir4b_context.pas index ba74e18ab..9ebf70029 100644 --- a/library/fhir4b/fhir4b_context.pas +++ b/library/fhir4b/fhir4b_context.pas @@ -58,8 +58,8 @@ TFHIRResourceProxy = class (TFHIRResourceProxyV) procedure loadResource; override; function wrapResource : TFHIRXVersionResourceWrapper; override; public - constructor Create(factory : TFHIRFactory; resource : TFHIRResource); overload; - constructor Create(factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; resource : TFHIRResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; destructor Destroy; override; function link : TFHIRResourceProxy; overload; @@ -169,7 +169,7 @@ TResourceMemoryCache = class (TFslObject) function Link : TResourceMemoryCache; overload; property List : TFslList read FList; - procedure load(rType, id : String; stream : TStream); + procedure load(packageId : String; rType, id : String; stream : TStream); property Packages : TArray read FPackages write FPackages; property ResourceTypes : TArray read FResourceTypes write FResourceTypes; property OnLog : TWorkProgressEvent read FOnLog write FOnLog; @@ -185,18 +185,18 @@ implementation { TFHIRResourceProxy } -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; resource: TFHIRResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; resource: TFHIRResource); begin if resource is TFHIRCanonicalResource then - inherited Create(resource, TFHIRCanonicalResource(resource).url, TFHIRCanonicalResource(resource).version) + inherited Create(packageId, resource, TFHIRCanonicalResource(resource).url, TFHIRCanonicalResource(resource).version) else - inherited Create(resource, '', ''); + inherited Create(packageId, resource, '', ''); FFactory := factory; end; -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); begin - inherited Create(fhirVersionRelease4b, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); + inherited Create(packageId, fhirVersionRelease4b, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); FFactory := factory; FWorker := worker; FInfo := pi; @@ -231,7 +231,7 @@ procedure TFHIRResourceProxy.loadResource; if FInfo = nil then exit; // not lazy loading - FLock.lock; + FLock.lock('loadResource'); try if FResourceV <> nil then exit; @@ -242,7 +242,7 @@ procedure TFHIRResourceProxy.loadResource; p := FFactory.makeParser(FWorker, ffJson, nil); try - stream := TFileStream.Create(FInfo.filename, fmOpenRead); + stream := TFileStream.Create(FInfo.filename, fmOpenRead + fmShareDenyWrite); try try r := p.parseResource(stream); @@ -352,7 +352,7 @@ procedure TFHIRWorkerContext.loadFromCache(cache: TResourceMemoryCache); begin cache.checkLoaded(pcm); for r in cache.List do - SeeResource(r); + SeeResource('', r); end; { TFHIRCustomResourceInformation } @@ -424,7 +424,7 @@ function TResourceMemoryCache.Link: TResourceMemoryCache; result := TResourceMemoryCache(inherited link); end; -procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); +procedure TResourceMemoryCache.load(packageId : String; rType, id: String; stream: TStream); var p : TFHIRJsonParser; begin @@ -432,6 +432,7 @@ procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); try p.source := stream; p.Parse; + p.resource.SourcePackage := packageId; FList.add(p.resource.link as TFhirResource); finally p.free; diff --git a/library/fhir4b/fhir4b_factory.pas b/library/fhir4b/fhir4b_factory.pas index cd5a24a66..bf02f71f6 100644 --- a/library/fhir4b/fhir4b_factory.pas +++ b/library/fhir4b/fhir4b_factory.pas @@ -37,7 +37,7 @@ interface uses SysUtils, Classes, System.NetEncoding, - fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_npm, fsl_threads, fsl_i18n, fsl_ucum, fsl_web_stream, fhir_objects, fhir_parser, fhir_validator, fhir_narrative, fhir_factory, fhir_pathengine, fhir_xhtml, fhir_common, fhir_elementmodel, fhir_client, fhir_client_threaded, fhir_uris; @@ -71,8 +71,8 @@ TFHIRFactoryR4B = class (TFHIRFactory) function makeClientInt(worker : TFHIRWorkerContextV; langList : THTTPLanguageList; comm : TFHIRClientCommunicator) : TFhirClientV; overload; override; function makeHealthcareCard : THealthcareCard; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; - function makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; override; function getXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; function resetXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; @@ -85,6 +85,7 @@ TFHIRFactoryR4B = class (TFHIRFactory) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); override; function buildOperationOutcome(langList : THTTPLanguageList; e : Exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; + function buildOperationOutcome(i18n: TI18nSupport; langList: THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; override; function makeByName(const name : String) : TFHIRObject; override; function makeBoolean(b : boolean): TFHIRObject; override; @@ -162,6 +163,34 @@ function TFHIRFactoryR4B.buildOperationOutcome(langList : THTTPLanguageList; mes result := fhir4b_utilities.BuildOperationOutcome(langList, message, ExceptionTypeTranslations[issueCode]); end; +function TFHIRFactoryR4B.buildOperationOutcome(i18n: TI18nSupport; langList: THTTPLanguageList; exception: EFHIROperationException): TFhirResourceV; +var + op : TFHIROperationOutcome; + iss : TFHIROperationOutcomeIssue; +begin + op := TFHIROperationOutcome.create; + try + iss := TFHIROperationOutcomeIssue.create; + try + iss.severity := ISSUE_SEVERITY_MAP2[exception.level]; + iss.code := ExceptionTypeTranslations[exception.Cause]; + iss.expressionList.Add(exception.Path); + iss.details := TFHIRCodeableConcept.create; + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[exception.Code], ''); + if (exception.MsgId <> '') then + iss.details.text := i18n.translate(exception.msgId, langlist, exception.Params) + else + iss.details.text := exception.message; + op.issueList.add(iss.link); + finally + iss.free; + end; + result := op.link; + finally + op.free; + end; +end; + function TFHIRFactoryR4B.buildOperationOutcome(langList : THTTPLanguageList; e: Exception; issueCode: TFhirIssueType): TFhirResourceV; begin result := fhir4b_utilities.BuildOperationOutcome(langList, e, ExceptionTypeTranslations[issueCode]); @@ -311,7 +340,7 @@ function TFHIRFactoryR4B.makeCoding(system, version, code, display: String): TFH if version <> '' then TFHIRCoding(result).version := version; if display <> '' then - TFHIRCoding(result).version := display; + TFHIRCoding(result).display := display; end; function TFHIRFactoryR4B.makeCodeableConcept(coding: TFHIRCodingW): TFHIRObject; @@ -371,14 +400,14 @@ function TFHIRFactoryR4B.makeInteger(s: string): TFHIRObject; result := TFhirInteger.Create(s); end; -function TFHIRFactoryR4B.makeProxy(pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryR4B.makeProxy(packageId : String; pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, lock, worker, pi); + result := TFHIRResourceProxy.Create(packageId, self.link, lock, worker, pi); end; -function TFHIRFactoryR4B.makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; +function TFHIRFactoryR4B.makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, resource as TFHIRResource); + result := TFHIRResourceProxy.Create(packageId, self.link, resource as TFHIRResource); end; function TFHIRFactoryR4B.makeIssue(level : TIssueSeverity; issue: TFhirIssueType; location, message: String): TFhirOperationOutcomeIssueW; diff --git a/library/fhir4b/fhir4b_graphdefinition.pas b/library/fhir4b/fhir4b_graphdefinition.pas index 3ac69141b..eb800d539 100644 --- a/library/fhir4b/fhir4b_graphdefinition.pas +++ b/library/fhir4b/fhir4b_graphdefinition.pas @@ -56,12 +56,12 @@ TFHIRGraphDefinitionParser4B = class (TFHIRGraphDefinitionParser) procedure readLinkList(list : TFhirGraphDefinitionLinkList); function readDefinition : TFhirGraphDefinition; - procedure writeCompartment(b : TStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); - procedure writePathItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeSearchItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeLinklist(b : TStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); - procedure writeHeader(b : TStringBuilder; definition : TFhirGraphDefinition); - procedure writeDefinition(b : TStringBuilder; definition : TFhirGraphDefinition); + procedure writeCompartment(b : TFslStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); + procedure writePathItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeSearchItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeLinklist(b : TFslStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); + procedure writeHeader(b : TFslStringBuilder; definition : TFhirGraphDefinition); + procedure writeDefinition(b : TFslStringBuilder; definition : TFhirGraphDefinition); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -322,10 +322,10 @@ function TFHIRGraphDefinitionParser4B.readSearchLink: TFhirGraphDefinitionLink; function TFHIRGraphDefinitionParser4B.asString(definition: TFhirResourceV; header: boolean): String; var t : TFhirGraphDefinition; - b : TStringBuilder; + b : TFslStringBuilder; begin t := definition as TFhirGraphDefinition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if header then writeHeader(b, t); @@ -336,7 +336,7 @@ function TFHIRGraphDefinitionParser4B.asString(definition: TFhirResourceV; heade end; end; -procedure TFHIRGraphDefinitionParser4B.writeCompartment(b: TStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); +procedure TFHIRGraphDefinitionParser4B.writeCompartment(b: TFslStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); begin if cr.use = GraphCompartmentUseCondition then b.Append('where ') @@ -352,7 +352,7 @@ procedure TFHIRGraphDefinitionParser4B.writeCompartment(b: TStringBuilder; cr: T end; end; -procedure TFHIRGraphDefinitionParser4B.writeDefinition(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser4B.writeDefinition(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin b.Append(CODES_TFhirResourceTypesEnum[definition.start]); if definition.profile <> '' then @@ -364,12 +364,12 @@ procedure TFHIRGraphDefinitionParser4B.writeDefinition(b: TStringBuilder; defini writeLinklist(b, definition.link_List, 2); end; -procedure TFHIRGraphDefinitionParser4B.writeHeader(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser4B.writeHeader(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin end; -procedure TFHIRGraphDefinitionParser4B.writeLinklist(b: TStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); +procedure TFHIRGraphDefinitionParser4B.writeLinklist(b: TFslStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); var i : integer; begin @@ -393,7 +393,7 @@ procedure TFHIRGraphDefinitionParser4B.writeLinklist(b: TStringBuilder; list: TF end; end; -procedure TFHIRGraphDefinitionParser4B.writePathItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser4B.writePathItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); var i : integer; cr : TFhirGraphDefinitionLinkTargetCompartment; @@ -450,7 +450,7 @@ procedure TFHIRGraphDefinitionParser4B.writePathItem(b: TStringBuilder; item: TF end; end; -procedure TFHIRGraphDefinitionParser4B.writeSearchItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser4B.writeSearchItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); begin b.Append('search '); b.Append(CODES_TFhirResourceTypesEnum[item.targetList[0].type_]); diff --git a/library/fhir4b/fhir4b_liquid.pas b/library/fhir4b/fhir4b_liquid.pas index 5775a2da3..952f45ff1 100644 --- a/library/fhir4b/fhir4b_liquid.pas +++ b/library/fhir4b/fhir4b_liquid.pas @@ -75,7 +75,7 @@ TFHIRLiquidEngineContext = class (TFslObject) TFHIRLiquidNode = class abstract (TFslObject) protected procedure closeUp(); virtual; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; public function link : TFHIRLiquidNode; overload; end; @@ -83,10 +83,10 @@ TFHIRLiquidNode = class abstract (TFslObject) TFHIRLiquidConstant = class (TFHIRLiquidNode) private FConstant : String; - b : TStringBuilder; + b : TFslStringBuilder; protected procedure closeUp; override; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -101,7 +101,7 @@ TFHIRLiquidStatement = class (TFHIRLiquidNode) FStatement : String; FCompiled : TFHIRPathExpressionNode; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public destructor Destroy; override; @@ -118,7 +118,7 @@ TFHIRLiquidIf = class (TFHIRLiquidNode) FThenBody : TFSLList; FElseBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -138,7 +138,7 @@ TFHIRLiquidLoop = class (TFHIRLiquidNode) FCompiled : TFHIRPathExpressionNode; FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -156,7 +156,7 @@ TFHIRLiquidComment = class (TFHIRLiquidNode) private FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -172,7 +172,7 @@ TFHIRLiquidInclude = class (TFHIRLiquidNode) FPage : String; FParams : TFslMap; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -330,7 +330,7 @@ procedure TFHIRLiquidConstant.closeUp; constructor TFHIRLiquidConstant.Create; begin inherited; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; end; destructor TFHIRLiquidConstant.Destroy; @@ -339,7 +339,7 @@ destructor TFHIRLiquidConstant.Destroy; inherited; end; -procedure TFHIRLiquidConstant.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidConstant.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); begin b.append(FConstant); end; @@ -368,7 +368,7 @@ destructor TFHIRLiquidStatement.Destroy; inherited; end; -procedure TFHIRLiquidStatement.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidStatement.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -414,7 +414,7 @@ destructor TFHIRLiquidIf.Destroy; inherited; end; -procedure TFHIRLiquidIf.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidIf.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var ok : boolean; list : TFSLList; @@ -442,10 +442,10 @@ function TFHIRLiquidIf.link: TFHIRLiquidIf; function TFHIRLiquidIf.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% if '+condition+' %}'); for n in FThenBody do @@ -487,7 +487,7 @@ destructor TFHIRLiquidLoop.Destroy; inherited; end; -procedure TFHIRLiquidLoop.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidLoop.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var list : TFHIRSelectionList; n : TFHIRLiquidNode; @@ -518,10 +518,10 @@ function TFHIRLiquidLoop.link: TFHIRLiquidLoop; function TFHIRLiquidLoop.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% loop '+condition+' %}'); for n in FBody do @@ -563,10 +563,10 @@ function TFHIRLiquidDocument.link: TFHIRLiquidDocument; function TFHIRLiquidDocument.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for n in FBody do b.Append(n.ToString); @@ -777,12 +777,12 @@ function TFHIRLiquidParser.parseLoop(cnt: String): TFHIRLiquidNode; function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; var - b : TStringBuilder; + b : TFslStringBuilder; res : TFHIRLiquidStatement; begin grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '}') and (next2() = '}')) do b.append(grab()); @@ -805,12 +805,12 @@ function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; function TFHIRLiquidParser.parseTag(ch: char): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin FLast := FCurrent; grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '%') and(next2() = '}')) do b.append(grab()); @@ -874,11 +874,11 @@ destructor TFHIRLiquidEngine.Destroy; function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject; OnDebug: TFHIRLiquidEngineDebugEvent): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -899,11 +899,11 @@ function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFH function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -998,7 +998,7 @@ destructor TFHIRLiquidInclude.Destroy; inherited; end; -procedure TFHIRLiquidInclude.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidInclude.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var src : String; doc : TFHIRLiquidDocument; @@ -1036,10 +1036,10 @@ function TFHIRLiquidInclude.link: TFHIRLiquidInclude; function TFHIRLiquidInclude.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% include '+FPage+' %}'); for s in FParams.Keys do @@ -1072,7 +1072,7 @@ destructor TFHIRLiquidComment.Destroy; inherited; end; -procedure TFHIRLiquidComment.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidComment.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -1091,10 +1091,10 @@ function TFHIRLiquidComment.link: TFHIRLiquidComment; function TFHIRLiquidComment.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% comment %}'); for n in FBody do diff --git a/library/fhir4b/fhir4b_maputils.pas b/library/fhir4b/fhir4b_maputils.pas index 5b3526613..ac6a33fbd 100644 --- a/library/fhir4b/fhir4b_maputils.pas +++ b/library/fhir4b/fhir4b_maputils.pas @@ -167,16 +167,16 @@ TFHIRStructureMapUtilities = class (TFslObject) FServices : TTransformerServices; FFactory : TFHIRFactoryR4B; FOnDebug: TFHIRStructureMapDebugEvent; - procedure renderContained(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderUses(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderImports(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); - procedure renderDoco(b : TStringBuilder; doco : String); - procedure RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); - procedure RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); - procedure renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); - procedure renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); - procedure renderConceptMap(b : TStringBuilder; map : TFHIRConceptMap); + procedure renderContained(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); + procedure renderDoco(b : TFslStringBuilder; doco : String); + procedure RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); + procedure RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); + procedure renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); + procedure renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); + procedure renderConceptMap(b : TFslStringBuilder; map : TFHIRConceptMap); function getGroup(map : TFHIRConceptMap; source, target : String) : TFHIRConceptMapGroup; function fromEnum(s : String; codes : Array of String; lexer : TFHIRPathLexer) : integer; @@ -353,10 +353,10 @@ function TFHIRStructureMapUtilities.determineTypeFromSourceType(map: TFHIRStruct function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; var - b : TStringBuilder; + b : TFslStringBuilder; g : TFhirStructureMapGroup; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try b.append('map "'); b.append(map.Url); @@ -375,7 +375,7 @@ function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; end; end; -procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRStructureMapStructure; begin @@ -399,7 +399,7 @@ procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRS b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRUri; begin @@ -413,7 +413,7 @@ procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFH b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); +procedure TFHIRStructureMapUtilities.renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); var gi : TFHIRStructureMapGroupInput; r : TFHIRStructureMapGroupRule; @@ -483,7 +483,7 @@ function matchesname(n : string; source : TFhirStructureMapGroupRuleSourceList) end; end; -procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); +procedure TFHIRStructureMapUtilities.RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); var first, ifirst : boolean; rs : TFHIRStructureMapGroupRuleSource; @@ -581,7 +581,7 @@ procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStr b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); begin b.append(rs.Context); if (rs.context = '@search') then @@ -640,7 +640,7 @@ procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); var first : boolean; rtp : TFHIRStructureMapGroupRuleTargetParameter; @@ -707,7 +707,7 @@ procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); +procedure TFHIRStructureMapUtilities.renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); begin if (rtp.Value is TFHIRBoolean) then b.append((rtp.Value as TFHIRBoolean).StringValue) @@ -729,9 +729,9 @@ procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rt function TFHIRStructureMapUtilities.render(map: TFHIRConceptMap): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try renderConceptMap(b, map); result := b.toString(); @@ -810,7 +810,7 @@ function TPrefixInformation.sizeInBytesV(magic : integer) : cardinal; inc(result, (FUrl.length * sizeof(char)) + 12); end; -procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TFHIRConceptMap); +procedure TFHIRStructureMapUtilities.renderConceptMap(b: TFslStringBuilder; map: TFHIRConceptMap); const CHARS_EQUIVALENCE : array [TFhirConceptMapEquivalenceEnum] of string = ('??', '-', '==', '=', '<-', '<=', '>-', '>=', '~', '||', '--'); var @@ -965,7 +965,7 @@ procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TF end; end; -procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderContained(b: TFslStringBuilder; map: TFHIRStructureMap); var r : TFHIRResource; begin @@ -974,7 +974,7 @@ procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFH renderConceptMap(b, r as TFhirConceptMap); end; -procedure TFHIRStructureMapUtilities.renderDoco(b : TStringBuilder; doco : String); +procedure TFHIRStructureMapUtilities.renderDoco(b : TFslStringBuilder; doco : String); begin if (doco <> '') then begin @@ -2185,7 +2185,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl b : TFHIRObject; types : TArray; uses_ : TFhirStructureMapStructure; - sb : TStringBuilder; + sb : TFslStringBuilder; cc : TFhirCodeableConcept; begin case tgt.Transform of @@ -2281,7 +2281,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl end; StructureMapTransformAPPEND : begin - sb := TStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); + sb := TFslStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); try for i := 1 to tgt.parameterList.count - 1 do sb.append(getParamString(vars, tgt.parameterList[i])); diff --git a/library/fhir4b/fhir4b_narrative.pas b/library/fhir4b/fhir4b_narrative.pas index a2832bd02..f8646a488 100644 --- a/library/fhir4b/fhir4b_narrative.pas +++ b/library/fhir4b/fhir4b_narrative.pas @@ -1548,9 +1548,9 @@ procedure TFHIRNarrativeGenerator.renderCodeableConcept(cc: TFHIRCodeableConcept procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRXhtmlNode; showCodeDetails: boolean); var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (o.author <> nil) then begin @@ -1567,7 +1567,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Made: ').append(o.time.ToString); + s.append('Made: '); + s.append(o.time.ToString); end; if (o.Text <> '') then @@ -1575,7 +1576,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Annontation: ').append(o.Text); + s.append('Annontation: '); + s.append(o.Text); end; x.addText(s.toString()); @@ -1800,9 +1802,9 @@ function TFHIRNarrativeGenerator.displaySampledData(sd: TFHIRSampledData): Strin function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append('(system := "'); @@ -1810,7 +1812,8 @@ function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; s.append('" code '); s.append(q.code); s.append(' := "'); - s.append(lookupCode(q.system, '', q.code)).append('")'); + s.append(lookupCode(q.system, '', q.code)); + s.append('")'); result := s.toString(); finally @@ -1947,10 +1950,10 @@ function TFHIRNarrativeGenerator.displayTimeUnits(units: TFHIRUnitsOfTimeEnum): function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (name.Text <> '') then s.append(name.Text) @@ -1977,10 +1980,10 @@ function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (address.Text <> '') then s.append(address.Text) @@ -2024,9 +2027,9 @@ function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; function TFHIRNarrativeGenerator.displayContactPoint(contact: TFHIRContactPoint): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append(describeSystem(contact.system)); if (contact.value = '') then @@ -2889,7 +2892,7 @@ function TFHIRNarrativeGenerator.getChildrenForPath(elements: TFHIRElementDefini private String makeAnchor(String codeSystem, String code) begin String s := codeSystem+"-"+code; - StringBuilder b := TStringBuilder.Create(); + StringBuilder b := TFslStringBuilder.Create(); for (char c : s.toCharArray()) begin if (Character.isAlphabetic(c)) or (Character.isDigit(c)) or (c = ".") then b.append(c); diff --git a/library/fhir4b/fhir4b_narrative2.pas b/library/fhir4b/fhir4b_narrative2.pas index 8d8fd0506..31fd0e004 100644 --- a/library/fhir4b/fhir4b_narrative2.pas +++ b/library/fhir4b/fhir4b_narrative2.pas @@ -1003,10 +1003,10 @@ function TNarrativeGenerator.displaySchedule(v : TFHIRTiming) : String; function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) @@ -1034,10 +1034,10 @@ function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; function TNarrativeGenerator.displayAddress(v : TFHIRAddress) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) diff --git a/library/fhir4b/fhir4b_operations.pas b/library/fhir4b/fhir4b_operations.pas index 22ce161b1..ddd1c2a50 100644 --- a/library/fhir4b/fhir4b_operations.pas +++ b/library/fhir4b/fhir4b_operations.pas @@ -538,8 +538,11 @@ TFHIRLookupOpRespProperty_ = class (TFHIROperationObject) TFHIRLookupOpResponse = class (TFHIROperationResponse) private FName : String; + FCode : String; + FSystem : String; FVersion : String; - FDisplay : String; + FDisplay : String; + FAbstract : Boolean; FDesignationList : TFslList; FProperty_List : TFslList; protected @@ -552,8 +555,11 @@ TFHIRLookupOpResponse = class (TFHIROperationResponse) procedure load(params : THTTPParameters); overload; override; function asParams : TFHIRParameters; override; property name : String read FName write FName; + property code : String read FCode write FCode; + property systemUri : String read FSystem write FSystem; property version : String read FVersion write FVersion; - property display : String read FDisplay write FDisplay; + property display : String read FDisplay write FDisplay; + property abstract : Boolean read FAbstract write FAbstract; property designationList : TFslList read FDesignationList; property property_List : TFslList read FProperty_List; end; @@ -3090,6 +3096,7 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); var p : TFhirParametersParameter; begin + FAbstract := params.bool['abstract']; if params.param['name'] <> nil then FName := (params.param['name'].value as TFHIRString).Value; if params.param['version'] <> nil then @@ -3106,7 +3113,8 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); end; procedure TFHIRLookupOpResponse.load(params : THTTPParameters); begin - loadExtensions(params); + loadExtensions(params); + FAbstract := StrToBoolDef(params['abstract'], false); end; destructor TFHIRLookupOpResponse.Destroy; begin @@ -3114,11 +3122,16 @@ destructor TFHIRLookupOpResponse.Destroy; FProperty_List.free; inherited; end; -function TFHIRLookupOpResponse.asParams : TFhirParameters;var v1 : TFHIRLookupOpRespDesignation; v2 : TFHIRLookupOpRespProperty_;begin +function TFHIRLookupOpResponse.asParams : TFhirParameters;var v1 : TFHIRLookupOpRespDesignation; v2 : TFHIRLookupOpRespProperty_; +begin result := TFHIRParameters.Create; try if (FName <> '') then result.addParameter('name', TFHIRString.Create(FName)); + if (FCode <> '') then + result.addParameter('code', TFHIRCode.Create(FCode)); + if (FSystem <> '') then + result.addParameter('system', TFHIRUri.Create(FSystem)); if (FVersion <> '') then result.addParameter('version', TFHIRString.Create(FVersion)); if (FDisplay <> '') then @@ -3127,6 +3140,7 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters;var v1 : TFHIRLookupO result.AddParameter(v1.asParams('designation')); for v2 in FProperty_List do result.AddParameter(v2.asParams('property')); + result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} writeExtensions(result); result.link; finally diff --git a/library/fhir4b/fhir4b_pathengine.pas b/library/fhir4b/fhir4b_pathengine.pas index 405ceffa3..8f682bd2a 100644 --- a/library/fhir4b/fhir4b_pathengine.pas +++ b/library/fhir4b/fhir4b_pathengine.pas @@ -145,7 +145,7 @@ TFHIRPathLexer4B = class (TFHIRPathLexer) TFHIRPathEngine = class (TFHIRPathEngineV) private worker : TFHIRWorkerContext; - FLog : TStringBuilder; + FLog : TFslStringBuilder; allTypes, primitiveTypes : TStringList; FOnResolveConstant: TFHIRResolveConstantEvent; FUcum : TUcumServiceInterface; @@ -1125,7 +1125,7 @@ constructor TFHIRPathEngine.Create(context: TFHIRWorkerContext; ucum : TUcumServ inherited Create; worker := context; self.FUcum := ucum; - FLog := TStringBuilder.Create; + FLog := TFslStringBuilder.Create; allTypes := TStringList.Create; primitiveTypes := TStringList.Create; if (worker <> nil) then @@ -1250,11 +1250,11 @@ destructor TFHIRPathEngine.Destroy; function TFHIRPathEngine.convertToString(items: TFHIRSelectionList): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; item : TFHIRSelection; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for item in items do @@ -3647,7 +3647,7 @@ function TFHIRPathEngine.funcSplit(context: TFHIRPathExecutionContext; focus: TF var nl : TFHIRSelectionList; param, s : String; - p : TStringArray; + p : TArray; begin nl := execute(context, focus, exp.Parameters[0], true); try diff --git a/library/fhir4b/fhir4b_pathnode.pas b/library/fhir4b/fhir4b_pathnode.pas index 868d9a6fb..197575b92 100644 --- a/library/fhir4b/fhir4b_pathnode.pas +++ b/library/fhir4b/fhir4b_pathnode.pas @@ -188,7 +188,7 @@ TFHIRPathExpressionNode = class (TFHIRPathExpressionNodeV) procedure SetFunctionId(const Value: TFHIRPathFunction); procedure SetTypes(const Value: TFHIRTypeDetails); procedure SetOpTypes(const Value: TFHIRTypeDetails); - procedure write(b : TStringBuilder); + procedure write(b : TFslStringBuilder); procedure SetConstant(const Value: TFHIRObject); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -266,9 +266,9 @@ implementation function TFHIRPathExpressionNode.Canonical: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try write(b); result := b.ToString; @@ -503,11 +503,11 @@ function isToken(s : String) : boolean; function TFHIRPathExpressionNode.toString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; n : TFHIRPathExpressionNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try case kind of enkName: @@ -515,7 +515,11 @@ function TFHIRPathExpressionNode.toString: String; if isToken(name) then b.append(name) else - b.append('"'+name+'"'); + begin + b.append('"'); + b.append(name); + b.append('"'); + end; end; enkFunction: begin @@ -592,7 +596,7 @@ procedure TFHIRPathExpressionNode.visitAll(context : pointer; proc: TFHIRPathExp end; {$ENDIF} -procedure TFHIRPathExpressionNode.write(b: TStringBuilder); +procedure TFHIRPathExpressionNode.write(b: TFslStringBuilder); var f : boolean; n : TFHIRPathExpressionNode; @@ -601,7 +605,7 @@ procedure TFHIRPathExpressionNode.write(b: TStringBuilder); enkName: b.Append(FName); enkConstant: - b.Append(FConstant); + b.Append(FConstant.toString); enkFunction: begin b.Append(CODES_TFHIRPathFunctions[FFunctionId]); diff --git a/library/fhir4b/fhir4b_profiles.pas b/library/fhir4b/fhir4b_profiles.pas index 3e3c4b809..c77d612df 100644 --- a/library/fhir4b/fhir4b_profiles.pas +++ b/library/fhir4b/fhir4b_profiles.pas @@ -127,7 +127,7 @@ TBaseWorkerContextR4B = class abstract (TFHIRWorkerContext) FNamingSystems : TFslMap; procedure SetProfiles(const Value: TProfileManager); - procedure Load(feed: TFHIRBundle); + procedure Load(packageId : String; feed: TFHIRBundle); public constructor Create(factory : TFHIRFactory; pcm : TFHIRPackageManager); Override; destructor Destroy; Override; @@ -136,9 +136,11 @@ TBaseWorkerContextR4B = class abstract (TFHIRWorkerContext) property Profiles : TProfileManager read FProfiles; procedure seeResourceProxy(r : TFhirResourceProxy); overload; virtual; - procedure seeResource(res : TFHIRResourceV); overload; override; + procedure seeResource(packageId : String; res : TFHIRResourceV); overload; override; procedure seeResource(res : TFHIRResourceProxyV); overload; override; procedure dropResource(rtype, id : string); override; + procedure LoadCodeSystem(r : TFhirResourceProxyV); overload; override; + procedure LoadCodeSystem(r : TFhirResourceProxy); overload; virtual; procedure LoadFromDefinitions(filename : string); procedure LoadFromFolder(folder : string); procedure LoadFromFile(filename : string); overload; @@ -653,11 +655,11 @@ destructor TProfileUtilities.Destroy; // //function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicing) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // d : TFhirElementDefinitionSlicingDiscriminator; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for d in slice.discriminatorList do @@ -902,11 +904,11 @@ function TProfileUtilities.populateByProfile(profile: TFHIRStructureDefinition): // //function TProfileUtilities.typeCode(types : TFhirElementDefinitionTypeList) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // type_ : TFHIRElementDefinitionType; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for type_ in types do @@ -1533,7 +1535,7 @@ function TBaseWorkerContextR4B.allResourceNames: TArray; i : integer; s : string; begin - FLock.Lock; + FLock.Lock('allResourceNames'); try SetLength(result, length(ALL_RESOURCE_TYPE_NAMES) - 1 + FCustomResources.Count); for a := low(TFHIRResourceType) to high(TFHIRResourceType) do @@ -1582,6 +1584,16 @@ procedure TBaseWorkerContextR4B.dropResource(rtype, id: string); Profiles.DropProfile(frtStructureDefinition, id); end; +procedure TBaseWorkerContextR4B.LoadCodeSystem(r: TFhirResourceProxyV); +begin + loadCodeSystem(r as TFHIRResourceProxy); +end; + +procedure TBaseWorkerContextR4B.LoadCodeSystem(r: TFhirResourceProxy); +begin + // nothing +end; + function TBaseWorkerContextR4B.fetchResource(t: TFhirResourceType; url, version: String): TFhirResource; var r : TFHIRResourceProxy; @@ -1628,7 +1640,7 @@ function TBaseWorkerContextR4B.getChildMap(profile: TFHIRStructureDefinition; el function TBaseWorkerContextR4B.getCustomResource(name: String): TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('getCustomResource'); try if FCustomResources.TryGetValue(name, result) then result.Link @@ -1664,7 +1676,7 @@ function TBaseWorkerContextR4B.getStructure(ns, name: String): TFHIRStructureDef list : TFslList; sd : TFhirStructureDefinition; sns : String; - url : string; + url, u : string; begin list := TFslList.Create; try @@ -1675,7 +1687,8 @@ function TBaseWorkerContextR4B.getStructure(ns, name: String): TFHIRStructureDef url := 'http://hl7.org/fhir/StructureDefinition/'+name; for sd in list do begin - if (sd.url = url) then + u := sd.url; + if (u = url) then exit(sd); end; end; @@ -1698,7 +1711,7 @@ function TBaseWorkerContextR4B.getStructure(ns, name: String): TFHIRStructureDef function TBaseWorkerContextR4B.hasCustomResource(name: String): boolean; begin - FLock.Lock; + FLock.Lock('hasCustomResource'); try result := FCustomResources.ContainsKey(name); finally @@ -1710,7 +1723,7 @@ function TBaseWorkerContextR4B.hasCustomResourceDefinition(sd: TFHIRStructureDef var cr : TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('hasCustomResourceDefinition'); try result := false; for cr in FCustomResources.Values do @@ -1786,9 +1799,9 @@ procedure TBaseWorkerContextR4B.LoadFromDefinitions(filename: string); fp.source := vcl; fp.Parse; if fp.resource is TFhirBundle then - Load(fp.resource as TFhirBundle) + Load(filename, fp.resource as TFhirBundle) else - SeeResource(fp.resource as TFHIRResource); + SeeResource(filename, fp.resource as TFHIRResource); finally fp.free; end; @@ -1824,10 +1837,10 @@ procedure TBaseWorkerContextR4B.LoadFromFile(filename: string; parser : TFHIRPar if parser.resource is TFhirBundle then begin for be in TFhirBundle(parser.resource).entryList do - SeeResource(be.resource) + SeeResource(filename, be.resource) end else - SeeResource(parser.resource as TFHIRResource); + SeeResource(filename, parser.resource as TFHIRResource); finally fn.free; end; @@ -1865,7 +1878,7 @@ function TBaseWorkerContextR4B.nonSecureResourceNames: TArray; procedure TBaseWorkerContextR4B.registerCustomResource(cr: TFHIRCustomResourceInformation); begin - FLock.Lock; + FLock.Lock('registerCustomResource'); try FCustomResources.Add(cr.name, cr.Link); finally @@ -1878,11 +1891,11 @@ procedure TBaseWorkerContextR4B.seeResource(res : TFHIRResourceProxyV); seeResourceProxy(res as TFHIRResourceProxy) end; -procedure TBaseWorkerContextR4B.seeResource(res: TFHIRResourceV); +procedure TBaseWorkerContextR4B.seeResource(packageId : String; res: TFHIRResourceV); var proxy : TFHIRResourceProxy; begin - proxy := TFHIRResourceProxy.Create(factory.link, res.link as TFHIRResource); + proxy := TFHIRResourceProxy.Create(packageId, factory.link, res.link as TFHIRResource); try SeeResourceProxy(proxy); finally @@ -1890,7 +1903,7 @@ procedure TBaseWorkerContextR4B.seeResource(res: TFHIRResourceV); end; end; -procedure TBaseWorkerContextR4B.Load(feed: TFHIRBundle); +procedure TBaseWorkerContextR4B.Load(packageId : String; feed: TFHIRBundle); var i : integer; r : TFhirResource; @@ -1898,7 +1911,7 @@ procedure TBaseWorkerContextR4B.Load(feed: TFHIRBundle); for i := 0 to feed.entryList.count - 1 do begin r := feed.entryList[i].resource; - SeeResource(r); + SeeResource(packageId, r); end; end; @@ -1925,7 +1938,7 @@ procedure TBaseWorkerContextR4B.setNonSecureTypes(names: array of String); var i : integer; begin - FLock.Lock; + FLock.Lock('setNonSecureTypes'); try SetLength(FNonSecureNames, length(names)); for i := 0 to length(names)-1 do @@ -2098,7 +2111,7 @@ function TProfileManager.getProfileStructure(source: TFHirStructureDefinition; u else begin StringSplit(url, '#', id, code); - lock.Lock; + lock.Lock('getProfileStructure'); try profile := FProfilesByURL[id].Link; finally @@ -2123,7 +2136,7 @@ function TProfileManager.Link: TProfileManager; procedure TProfileManager.Unload; begin - lock.Lock; + lock.Lock('Unload'); try FProfilesById.Clear; FProfilesByURL.Clear; diff --git a/library/fhir4b/fhir4b_types.pas b/library/fhir4b/fhir4b_types.pas index 9ebecdc5a..0b900a810 100644 --- a/library/fhir4b/fhir4b_types.pas +++ b/library/fhir4b/fhir4b_types.pas @@ -9167,7 +9167,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FextensionList.Count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String; diff --git a/library/fhir4b/fhir4b_utilities.pas b/library/fhir4b/fhir4b_utilities.pas index 7465b3409..200a89ac0 100644 --- a/library/fhir4b/fhir4b_utilities.pas +++ b/library/fhir4b/fhir4b_utilities.pas @@ -2149,10 +2149,10 @@ function getConformanceResourceUrl(res : TFHIRResource) : string; function TFHIROperationOutcomeHelper.asExceptionMessage: String; var - b : TStringBuilder; + b : TFslStringBuilder; issue : TFhirOperationOutcomeIssue; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for issue in issueList do begin @@ -3139,9 +3139,9 @@ procedure TFHIRResourceHelper.SetmlId(const Value: String); function patSummary(pat : TFHIRPatient) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(HumanNamesAsText(pat.nameList)); b.Append(' '); @@ -3156,9 +3156,9 @@ function patSummary(pat : TFHIRPatient) : string; function groupSummary(grp : TFHIRGroup) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(grp.name); if (grp.code <> nil) then @@ -3244,7 +3244,7 @@ function TFHIRBundleHelper.findResource(ref: TFHIRReference): TFhirResource; function TFHIRBundleHelper.generatePresentation: String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure addNarrative(br : boolean; n : TFhirNarrative); begin if br then @@ -3269,25 +3269,23 @@ function TFHIRBundleHelper.generatePresentation: String; if type_ = BundleTypeDocument then begin cmp := entryList[0].resource as TFhirComposition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try // header - b.append( - ''+#13#10+ - ''+#13#10+ - ' '+#13#10+ - ' '+cmp.title+''+#13#10+ - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); + b.appendLine(' '); + b.appendLine(' '+cmp.title+''); + b.appendLine(''); + b.appendLine(''); sbj := findResource(cmp.subject) as TFhirDomainResource; addNarrative(false, sbj.text); addNarrative(true, cmp.text); for section in cmp.sectionList do processSection(section); // foooter - b.append( - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); result := b.tostring; finally @@ -4375,12 +4373,12 @@ function TFHIRStringListHelper.hasValue(value: String): boolean; function TFHIRStringListHelper.summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; v : TFHIRString; begin f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for v in self do begin @@ -5230,13 +5228,27 @@ function TFhirCodeSystemHelper.GetSystem: String; function TFhirCodeSystemHelper.isAbstract(concept: TFhirCodeSystemConcept): boolean; var p : TFhirCodeSystemConceptProperty; + pd : TFhirCodeSystemProperty; + c, s : String; begin result := false; for p in concept.property_List do + begin if (p.code = 'abstract') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then - exit(true); + exit(true); + end; + s := csUriForProperty('notSelectable'); + c := 'notSelectable'; + if (s <> '') then + for pd in property_List do + if pd.uri = s then + begin + c := pd.code; + break; + end; + for p in concept.property_List do - if (p.code = 'notSelectable') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then + if (p.code = c) and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); end; @@ -5881,11 +5893,11 @@ function TFhirIdentifierListHelper.withCommas: String; function makeFileName(s : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ws : boolean; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ws := true; for ch in s do @@ -7479,6 +7491,4 @@ function TFhirBundleEntryListHelper.append(url: String): TFHIRBundleEntry; result := append; result.fullUrl := url; end; - end. - diff --git a/library/fhir4b/fhir4b_validator.pas b/library/fhir4b/fhir4b_validator.pas index 33f7b4e25..2f60ea5df 100644 --- a/library/fhir4b/fhir4b_validator.pas +++ b/library/fhir4b/fhir4b_validator.pas @@ -463,10 +463,10 @@ function TNodeStack.push(element: TFHIRMMElement; count: integer; definition: TF function TNodeStack.addToLiteralPath(path: Array of String): String; var - b: TStringBuilder; + b: TFslStringBuilder; p: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(literalPath); for p in path do diff --git a/library/fhir4b/tests/fhir4b_tests_graphql.pas b/library/fhir4b/tests/fhir4b_tests_graphql.pas index 4b35909d5..ee09b523c 100644 --- a/library/fhir4b/tests/fhir4b_tests_graphql.pas +++ b/library/fhir4b/tests/fhir4b_tests_graphql.pas @@ -230,7 +230,7 @@ procedure TFHIRGraphQLTest.TestCase(name : String); var parts : TArray; gql : TFHIRGraphQLEngine; - str : TStringBuilder; + str : TFslStringBuilder; ok : boolean; msg : String; filename : String; @@ -271,7 +271,7 @@ procedure TFHIRGraphQLTest.TestCase(name : String); if ok then begin assertTrue(output <> '$error', 'Expected to fail, but didn''t'); - str := TStringBuilder.Create; + str := TFslStringBuilder.Create; try gql.output.write(str, 0); StringToFile(str.ToString, TestSettings.fhirTestFile(['r4', 'graphql', output+'.out']), TEncoding.UTF8); diff --git a/library/fhir4b/tests/fhir4b_tests_liquid.pas b/library/fhir4b/tests/fhir4b_tests_liquid.pas index 2e2cf4b54..462c7c916 100644 --- a/library/fhir4b/tests/fhir4b_tests_liquid.pas +++ b/library/fhir4b/tests/fhir4b_tests_liquid.pas @@ -123,7 +123,7 @@ function TLiquidEngineTest4.loadResource : TFhirResource; fn := TestSettings.fhirTestFile(['r4', 'examples', test.str['focus'].replace('/', '-').toLower+'.xml']); p := TFHIRXmlParser.Create(TTestingWorkerContext4.Use, engine.engine.context.lang); try - f := TFileStream.Create(fn, fmOpenRead); + f := TFileStream.Create(fn, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir4b/tests/fhir4b_tests_pathengine.pas b/library/fhir4b/tests/fhir4b_tests_pathengine.pas index 2827ad465..a45325292 100644 --- a/library/fhir4b/tests/fhir4b_tests_pathengine.pas +++ b/library/fhir4b/tests/fhir4b_tests_pathengine.pas @@ -177,7 +177,7 @@ procedure TFHIRPathTest4.TestCase(Name: String); begin p := TFHIRXmlParser.Create(TTestingWorkerContext4.Use, nil); try - f := TFileStream.Create(TestSettings.fhirTestFile(['r4', input]), fmOpenRead); + f := TFileStream.Create(TestSettings.fhirTestFile(['r4', input]), fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir5/fhir5_common.pas b/library/fhir5/fhir5_common.pas index acd663688..693578404 100644 --- a/library/fhir5/fhir5_common.pas +++ b/library/fhir5/fhir5_common.pas @@ -176,6 +176,7 @@ TFhirOperationOutcome5 = class (TFhirOperationOutcomeW) function code : TFhirIssueType; override; procedure addIssue(issue : TFhirOperationOutcomeIssueW; free : boolean); override; procedure addIssue(level : TIssueSeverity; cause : TFHIRIssueType; path, message : String; code : TOpIssueCode; addIfDuplicate : boolean); override; + procedure addIssue(level : TIssueSeverity; cause : TFhirIssueType; path, msgId, message : String; code : TOpIssueCode; addIfDuplicate : boolean = false); overload; override; function hasIssues : boolean; override; function issues : TFslList; override; function rule(level : TIssueSeverity; source : String; typeCode : TFhirIssueType; path : string; test : boolean; msg : string) : boolean; override; @@ -475,8 +476,8 @@ TFhirValueSetExpansionContains5 = class (TFhirValueSetExpansionContainsW) function contains : TFslList; override; procedure addDesignation(lang, use, value : String); override; procedure addDesignation(lang : TIETFLang; use : TFHIRCodingW; value : TFHIRPrimitiveW; extensions : TFslList); override; - procedure addProperty(code : String; value : TFHIRObject); override; overload; - procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); override; overload; + procedure addProperty(code : String; value : TFHIRObject); overload; override; + procedure addProperty(code : String; prop : TFhirCodeSystemConceptPropertyW); overload; override; procedure addContains(contained : TFhirValueSetExpansionContainsW); override; procedure clearContains(); override; function properties : TFslList; override; @@ -610,7 +611,9 @@ TFHIRValueSet5 = class (TFHIRValueSetW) function addInclude : TFhirValueSetComposeIncludeW; override; function getContext: String; override; function getPublisher: String; override; - procedure setPublisher(value : String); override; + procedure setPublisher(value : String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function source : String; override; function findContains(systemUri, version, code : String) : TFhirValueSetExpansionContainsW; override; function getExperimental : boolean; override; @@ -655,6 +658,8 @@ TFHIRLookupOpRespDesignation5 = class (TFHIRLookupOpRespDesignationW) procedure setUse(Value: TFHIRObject); override; end; + { TFHIRLookupOpResponse5 } + TFHIRLookupOpResponse5 = class (TFHIRLookupOpResponseW) public procedure load(params : TFHIRResourceV); overload; override; @@ -669,8 +674,14 @@ TFHIRLookupOpResponse5 = class (TFHIRLookupOpResponseW) procedure addExtension(name : String; value : boolean); overload; override; function getName: String; override; procedure setName(Value: String); override; + function getCode: String; override; + procedure setCode(Value: String); override; + function getSystem: String; override; + procedure setSystem(Value: String); override; function getDisplay: String; override; - procedure setDisplay(Value: String); override; + procedure setDisplay(Value: String); override; + function getIsAbstract: boolean; override; + procedure setIsAbstract(Value: boolean); override; end; { TFhirCodeSystemConceptProperty5 } @@ -710,6 +721,7 @@ TFhirCodeSystemConcept5 = class (TFhirCodeSystemConceptW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function designationCount : integer; override; function designations : TFslList; override; @@ -735,6 +747,8 @@ TFhirCodeSystemProperty5 = class (TFhirCodeSystemPropertyW) TFhirCodeSystem5 = class (TFhirCodeSystemW) private function cs : TFhirCodeSystem; + function hasLanguage(cc: TFhirCodeSystemConcept; langs: THTTPLanguageList + ): boolean; public function wrapExtension(extension : TFHIRObject) : TFHIRExtensionW; override; function GetLanguage: String; override; @@ -749,6 +763,7 @@ TFhirCodeSystem5 = class (TFhirCodeSystemW) procedure setStatus(Value: TPublicationStatus); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; + function GetCaseSensitive: boolean; override; function getContent: TFhirCodeSystemContentMode; override; procedure setContent(Value: TFhirCodeSystemContentMode); override; function getCount: integer; override; @@ -764,6 +779,7 @@ TFhirCodeSystem5 = class (TFhirCodeSystemW) function conceptList : TFhirCodeSystemConceptListW; override; function concept(ndx : integer) : TFhirCodeSystemConceptW; override; function conceptCount : integer; override; + function hasConcepts : boolean; override; function hasConcept(c : TFhirCodeSystemConceptW) : boolean; override; function isInactive(c : TFhirCodeSystemConceptW) : boolean; override; @@ -777,9 +793,12 @@ TFhirCodeSystem5 = class (TFhirCodeSystemW) function getDate: TFslDateTime; override; function getStatus: TPublicationStatus; override; function buildImplicitValueSet : TFHIRValueSetW; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getExperimental : boolean; override; procedure setExperimental(value : boolean); override; end; @@ -857,6 +876,8 @@ TFhirConceptMap5 = class (TFhirConceptMapW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function sourceDesc : String; override; function targetDesc : String; override; function getExperimental : boolean; override; @@ -1188,6 +1209,8 @@ TFHIRNamingSystem5 = class (TFHIRNamingSystemW) function getContext: String; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; function getExperimental : boolean; override; @@ -1262,6 +1285,8 @@ TFhirTerminologyCapabilities5 = class (TFhirTerminologyCapabilitiesW) procedure setContext(Value: String); override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; function getVersion: String; override; procedure setVersion(Value: String); override; public @@ -1288,6 +1313,8 @@ TFHIRTestScript5 = class (TFHIRTestScriptW) function getDate: TFslDateTime; override; function getPublisher: String; override; procedure setPublisher(Value: String); override; + function getTitle : String; override; + procedure setTitle(value : String); override; procedure setDate(Value: TFslDateTime); override; procedure setUrl(Value: String); override; procedure setVersion(Value: String); override; @@ -1402,6 +1429,36 @@ procedure TFhirOperationOutcome5.addIssue(level: TIssueSeverity; cause: TFHIRIss iss.expressionList.Add(path); end; +procedure TFhirOperationOutcome5.addIssue(level: TIssueSeverity; + cause: TFhirIssueType; path, msgId, message: String; code: TOpIssueCode; + addIfDuplicate: boolean); +var + iss : TFhirOperationOutcomeIssue; +begin + if (message = '') then + raise EFslException.Create('Attempt to create an issue with no message'); + if (cause = itNull) then + raise EFslException.Create('Attempt to create an issue with no cause'); + + if not addIfDuplicate then + begin + for iss in (Fres as TFhirOperationOutcome).issueList do + if (iss.details <> nil) and (iss.details.text = message) then + exit(); + end; + + iss := (Fres as TFhirOperationOutcome).issueList.Append; + iss.code:= ExceptionTypeTranslations[cause]; + iss.severity := ISSUE_SEVERITY_MAP2[level]; + iss.details := TFHIRCodeableConcept.Create; + if (code <> oicVoid) then + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[code], ''); + iss.details.text := message; + iss.locationList.Add(path); + iss.expressionList.Add(path); + iss.addExtension('http://hl7.org/fhir/StructureDefinition/operationoutcome-message-id', msgid); +end; + function TFhirOperationOutcome5.code: TFhirIssueType; var a : TFhirIssueType; @@ -3050,6 +3107,16 @@ procedure TFHIRValueSet5.setPublisher(value: String); vs.publisher := value; end; +function TFHIRValueSet5.getTitle: String; +begin + result := vs.title; +end; + +procedure TFHIRValueSet5.setTitle(value: String); +begin + vs.title := value; +end; + procedure TFHIRValueSet5.setStatus(Value: TPublicationStatus); begin vs.status := MAP_TPublicationStatus[value]; @@ -3120,6 +3187,7 @@ procedure TFHIRValueSet5.setExperimental(value: boolean); begin vs.experimental := value; end; + function TFHIRValueSet5.getVersion: String; begin result := vs.Version; @@ -3385,17 +3453,17 @@ function TFHIRLookupOpResponse5.asParams: TFHIRResourceV; result := (op as TFHIROperationResponse).asParams; end; -function TFHIRLookupOpResponse5.GetDisplay: String; +function TFHIRLookupOpResponse5.getDisplay: String; begin result := (op as TFHIRLookupOpResponse).display; end; -function TFHIRLookupOpResponse5.GetName: String; +function TFHIRLookupOpResponse5.getName: String; begin result := (op as TFHIRLookupOpResponse).name; end; -function TFHIRLookupOpResponse5.GetVersion: String; +function TFHIRLookupOpResponse5.getVersion: String; begin result := (op as TFHIRLookupOpResponse).version; end; @@ -3410,17 +3478,47 @@ procedure TFHIRLookupOpResponse5.load(params: TFHIRResourceV); (op as TFHIRLookupOpResponse).load(params as TFhirParameters); end; -procedure TFHIRLookupOpResponse5.SetDisplay(Value: String); +procedure TFHIRLookupOpResponse5.setDisplay(Value: String); begin (op as TFHIRLookupOpResponse).display := value; end; -procedure TFHIRLookupOpResponse5.SetName(Value: String); +function TFHIRLookupOpResponse5.getIsAbstract: boolean; +begin + result := (op as TFHIRLookupOpResponse).abstract; +end; + +procedure TFHIRLookupOpResponse5.setIsAbstract(Value: boolean); +begin + (op as TFHIRLookupOpResponse).abstract := value; +end; + +procedure TFHIRLookupOpResponse5.setName(Value: String); begin (op as TFHIRLookupOpResponse).name := value; end; -procedure TFHIRLookupOpResponse5.SetVersion(Value: String); +function TFHIRLookupOpResponse5.getCode: String; +begin + result := (op as TFHIRLookupOpResponse).code; +end; + +procedure TFHIRLookupOpResponse5.setCode(Value: String); +begin + (op as TFHIRLookupOpResponse).code := value; +end; + +function TFHIRLookupOpResponse5.getSystem: String; +begin + result := (op as TFHIRLookupOpResponse).systemUri; +end; + +procedure TFHIRLookupOpResponse5.setSystem(Value: String); +begin + (op as TFHIRLookupOpResponse).systemUri := value; +end; + +procedure TFHIRLookupOpResponse5.setVersion(Value: String); begin (op as TFHIRLookupOpResponse).version := value; end; @@ -3754,6 +3852,11 @@ function TFhirCodeSystemConcept5.conceptCount: integer; result := c.conceptList.Count; end; +function TFhirCodeSystemConcept5.hasConcepts: boolean; +begin + result := c.hasConceptList; +end; + function TFhirCodeSystemConcept5.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -3868,6 +3971,46 @@ function TFhirCodeSystem5.buildImplicitValueSet: TFHIRValueSetW; result := TFHIRValueSet5.Create(cs.buildImplicitValueSet); end; +function TFhirCodeSystem5.hasLanguage(cc : TFhirCodeSystemConcept; langs: THTTPLanguageList): boolean; +var + cc1 : TFhirCodeSystemConcept; + d : TFhirCodeSystemConceptDesignation; + hl : boolean; +begin + if langs.matches(cs.Language, false) and (cc.display <> '') then + exit(true); + + result := false; + + for d in cc.designationList do + if langs.matches(d.language, false) then + exit(true); + + for cc1 in cc.conceptList do + begin + hl := hasLanguage(cc1, langs); + if (hl) then + exit(true); + end; +end; + +function TFhirCodeSystem5.hasAnyDisplays(langs: THTTPLanguageList): boolean; +var + cc : TFhirCodeSystemConcept; + hl : boolean; +begin + result := false; + if (langs.count > 0) then + begin + for cc in cs.conceptList do + begin + hl := hasLanguage(cc, langs); + if (hl) then + exit(true); + end; + end; +end; + function TFhirCodeSystem5.concept(ndx: integer): TFhirCodeSystemConceptW; begin result := TFhirCodeSystemConcept5.create(cs.conceptList[ndx].Link, cs); @@ -3878,6 +4021,11 @@ function TFhirCodeSystem5.conceptCount: integer; result := cs.conceptList.Count; end; +function TFhirCodeSystem5.hasConcepts: boolean; +begin + result := cs.hasConceptList; +end; + function TFhirCodeSystem5.conceptList: TFhirCodeSystemConceptListW; var i : TFHIRCodeSystemConcept; @@ -4066,6 +4214,16 @@ procedure TFhirCodeSystem5.setPublisher(Value: String); cs.publisher := value; end; +function TFhirCodeSystem5.getTitle: String; +begin + result := cs.title; +end; + +procedure TFhirCodeSystem5.setTitle(value: String); +begin + cs.title := value; +end; + function TFhirCodeSystem5.getExperimental: boolean; begin result := cs.experimental; @@ -4091,6 +4249,11 @@ procedure TFhirCodeSystem5.setVersion(Value: String); cs.version := value; end; +function TFhirCodeSystem5.GetCaseSensitive: boolean; +begin + result := cs.caseSensitive; +end; + function TFhirCodeSystem5.supplements: String; begin result := cs.supplements; @@ -4227,10 +4390,10 @@ procedure TFhirValueSetExpansion5.defineProperty(focus: TFhirValueSetExpansionCo begin pdv := ((focus as TFhirValueSetExpansionContains5).element as TFhirValueSetExpansionContains).property_list.append; pdv.code := code; - pdv.value := value as TFHIRDataType; + pdv.value := (value as TFHIRDataType).link; end else - pdv.value := value as TFHIRDataType; + pdv.value := (value as TFHIRDataType).link; finally value.free; end; @@ -4627,6 +4790,16 @@ procedure TFhirConceptMap5.setPublisher(Value: String); cm.publisher := value; end; +function TFhirConceptMap5.getTitle: String; +begin + result := cm.title; +end; + +procedure TFhirConceptMap5.setTitle(value: String); +begin + cm.title := value; +end; + function TFhirConceptMap5.getContext: String; begin result := cm.context; @@ -6175,6 +6348,16 @@ procedure TFHIRNamingSystem5.setPublisher(Value: String); nm.publisher := value; end; +function TFHIRNamingSystem5.getTitle: String; +begin + result := nm.title; +end; + +procedure TFHIRNamingSystem5.setTitle(value: String); +begin + nm.title := value; +end; + procedure TFHIRNamingSystem5.setStatus(Value: TPublicationStatus); begin nm.status := MAP_TPublicationStatus[value]; @@ -6569,6 +6752,16 @@ procedure TFhirTerminologyCapabilities5.setPublisher(Value: String); tc.publisher := value; end; +function TFhirTerminologyCapabilities5.getTitle: String; +begin + result := tc.title; +end; + +procedure TFhirTerminologyCapabilities5.setTitle(value: String); +begin + tc.title := value; +end; + procedure TFhirTerminologyCapabilities5.setStatus(Value: TPublicationStatus); begin @@ -6799,6 +6992,16 @@ procedure TFHIRTestScript5.setPublisher(Value: String); ts.publisher := value; end; +function TFHIRTestScript5.getTitle: String; +begin + result := ts.title; +end; + +procedure TFHIRTestScript5.setTitle(value: String); +begin + ts.title := value; +end; + procedure TFHIRTestScript5.setStatus(Value: TPublicationStatus); begin diff --git a/library/fhir5/fhir5_context.pas b/library/fhir5/fhir5_context.pas index b018f8976..aeda0f65b 100644 --- a/library/fhir5/fhir5_context.pas +++ b/library/fhir5/fhir5_context.pas @@ -57,8 +57,9 @@ TFHIRResourceProxy = class (TFHIRResourceProxyV) procedure SetFactory(AValue: TFHIRFactory); protected function wrapResource : TFHIRXVersionResourceWrapper; override; + procedure loadResource; override; public - constructor Create(factory : TFHIRFactory; resource : TFHIRResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; resource : TFHIRResource); overload; destructor Destroy; override; function link : TFHIRResourceProxy; overload; @@ -75,7 +76,7 @@ TNpmResourceProxy = class (TFHIRResourceProxy) protected procedure loadResource; override; public - constructor Create(factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; + constructor Create(packageId : String; factory : TFHIRFactory; lock: TFslLock; worker : TFHIRWorkerContextV; pi: TNpmPackageResource); overload; destructor Destroy; override; end; @@ -183,7 +184,7 @@ TResourceMemoryCache = class (TFslObject) function Link : TResourceMemoryCache; overload; property List : TFslList read FList; - procedure load(rType, id : String; stream : TStream); + procedure load(packageId : String; rType, id : String; stream : TStream); property Packages : TArray read FPackages write FPackages; property ResourceTypes : TArray read FResourceTypes write FResourceTypes; property OnLog : TWorkProgressEvent read FOnLog write FOnLog; @@ -198,12 +199,13 @@ implementation { TFHIRResourceProxy } -constructor TFHIRResourceProxy.Create(factory: TFHIRFactory; resource: TFHIRResource); +constructor TFHIRResourceProxy.Create(packageId : String; factory: TFHIRFactory; resource: TFHIRResource); begin + // inherited if resource is TFHIRCanonicalResource then - inherited Create(resource, TFHIRCanonicalResource(resource).url, TFHIRCanonicalResource(resource).version) + inherited Create(packageId, resource, TFHIRCanonicalResource(resource).url, TFHIRCanonicalResource(resource).version) else - inherited Create(resource, '', ''); + inherited Create(packageId, resource, '', ''); FFactory := factory; end; @@ -220,6 +222,11 @@ function TFHIRResourceProxy.link : TFHIRResourceProxy; result := TFHIRResourceProxy(inherited link); end; +procedure TFHIRResourceProxy.loadResource; +begin + raise EFslException.Create('Not Implemented Yet'); +end; + function TFHIRResourceProxy.GetResource: TFHIRResource; begin result := ResourceV as TFHIRResource; @@ -238,9 +245,9 @@ function TFHIRResourceProxy.wrapResource : TFHIRXVersionResourceWrapper; { TNpmResourceProxy } -constructor TNpmResourceProxy.Create(factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); +constructor TNpmResourceProxy.Create(packageId : String; factory: TFHIRFactory; lock: TFslLock; worker: TFHIRWorkerContextV; pi: TNpmPackageResource); begin - inherited Create(fhirVersionRelease5, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); + inherited Create(packageId, fhirVersionRelease5, pi.resourceType, pi.id, pi.url, pi.version, pi.supplements, pi.content, pi.valueSet); FFactory := factory; FWorker := worker; FInfo := pi; @@ -262,7 +269,7 @@ procedure TNpmResourceProxy.loadResource; if FInfo = nil then exit; // not lazy loading - FLock.lock; + FLock.lock('loadResource'); try if FResourceV <> nil then exit; @@ -273,7 +280,7 @@ procedure TNpmResourceProxy.loadResource; p := FFactory.makeParser(FWorker, ffJson, nil); try - stream := TFileStream.Create(FInfo.filename, fmOpenRead); + stream := TFileStream.Create(FInfo.filename, fmOpenRead + fmShareDenyWrite); try try r := p.parseResource(stream); @@ -378,7 +385,7 @@ procedure TFHIRWorkerContext.loadFromCache(cache: TResourceMemoryCache); begin cache.checkLoaded(pcm); for r in cache.List do - SeeResource(r); + SeeResource('', r); end; { TFHIRCustomResourceInformation } @@ -450,7 +457,7 @@ function TResourceMemoryCache.Link: TResourceMemoryCache; result := TResourceMemoryCache(inherited link); end; -procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); +procedure TResourceMemoryCache.load(packageId : String; rType, id: String; stream: TStream); var p : TFHIRJsonParser; begin @@ -458,6 +465,7 @@ procedure TResourceMemoryCache.load(rType, id: String; stream: TStream); try p.source := stream; p.Parse; + p.resource.SourcePackage := packageId; FList.add(p.resource.link as TFhirResource); finally p.free; diff --git a/library/fhir5/fhir5_factory.pas b/library/fhir5/fhir5_factory.pas index 247090488..64d40e9bf 100644 --- a/library/fhir5/fhir5_factory.pas +++ b/library/fhir5/fhir5_factory.pas @@ -37,7 +37,7 @@ interface uses SysUtils, Classes, System.NetEncoding, - fsl_base, fsl_utilities, fsl_stream, fsl_http, + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_i18n, fsl_ucum, fsl_npm, fsl_threads, fsl_web_stream, fhir_objects, fhir_parser, fhir_validator, fhir_narrative, fhir_factory, fhir_pathengine, fhir_xhtml, fhir_common, fhir_elementmodel, fhir_client, fhir_client_threaded, fhir_uris; @@ -71,8 +71,8 @@ TFHIRFactoryR5 = class (TFHIRFactory) function makeClientInt(worker : TFHIRWorkerContextV; langList : THTTPLanguageList; comm : TFHIRClientCommunicator) : TFhirClientV; overload; override; function makeHealthcareCard : THealthcareCard; override; - function makeProxy(pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; - function makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; override; + function makeProxy(packageId : String; pi : TNpmPackageResource; worker : TFHIRWorkerContextV; lock : TFslLock) : TFHIRResourceProxyV; override; + function makeProxy(packageId : string; resource : TFHIRResourceV) : TFHIRResourceProxyV; override; function getXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; function resetXhtml(res : TFHIRResourceV) : TFHIRXhtmlNode; override; @@ -85,6 +85,7 @@ TFHIRFactoryR5 = class (TFHIRFactory) procedure checkNoModifiers(res : TFHIRObject; method, param : string; allowed : TArray = nil); override; function buildOperationOutcome(langList : THTTPLanguageList; e : Exception; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; Function buildOperationOutcome(langList : THTTPLanguageList; message : String; issueCode : TFhirIssueType = itNull) : TFhirResourceV; overload; override; + function buildOperationOutcome(i18n : TI18nSupport; langList : THTTPLanguageList; exception : EFHIROperationException) : TFhirResourceV; overload; override; function makeByName(const name : String) : TFHIRObject; override; function makeBoolean(b : boolean): TFHIRObject; override; @@ -162,6 +163,34 @@ function TFHIRFactoryR5.buildOperationOutcome(langList : THTTPLanguageList; mess result := fhir5_utilities.BuildOperationOutcome(langList, message, ExceptionTypeTranslations[issueCode]); end; +function TFHIRFactoryR5.buildOperationOutcome(i18n: TI18nSupport; langList: THTTPLanguageList; exception: EFHIROperationException): TFhirResourceV; +var + op : TFHIROperationOutcome; + iss : TFHIROperationOutcomeIssue; +begin + op := TFHIROperationOutcome.create; + try + iss := TFHIROperationOutcomeIssue.create; + try + iss.severity := ISSUE_SEVERITY_MAP2[exception.level]; + iss.code := ExceptionTypeTranslations[exception.Cause]; + iss.expressionList.Add(exception.Path); + iss.details := TFHIRCodeableConcept.create; + iss.details.addCoding('http://hl7.org/fhir/tools/CodeSystem/tx-issue-type', '', CODES_TOpIssueCode[exception.Code], ''); + if (exception.MsgId <> '') then + iss.details.text := i18n.translate(exception.msgId, langlist, exception.Params) + else + iss.details.text := exception.message; + op.issueList.add(iss.link); + finally + iss.free; + end; + result := op.link; + finally + op.free; + end; +end; + function TFHIRFactoryR5.buildOperationOutcome(langList : THTTPLanguageList; e: Exception; issueCode: TFhirIssueType): TFhirResourceV; begin result := fhir5_utilities.BuildOperationOutcome(langList, e, ExceptionTypeTranslations[issueCode]); @@ -309,7 +338,7 @@ function TFHIRFactoryR5.makeCoding(system, version, code, display: String): TFHI if version <> '' then TFHIRCoding(result).version := version; if display <> '' then - TFHIRCoding(result).version := display; + TFHIRCoding(result).display := display; end; function TFHIRFactoryR5.makeCodeableConcept(coding: TFHIRCodingW): TFHIRObject; @@ -364,14 +393,14 @@ function TFHIRFactoryR5.makeHealthcareCard: THealthcareCard; raise EFslException.Create('Healthcare Cards are not supported in version '+versionString); end; -function TFHIRFactoryR5.makeProxy(pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; +function TFHIRFactoryR5.makeProxy(packageId : String; pi: TNpmPackageResource; worker : TFHIRWorkerContextV; lock: TFslLock): TFHIRResourceProxyV; begin - result := TNpmResourceProxy.Create(self.link, lock, worker, pi); + result := TNpmResourceProxy.Create(packageId, self.link, lock, worker, pi); end; -function TFHIRFactoryR5.makeProxy(resource : TFHIRResourceV) : TFHIRResourceProxyV; +function TFHIRFactoryR5.makeProxy(packageId : String; resource : TFHIRResourceV) : TFHIRResourceProxyV; begin - result := TFHIRResourceProxy.Create(self.link, resource as TFHIRResource); + result := TFHIRResourceProxy.Create(packageId, self.link, resource as TFHIRResource); end; function TFHIRFactoryR5.makeInteger(s: string): TFHIRObject; diff --git a/library/fhir5/fhir5_graphdefinition.pas b/library/fhir5/fhir5_graphdefinition.pas index c99f63a70..ea16250a1 100644 --- a/library/fhir5/fhir5_graphdefinition.pas +++ b/library/fhir5/fhir5_graphdefinition.pas @@ -57,12 +57,12 @@ TFHIRGraphDefinitionParser5 = class (TFHIRGraphDefinitionParser) procedure readLinkList(list : TFhirGraphDefinitionLinkList); function readDefinition : TFhirGraphDefinition; - procedure writeCompartment(b : TStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); - procedure writePathItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeSearchItem(b : TStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); - procedure writeLinklist(b : TStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); - procedure writeHeader(b : TStringBuilder; definition : TFhirGraphDefinition); - procedure writeDefinition(b : TStringBuilder; definition : TFhirGraphDefinition); + procedure writeCompartment(b : TFslStringBuilder; cr : TFhirGraphDefinitionLinkTargetCompartment); + procedure writePathItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeSearchItem(b : TFslStringBuilder; item : TFhirGraphDefinitionLink; indent : integer); + procedure writeLinklist(b : TFslStringBuilder; list : TFhirGraphDefinitionLinkList; indent : integer); + procedure writeHeader(b : TFslStringBuilder; definition : TFhirGraphDefinition); + procedure writeDefinition(b : TFslStringBuilder; definition : TFhirGraphDefinition); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -334,10 +334,10 @@ function TFHIRGraphDefinitionParser5.readSearchLink: TFhirGraphDefinitionLink; function TFHIRGraphDefinitionParser5.asString(definition: TFhirResourceV; header: boolean): String; var t : TFhirGraphDefinition; - b : TStringBuilder; + b : TFslStringBuilder; begin t := definition as TFhirGraphDefinition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if header then writeHeader(b, t); @@ -348,7 +348,7 @@ function TFHIRGraphDefinitionParser5.asString(definition: TFhirResourceV; header end; end; -procedure TFHIRGraphDefinitionParser5.writeCompartment(b: TStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); +procedure TFHIRGraphDefinitionParser5.writeCompartment(b: TFslStringBuilder; cr: TFhirGraphDefinitionLinkTargetCompartment); begin if cr.use = GraphCompartmentUseCondition then b.Append('where ') @@ -364,7 +364,7 @@ procedure TFHIRGraphDefinitionParser5.writeCompartment(b: TStringBuilder; cr: TF end; end; -procedure TFHIRGraphDefinitionParser5.writeDefinition(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser5.writeDefinition(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin b.Append(CODES_TFhirResourceTypesEnum[definition.start]); if definition.profile <> '' then @@ -376,12 +376,12 @@ procedure TFHIRGraphDefinitionParser5.writeDefinition(b: TStringBuilder; definit writeLinklist(b, definition.link_List, 2); end; -procedure TFHIRGraphDefinitionParser5.writeHeader(b: TStringBuilder; definition: TFhirGraphDefinition); +procedure TFHIRGraphDefinitionParser5.writeHeader(b: TFslStringBuilder; definition: TFhirGraphDefinition); begin end; -procedure TFHIRGraphDefinitionParser5.writeLinklist(b: TStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); +procedure TFHIRGraphDefinitionParser5.writeLinklist(b: TFslStringBuilder; list: TFhirGraphDefinitionLinkList; indent : integer); var i : integer; begin @@ -405,7 +405,7 @@ procedure TFHIRGraphDefinitionParser5.writeLinklist(b: TStringBuilder; list: TFh end; end; -procedure TFHIRGraphDefinitionParser5.writePathItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser5.writePathItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); var i : integer; cr : TFhirGraphDefinitionLinkTargetCompartment; @@ -462,7 +462,7 @@ procedure TFHIRGraphDefinitionParser5.writePathItem(b: TStringBuilder; item: TFh end; end; -procedure TFHIRGraphDefinitionParser5.writeSearchItem(b: TStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); +procedure TFHIRGraphDefinitionParser5.writeSearchItem(b: TFslStringBuilder; item: TFhirGraphDefinitionLink; indent: integer); begin b.Append('search '); b.Append(CODES_TFhirAllResourceTypesEnum[item.targetList[0].type_]); diff --git a/library/fhir5/fhir5_liquid.pas b/library/fhir5/fhir5_liquid.pas index cfecfe67d..c55d109d0 100644 --- a/library/fhir5/fhir5_liquid.pas +++ b/library/fhir5/fhir5_liquid.pas @@ -75,7 +75,7 @@ TFHIRLiquidEngineContext = class (TFslObject) TFHIRLiquidNode = class abstract (TFslObject) protected procedure closeUp(); virtual; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); virtual; abstract; public function link : TFHIRLiquidNode; overload; end; @@ -83,10 +83,10 @@ TFHIRLiquidNode = class abstract (TFslObject) TFHIRLiquidConstant = class (TFHIRLiquidNode) private FConstant : String; - b : TStringBuilder; + b : TFslStringBuilder; protected procedure closeUp; override; - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -101,7 +101,7 @@ TFHIRLiquidStatement = class (TFHIRLiquidNode) FStatement : String; FCompiled : TFHIRPathExpressionNode; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public destructor Destroy; override; @@ -118,7 +118,7 @@ TFHIRLiquidIf = class (TFHIRLiquidNode) FThenBody : TFSLList; FElseBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -138,7 +138,7 @@ TFHIRLiquidLoop = class (TFHIRLiquidNode) FCompiled : TFHIRPathExpressionNode; FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -156,7 +156,7 @@ TFHIRLiquidComment = class (TFHIRLiquidNode) private FBody : TFSLList; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -172,7 +172,7 @@ TFHIRLiquidInclude = class (TFHIRLiquidNode) FPage : String; FParams : TFslMap; protected - procedure evaluate(b : TStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; + procedure evaluate(b : TFslStringBuilder; resource : TFHIRResource; ctxt : TFHIRLiquidEngineContext); override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create; override; @@ -328,7 +328,7 @@ procedure TFHIRLiquidConstant.closeUp; constructor TFHIRLiquidConstant.Create; begin inherited; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; end; destructor TFHIRLiquidConstant.Destroy; @@ -337,7 +337,7 @@ destructor TFHIRLiquidConstant.Destroy; inherited; end; -procedure TFHIRLiquidConstant.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidConstant.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); begin b.append(FConstant); end; @@ -366,7 +366,7 @@ destructor TFHIRLiquidStatement.Destroy; inherited; end; -procedure TFHIRLiquidStatement.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidStatement.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -412,7 +412,7 @@ destructor TFHIRLiquidIf.Destroy; inherited; end; -procedure TFHIRLiquidIf.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidIf.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var ok : boolean; list : TFSLList; @@ -440,10 +440,10 @@ function TFHIRLiquidIf.link: TFHIRLiquidIf; function TFHIRLiquidIf.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% if '+condition+' %}'); for n in FThenBody do @@ -485,7 +485,7 @@ destructor TFHIRLiquidLoop.Destroy; inherited; end; -procedure TFHIRLiquidLoop.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidLoop.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var list : TFHIRSelectionList; n : TFHIRLiquidNode; @@ -516,10 +516,10 @@ function TFHIRLiquidLoop.link: TFHIRLiquidLoop; function TFHIRLiquidLoop.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% loop '+condition+' %}'); for n in FBody do @@ -561,10 +561,10 @@ function TFHIRLiquidDocument.link: TFHIRLiquidDocument; function TFHIRLiquidDocument.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for n in FBody do b.Append(n.ToString); @@ -779,12 +779,12 @@ function TFHIRLiquidParser.parseLoop(cnt: String): TFHIRLiquidNode; function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; var - b : TStringBuilder; + b : TFslStringBuilder; res : TFHIRLiquidStatement; begin grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '}') and (next2() = '}')) do b.append(grab()); @@ -807,12 +807,12 @@ function TFHIRLiquidParser.parseStatement(): TFHIRLiquidStatement; function TFHIRLiquidParser.parseTag(ch: char): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin FLast := FCurrent; grab(); grab(); - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try while (cursor <= source.length) and not ((next1() = '%') and(next2() = '}')) do b.append(grab()); @@ -876,11 +876,11 @@ destructor TFHIRLiquidEngine.Destroy; function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject; OnDebug: TFHIRLiquidEngineDebugEvent): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -901,11 +901,11 @@ function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFH function TFHIRLiquidEngine.evaluate(document: TFHIRLiquidDocument; resource: TFHIRResource; appContext: TFslObject): String; var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFHIRLiquidEngineContext; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try ctxt := TFHIRLiquidEngineContext.Create(nil, nil); try @@ -981,7 +981,7 @@ destructor TFHIRLiquidInclude.Destroy; inherited; end; -procedure TFHIRLiquidInclude.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidInclude.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var src : String; doc : TFHIRLiquidDocument; @@ -1019,10 +1019,10 @@ function TFHIRLiquidInclude.link: TFHIRLiquidInclude; function TFHIRLiquidInclude.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% include '+FPage+' %}'); for s in FParams.Keys do @@ -1055,7 +1055,7 @@ destructor TFHIRLiquidComment.Destroy; inherited; end; -procedure TFHIRLiquidComment.evaluate(b: TStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); +procedure TFHIRLiquidComment.evaluate(b: TFslStringBuilder; resource: TFHIRResource; ctxt: TFHIRLiquidEngineContext); var c : TFHIRLiquidEngineContext; begin @@ -1074,10 +1074,10 @@ function TFHIRLiquidComment.link: TFHIRLiquidComment; function TFHIRLiquidComment.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; n : TFHIRLiquidNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('{% comment %}'); for n in FBody do diff --git a/library/fhir5/fhir5_maputils.pas b/library/fhir5/fhir5_maputils.pas index 324aaac39..e8fdc67b1 100644 --- a/library/fhir5/fhir5_maputils.pas +++ b/library/fhir5/fhir5_maputils.pas @@ -167,16 +167,16 @@ TFHIRStructureMapUtilities = class (TFslObject) FServices : TTransformerServices; FFactory : TFHIRFactoryR5; FOnDebug: TFHIRStructureMapDebugEvent; - procedure renderContained(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderUses(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderImports(b : TStringBuilder; map : TFHIRStructureMap); - procedure renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); - procedure renderDoco(b : TStringBuilder; doco : String); - procedure RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); - procedure RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); - procedure renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); - procedure renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); - procedure renderConceptMap(b : TStringBuilder; map : TFHIRConceptMap); + procedure renderContained(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); + procedure renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); + procedure renderDoco(b : TFslStringBuilder; doco : String); + procedure RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); + procedure RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); + procedure renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); + procedure renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); + procedure renderConceptMap(b : TFslStringBuilder; map : TFHIRConceptMap); function getGroup(map : TFHIRConceptMap; source, target : String) : TFHIRConceptMapGroup; function fromEnum(s : String; codes : Array of String; lexer : TFHIRPathLexer) : integer; @@ -353,10 +353,10 @@ function TFHIRStructureMapUtilities.determineTypeFromSourceType(map: TFHIRStruct function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; var - b : TStringBuilder; + b : TFslStringBuilder; g : TFhirStructureMapGroup; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try b.append('map "'); b.append(map.Url); @@ -375,7 +375,7 @@ function TFHIRStructureMapUtilities.render(map : TFHIRStructureMap) : String; end; end; -procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderUses(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRStructureMapStructure; begin @@ -399,7 +399,7 @@ procedure TFHIRStructureMapUtilities.renderUses(b : TStringBuilder; map : TFHIRS b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderImports(b : TFslStringBuilder; map : TFHIRStructureMap); var s : TFHIRUri; begin @@ -413,7 +413,7 @@ procedure TFHIRStructureMapUtilities.renderImports(b : TStringBuilder; map : TFH b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.renderGroup(b : TStringBuilder; g : TFHIRStructureMapGroup); +procedure TFHIRStructureMapUtilities.renderGroup(b : TFslStringBuilder; g : TFHIRStructureMapGroup); var gi : TFHIRStructureMapGroupInput; r : TFHIRStructureMapGroupRule; @@ -483,7 +483,7 @@ function matchesname(n : string; source : TFhirStructureMapGroupRuleSourceList) end; end; -procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); +procedure TFHIRStructureMapUtilities.RenderRule(b : TFslStringBuilder; r : TFHIRStructureMapGroupRule; indent : integer); var first, ifirst : boolean; rs : TFHIRStructureMapGroupRuleSource; @@ -561,7 +561,7 @@ procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStr ifirst := false else b.append(', '); - b.append(rdp.value); + b.append(rdp.value.toString); end; b.append(')'); end; @@ -581,7 +581,7 @@ procedure TFHIRStructureMapUtilities.RenderRule(b : TStringBuilder; r : TFHIRStr b.append(#13#10); end; -procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.RenderSource(b : TFslStringBuilder; rs : TFHIRStructureMapGroupRuleSource; canbeAbbreviated : boolean); begin b.append(rs.Context); if (rs.context = '@search') then @@ -639,7 +639,7 @@ procedure TFHIRStructureMapUtilities.RenderSource(b : TStringBuilder; rs : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); +procedure TFHIRStructureMapUtilities.renderTarget(b : TFslStringBuilder; rt : TFHIRStructureMapGroupRuleTarget; canbeAbbreviated : boolean); var first : boolean; rtp : TFHIRStructureMapGroupRuleTargetParameter; @@ -704,7 +704,7 @@ procedure TFHIRStructureMapUtilities.renderTarget(b : TStringBuilder; rt : TFHIR end; end; -procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); +procedure TFHIRStructureMapUtilities.renderTransformParam(b : TFslStringBuilder; rtp : TFHIRStructureMapGroupRuleTargetParameter); begin if (rtp.Value is TFHIRBoolean) then b.append((rtp.Value as TFHIRBoolean).StringValue) @@ -726,9 +726,9 @@ procedure TFHIRStructureMapUtilities.renderTransformParam(b : TStringBuilder; rt function TFHIRStructureMapUtilities.render(map: TFHIRConceptMap): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try renderConceptMap(b, map); result := b.toString(); @@ -807,7 +807,7 @@ function TPrefixInformation.sizeInBytesV(magic : integer) : cardinal; inc(result, (FUrl.length * sizeof(char)) + 12); end; -procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TFHIRConceptMap); +procedure TFHIRStructureMapUtilities.renderConceptMap(b: TFslStringBuilder; map: TFHIRConceptMap); const CHARS_RELATIONSHIP : array [TFhirConceptMapRelationshipEnum] of string = ('??', '-', '=', '>', '<', '!='); var @@ -966,7 +966,7 @@ procedure TFHIRStructureMapUtilities.renderConceptMap(b: TStringBuilder; map: TF end; end; -procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFHIRStructureMap); +procedure TFHIRStructureMapUtilities.renderContained(b: TFslStringBuilder; map: TFHIRStructureMap); var r : TFHIRResource; begin @@ -975,7 +975,7 @@ procedure TFHIRStructureMapUtilities.renderContained(b: TStringBuilder; map: TFH renderConceptMap(b, r as TFhirConceptMap); end; -procedure TFHIRStructureMapUtilities.renderDoco(b : TStringBuilder; doco : String); +procedure TFHIRStructureMapUtilities.renderDoco(b : TFslStringBuilder; doco : String); begin if (doco <> '') then begin @@ -2174,7 +2174,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl b : TFHIRObject; types : TArray; uses_ : TFhirStructureMapStructure; - sb : TStringBuilder; + sb : TFslStringBuilder; cc : TFhirCodeableConcept; begin case tgt.Transform of @@ -2270,7 +2270,7 @@ function TFHIRStructureMapUtilities.runTransform(ruleId : String; appInfo : TFsl end; StructureMapTransformAPPEND : begin - sb := TStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); + sb := TFslStringBuilder.Create(getParamString(vars, tgt.parameterList[0])); try for i := 1 to tgt.parameterList.count - 1 do sb.append(getParamString(vars, tgt.parameterList[i])); diff --git a/library/fhir5/fhir5_narrative.pas b/library/fhir5/fhir5_narrative.pas index ec12a83a8..be6e0b048 100644 --- a/library/fhir5/fhir5_narrative.pas +++ b/library/fhir5/fhir5_narrative.pas @@ -1549,9 +1549,9 @@ procedure TFHIRNarrativeGenerator.renderCodeableConcept(cc: TFHIRCodeableConcept procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRXhtmlNode; showCodeDetails: boolean); var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (o.author <> nil) then begin @@ -1568,7 +1568,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Made: ').append(o.time.ToString); + s.append('Made: '); + s.append(o.time.ToString); end; if (o.Text <> '') then @@ -1576,7 +1577,8 @@ procedure TFHIRNarrativeGenerator.renderAnnotation(o: TFHIRAnnotation; x: TFHIRX if (s.length > 0) then s.append('; '); - s.append('Annontation: ').append(o.Text); + s.append('Annontation: '); + s.append(o.Text); end; x.addText(s.toString()); @@ -1794,9 +1796,9 @@ function TFHIRNarrativeGenerator.displaySampledData(sd: TFHIRSampledData): Strin function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append('(system := "'); @@ -1804,7 +1806,8 @@ function TFHIRNarrativeGenerator.displayQuantity(q: TFHIRQuantity): String; s.append('" code '); s.append(q.code); s.append(' := "'); - s.append(lookupCode(q.system, '', q.code)).append('")'); + s.append(lookupCode(q.system, '', q.code)); + s.append('")'); result := s.toString(); finally @@ -1941,10 +1944,10 @@ function TFHIRNarrativeGenerator.displayTimeUnits(units: TFHIRUnitsOfTimeEnum): function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (name.Text <> '') then s.append(name.Text) @@ -1971,10 +1974,10 @@ function TFHIRNarrativeGenerator.displayHumanName(name: TFHIRHumanName): String; function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; var - s: TStringBuilder; + s: TFslStringBuilder; p: TFHIRString; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try if (address.Text <> '') then s.append(address.Text) @@ -2018,9 +2021,9 @@ function TFHIRNarrativeGenerator.displayAddress(address: TFHIRAddress): String; function TFHIRNarrativeGenerator.displayContactPoint(contact: TFHIRContactPoint): String; var - s: TStringBuilder; + s: TFslStringBuilder; begin - s := TStringBuilder.Create(); + s := TFslStringBuilder.Create(); try s.append(describeSystem(contact.system)); if (contact.value = '') then @@ -2883,7 +2886,7 @@ function TFHIRNarrativeGenerator.getChildrenForPath(elements: TFHIRElementDefini private String makeAnchor(String codeSystem, String code) begin String s := codeSystem+"-"+code; - StringBuilder b := TStringBuilder.Create(); + StringBuilder b := TFslStringBuilder.Create(); for (char c : s.toCharArray()) begin if (Character.isAlphabetic(c)) or (Character.isDigit(c)) or (c = ".") then b.append(c); diff --git a/library/fhir5/fhir5_narrative2.pas b/library/fhir5/fhir5_narrative2.pas index a6a19b668..56be4cbdc 100644 --- a/library/fhir5/fhir5_narrative2.pas +++ b/library/fhir5/fhir5_narrative2.pas @@ -109,7 +109,7 @@ implementation function TNarrativeGenerator.capitalize(s : String):String; begin - if( s = '') then + if (s = '') then result := '' else result := UpperCase(s.substring(0, 1)) + s.substring(1); @@ -1002,10 +1002,10 @@ function TNarrativeGenerator.displaySchedule(v : TFHIRTiming) : String; function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) @@ -1033,10 +1033,10 @@ function TNarrativeGenerator.displayHumanName(v : TFHIRHumanName) : String; function TNarrativeGenerator.displayAddress(v : TFHIRAddress) : String; var - s : TStringBuilder; + s : TFslStringBuilder; i : integer; begin - s := TStringBuilder.Create; + s := TFslStringBuilder.Create; try if (v.Text <> '') then s.append(v.Text) diff --git a/library/fhir5/fhir5_operations.pas b/library/fhir5/fhir5_operations.pas index c092d1a4d..655d8d6c8 100644 --- a/library/fhir5/fhir5_operations.pas +++ b/library/fhir5/fhir5_operations.pas @@ -512,9 +512,12 @@ TFHIRLookupOpRespProperty_ = class (TFHIROperationObject) TFHIRLookupOpResponse = class (TFHIROperationResponse) private FName : String; + FCode : String; + FSystem : String; FVersion : String; FDisplay : String; - FDefinition : String; + FDefinition : String; + FAbstract : Boolean; FDesignationList : TFslList; FProperty_List : TFslList; protected @@ -527,8 +530,11 @@ TFHIRLookupOpResponse = class (TFHIROperationResponse) procedure load(params : THTTPParameters); overload; override; function asParams : TFHIRParameters; override; property name : String read FName write FName; + property code : String read FCode write FCode; + property systemUri : String read FSystem write FSystem; property version : String read FVersion write FVersion; - property display : String read FDisplay write FDisplay; + property display : String read FDisplay write FDisplay; + property abstract : Boolean read FAbstract write FAbstract; property definition : String read FDefinition write FDefinition; property designationList : TFslList read FDesignationList; property property_List : TFslList read FProperty_List; @@ -3382,6 +3388,7 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); var p : TFhirParametersParameter; begin + FAbstract := params.bool['abstract']; if params.param['name'] <> nil then FName := (params.param['name'].value as TFHIRString).Value; if params.param['version'] <> nil then @@ -3400,7 +3407,8 @@ procedure TFHIRLookupOpResponse.load(params : TFHIRParameters); end; procedure TFHIRLookupOpResponse.load(params : THTTPParameters); begin - loadExtensions(params); + loadExtensions(params); + FAbstract := StrToBoolDef(params['abstract'], false); end; destructor TFHIRLookupOpResponse.Destroy; begin @@ -3413,6 +3421,10 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters;var v1 : TFHIRLookupO try if (FName <> '') then result.addParameter('name', TFHIRString.Create(FName)); + if (FCode <> '') then + result.addParameter('code', TFHIRCode.Create(FCode)); + if (FSystem <> '') then + result.addParameter('system', TFHIRUri.Create(FSystem)); if (FVersion <> '') then result.addParameter('version', TFHIRString.Create(FVersion)); if (FDisplay <> '') then @@ -3423,6 +3435,7 @@ function TFHIRLookupOpResponse.asParams : TFhirParameters;var v1 : TFHIRLookupO result.AddParameter(v1.asParams('designation')); for v2 in FProperty_List do result.AddParameter(v2.asParams('property')); + result.addParameter('abstract', TFHIRBoolean.Create(FAbstract));{oz.5f} writeExtensions(result); result.link; finally diff --git a/library/fhir5/fhir5_pathengine.pas b/library/fhir5/fhir5_pathengine.pas index 8c31cbc4d..8397a376a 100644 --- a/library/fhir5/fhir5_pathengine.pas +++ b/library/fhir5/fhir5_pathengine.pas @@ -145,7 +145,7 @@ TFHIRPathLexer5 = class (TFHIRPathLexer) TFHIRPathEngine = class (TFHIRPathEngineV) private worker : TFHIRWorkerContext; - FLog : TStringBuilder; + FLog : TFslStringBuilder; primitiveTypes, allTypes : TStringList; FOnResolveConstant: TFHIRResolveConstantEvent; FUcum : TUcumServiceInterface; @@ -1125,7 +1125,7 @@ constructor TFHIRPathEngine.Create(context: TFHIRWorkerContext; ucum : TUcumServ inherited Create; worker := context; self.FUcum := ucum; - FLog := TStringBuilder.Create; + FLog := TFslStringBuilder.Create; allTypes := TStringList.Create; primitiveTypes := TStringList.Create; if (worker <> nil) then @@ -1250,11 +1250,11 @@ destructor TFHIRPathEngine.Destroy; function TFHIRPathEngine.convertToString(items: TFHIRSelectionList): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; item : TFHIRSelection; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for item in items do @@ -3647,7 +3647,7 @@ function TFHIRPathEngine.funcSplit(context: TFHIRPathExecutionContext; focus: TF var nl : TFHIRSelectionList; param, s : String; - p : TStringArray; + p : TArray; begin nl := execute(context, focus, exp.Parameters[0], true); try diff --git a/library/fhir5/fhir5_pathnode.pas b/library/fhir5/fhir5_pathnode.pas index f022508c3..b375c27de 100644 --- a/library/fhir5/fhir5_pathnode.pas +++ b/library/fhir5/fhir5_pathnode.pas @@ -186,7 +186,7 @@ TFHIRPathExpressionNode = class (TFHIRPathExpressionNodeV) procedure SetFunctionId(const Value: TFHIRPathFunction); procedure SetTypes(const Value: TFHIRTypeDetails); procedure SetOpTypes(const Value: TFHIRTypeDetails); - procedure write(b : TStringBuilder); + procedure write(b : TFslStringBuilder); procedure SetConstant(const Value: TFHIRObject); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -263,9 +263,9 @@ implementation function TFHIRPathExpressionNode.Canonical: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try write(b); result := b.ToString; @@ -500,11 +500,11 @@ function isToken(s : String) : boolean; function TFHIRPathExpressionNode.toString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; n : TFHIRPathExpressionNode; begin - b := TStringBuilder.Create(); + b := TFslStringBuilder.Create(); try case kind of enkName: @@ -512,7 +512,11 @@ function TFHIRPathExpressionNode.toString: String; if isToken(name) then b.append(name) else - b.append('"'+name+'"'); + begin + b.append('"'); + b.append(name); + b.append('"'); + end; end; enkFunction: begin @@ -589,7 +593,7 @@ procedure TFHIRPathExpressionNode.visitAll(context : pointer; proc: TFHIRPathExp end; {$ENDIF} -procedure TFHIRPathExpressionNode.write(b: TStringBuilder); +procedure TFHIRPathExpressionNode.write(b: TFslStringBuilder); var f : boolean; n : TFHIRPathExpressionNode; @@ -598,7 +602,7 @@ procedure TFHIRPathExpressionNode.write(b: TStringBuilder); enkName: b.Append(FName); enkConstant: - b.Append(FConstant); + b.Append(FConstant.toString); enkFunction: begin b.Append(CODES_TFHIRPathFunctions[FFunctionId]); diff --git a/library/fhir5/fhir5_profiles.pas b/library/fhir5/fhir5_profiles.pas index efd0f89f0..3a7f4529a 100644 --- a/library/fhir5/fhir5_profiles.pas +++ b/library/fhir5/fhir5_profiles.pas @@ -126,7 +126,7 @@ TBaseWorkerContextR5 = class abstract (TFHIRWorkerContext) FNamingSystems : TFslMap; procedure SetProfiles(const Value: TProfileManager); - procedure Load(feed: TFHIRBundle); + procedure Load(packageId : String; feed: TFHIRBundle); public constructor Create(factory : TFHIRFactory; pcm : TFHIRPackageManager); Override; destructor Destroy; Override; @@ -135,9 +135,11 @@ TBaseWorkerContextR5 = class abstract (TFHIRWorkerContext) property Profiles : TProfileManager read FProfiles; procedure seeResourceProxy(r : TFhirResourceProxy); overload; virtual; - procedure seeResource(res : TFHIRResourceV); overload; override; + procedure seeResource(packageId : String; res : TFHIRResourceV); overload; override; procedure seeResource(res : TFHIRResourceProxyV); overload; override; procedure dropResource(rtype, id : string); override; + procedure LoadCodeSystem(r : TFhirResourceProxyV); overload; override; + procedure LoadCodeSystem(r : TFhirResourceProxy); overload; virtual; procedure LoadFromDefinitions(filename : string); procedure LoadFromFolder(folder : string); procedure LoadFromFile(filename : string); overload; @@ -652,11 +654,11 @@ destructor TProfileUtilities.Destroy; // //function TProfileUtilities.summariseSlicing(slice : TFhirElementDefinitionSlicing) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // d : TFhirElementDefinitionSlicingDiscriminator; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for d in slice.discriminatorList do @@ -901,11 +903,11 @@ function TProfileUtilities.populateByProfile(profile: TFHIRStructureDefinition): // //function TProfileUtilities.typeCode(types : TFhirElementDefinitionTypeList) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; // first : boolean; // type_ : TFHIRElementDefinitionType; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // first := true; // for type_ in types do @@ -1532,7 +1534,7 @@ function TBaseWorkerContextR5.allResourceNames: TArray; i : integer; s : string; begin - FLock.Lock; + FLock.Lock('allResourceNames'); try SetLength(result, length(ALL_RESOURCE_TYPE_NAMES) - 1 + FCustomResources.Count); for a := low(TFHIRResourceType) to high(TFHIRResourceType) do @@ -1581,6 +1583,16 @@ procedure TBaseWorkerContextR5.dropResource(rtype, id: string); Profiles.DropProfile(frtStructureDefinition, id); end; +procedure TBaseWorkerContextR5.LoadCodeSystem(r: TFhirResourceProxyV); +begin + loadCodeSystem(r as TFHIRResourceProxy); +end; + +procedure TBaseWorkerContextR5.LoadCodeSystem(r: TFhirResourceProxy); +begin + // nothing +end; + function TBaseWorkerContextR5.fetchResource(t: TFhirResourceType; url, version: String): TFhirResource; var r : TFHIRResourceProxy; @@ -1627,7 +1639,7 @@ function TBaseWorkerContextR5.getChildMap(profile: TFHIRStructureDefinition; ele function TBaseWorkerContextR5.getCustomResource(name: String): TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('getCustomResource'); try if FCustomResources.TryGetValue(name, result) then result.Link @@ -1697,7 +1709,7 @@ function TBaseWorkerContextR5.getStructure(ns, name: String): TFHIRStructureDefi function TBaseWorkerContextR5.hasCustomResource(name: String): boolean; begin - FLock.Lock; + FLock.Lock('hasCustomResource'); try result := FCustomResources.ContainsKey(name); finally @@ -1709,7 +1721,7 @@ function TBaseWorkerContextR5.hasCustomResourceDefinition(sd: TFHIRStructureDefi var cr : TFHIRCustomResourceInformation; begin - FLock.Lock; + FLock.Lock('hasCustomResourceDefinition'); try result := false; for cr in FCustomResources.Values do @@ -1785,9 +1797,9 @@ procedure TBaseWorkerContextR5.LoadFromDefinitions(filename: string); fp.source := vcl; fp.Parse; if fp.resource is TFhirBundle then - Load(fp.resource as TFhirBundle) + Load(filename, fp.resource as TFhirBundle) else - SeeResource(fp.resource as TFHIRResource); + SeeResource(filename, fp.resource as TFHIRResource); finally fp.free; end; @@ -1823,10 +1835,10 @@ procedure TBaseWorkerContextR5.LoadFromFile(filename: string; parser : TFHIRPars if parser.resource is TFhirBundle then begin for be in TFhirBundle(parser.resource).entryList do - SeeResource(be.resource) + SeeResource(filename, be.resource) end else - SeeResource(parser.resource as TFHIRResource); + SeeResource(filename, parser.resource as TFHIRResource); finally fn.free; end; @@ -1864,7 +1876,7 @@ function TBaseWorkerContextR5.nonSecureResourceNames: TArray; procedure TBaseWorkerContextR5.registerCustomResource(cr: TFHIRCustomResourceInformation); begin - FLock.Lock; + FLock.Lock('registerCustomResource'); try FCustomResources.Add(cr.name, cr.Link); finally @@ -1877,11 +1889,11 @@ procedure TBaseWorkerContextR5.seeResource(res : TFHIRResourceProxyV); seeResourceProxy(res as TFHIRResourceProxy) end; -procedure TBaseWorkerContextR5.seeResource(res: TFHIRResourceV); +procedure TBaseWorkerContextR5.seeResource(packageId : String; res: TFHIRResourceV); var proxy : TNpmResourceProxy; begin - proxy := TNpmResourceProxy.Create(factory.link, res.link as TFHIRResource); + proxy := TNpmResourceProxy.Create(packageId, factory.link, res.link as TFHIRResource); try SeeResourceProxy(proxy); finally @@ -1889,7 +1901,7 @@ procedure TBaseWorkerContextR5.seeResource(res: TFHIRResourceV); end; end; -procedure TBaseWorkerContextR5.Load(feed: TFHIRBundle); +procedure TBaseWorkerContextR5.Load(packageId : String; feed: TFHIRBundle); var i : integer; r : TFhirResource; @@ -1897,7 +1909,7 @@ procedure TBaseWorkerContextR5.Load(feed: TFHIRBundle); for i := 0 to feed.entryList.count - 1 do begin r := feed.entryList[i].resource; - SeeResource(r); + SeeResource(packageId, r); end; end; @@ -1924,7 +1936,7 @@ procedure TBaseWorkerContextR5.setNonSecureTypes(names: array of String); var i : integer; begin - FLock.Lock; + FLock.Lock('setNonSecureTypes'); try SetLength(FNonSecureNames, length(names)); for i := 0 to length(names)-1 do @@ -2097,7 +2109,7 @@ function TProfileManager.getProfileStructure(source: TFHirStructureDefinition; u else begin StringSplit(url, '#', id, code); - lock.Lock; + lock.Lock('getProfileStructure'); try profile := FProfilesByURL[id].Link; finally @@ -2122,7 +2134,7 @@ function TProfileManager.Link: TProfileManager; procedure TProfileManager.Unload; begin - lock.Lock; + lock.Lock('Unload'); try FProfilesById.Clear; FProfilesByURL.Clear; diff --git a/library/fhir5/fhir5_types.pas b/library/fhir5/fhir5_types.pas index 7431499c5..ec8369178 100644 --- a/library/fhir5/fhir5_types.pas +++ b/library/fhir5/fhir5_types.pas @@ -9939,7 +9939,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FextensionList.Count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String; diff --git a/library/fhir5/fhir5_utilities.pas b/library/fhir5/fhir5_utilities.pas index fd87f66da..bb7ee41e3 100644 --- a/library/fhir5/fhir5_utilities.pas +++ b/library/fhir5/fhir5_utilities.pas @@ -2111,10 +2111,10 @@ function getConformanceResourceUrl(res : TFHIRResource) : string; function TFHIROperationOutcomeHelper.asExceptionMessage: String; var - b : TStringBuilder; + b : TFslStringBuilder; issue : TFhirOperationOutcomeIssue; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for issue in issueList do begin @@ -3101,9 +3101,9 @@ procedure TFHIRResourceHelper.SetmlId(const Value: String); function patSummary(pat : TFHIRPatient) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(HumanNamesAsText(pat.nameList)); b.Append(' '); @@ -3118,9 +3118,9 @@ function patSummary(pat : TFHIRPatient) : string; function groupSummary(grp : TFHIRGroup) : string; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(grp.name); if (grp.code <> nil) then @@ -3206,7 +3206,7 @@ function TFHIRBundleHelper.findResource(ref: TFHIRReference): TFhirResource; function TFHIRBundleHelper.generatePresentation: String; var - b : TStringBuilder; + b : TFslStringBuilder; procedure addNarrative(br : boolean; n : TFhirNarrative); begin if br then @@ -3231,25 +3231,23 @@ function TFHIRBundleHelper.generatePresentation: String; if type_ = BundleTypeDocument then begin cmp := entryList[0].resource as TFhirComposition; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try // header - b.append( - ''+#13#10+ - ''+#13#10+ - ' '+#13#10+ - ' '+cmp.title+''+#13#10+ - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); + b.appendLine(' '); + b.appendLine(' '+cmp.title+''); + b.appendLine(''); + b.appendLine(''); sbj := findResource(cmp.subjectList[0]) as TFhirDomainResource; addNarrative(false, sbj.text); addNarrative(true, cmp.text); for section in cmp.sectionList do processSection(section); // foooter - b.append( - ''+#13#10+ - ''+#13#10); + b.appendLine(''); + b.appendLine(''); result := b.tostring; finally @@ -4342,12 +4340,12 @@ function TFHIRStringListHelper.hasValue(value: String): boolean; function TFHIRStringListHelper.summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; v : TFHIRString; begin f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for v in self do begin @@ -5197,13 +5195,27 @@ function TFhirCodeSystemHelper.GetSystem: String; function TFhirCodeSystemHelper.isAbstract(concept: TFhirCodeSystemConcept): boolean; var p : TFhirCodeSystemConceptProperty; + pd : TFhirCodeSystemProperty; + c, s : String; begin result := false; for p in concept.property_List do + begin if (p.code = 'abstract') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then - exit(true); + exit(true); + end; + s := csUriForProperty('notSelectable'); + c := 'notSelectable'; + if (s <> '') then + for pd in property_List do + if pd.uri = s then + begin + c := pd.code; + break; + end; + for p in concept.property_List do - if (p.code = 'notSelectable') and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then + if (p.code = c) and (p.value is TFhirBoolean) and (TFHIRBoolean(p.value).value) then exit(true); end; @@ -5848,11 +5860,11 @@ function TFhirIdentifierListHelper.withCommas: String; function makeFileName(s : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ws : boolean; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ws := true; for ch in s do @@ -7070,5 +7082,6 @@ function TFHIRPractitionerRoleHelper.summary: String; result := '??'; end; + end. diff --git a/library/fhir5/fhir5_validator.pas b/library/fhir5/fhir5_validator.pas index 58c0c4fdd..e565fa519 100644 --- a/library/fhir5/fhir5_validator.pas +++ b/library/fhir5/fhir5_validator.pas @@ -462,10 +462,10 @@ function TNodeStack.push(element: TFHIRMMElement; count: integer; definition: TF function TNodeStack.addToLiteralPath(path: Array of String): String; var - b: TStringBuilder; + b: TFslStringBuilder; p: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(literalPath); for p in path do diff --git a/library/fhir5/tests/fhir5_tests_liquid.pas b/library/fhir5/tests/fhir5_tests_liquid.pas index b9ecc7a54..07fa0d7e0 100644 --- a/library/fhir5/tests/fhir5_tests_liquid.pas +++ b/library/fhir5/tests/fhir5_tests_liquid.pas @@ -126,7 +126,7 @@ function TLiquidEngineTest.loadResource : TFhirResource; fn := FHIR_PUB_FILE(test.str['focus'].replace('/', '-')+'.xml'); p := TFHIRXmlParser.Create(TTestingWorkerContext.Use, nil); try - f := TFileStream.Create(fn, fmOpenRead); + f := TFileStream.Create(fn, fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fhir5/tests/fhir5_tests_pathengine.pas b/library/fhir5/tests/fhir5_tests_pathengine.pas index 1dd41103c..88b0417ad 100644 --- a/library/fhir5/tests/fhir5_tests_pathengine.pas +++ b/library/fhir5/tests/fhir5_tests_pathengine.pas @@ -183,7 +183,7 @@ procedure TFHIRPathTests.FHIRPathTest(Name: String); begin p := TFHIRXmlParser.Create(TTestingWorkerContext.Use, nil); try - f := TFileStream.Create(FHIR_PUB_FILE(input), fmOpenRead); + f := TFileStream.Create(FHIR_PUB_FILE(input), fmOpenRead + fmShareDenyWrite); try p.source := f; p.parse; diff --git a/library/fsl/fsl_base.pas b/library/fsl/fsl_base.pas index 1b76042d5..c4c88005b 100644 --- a/library/fsl/fsl_base.pas +++ b/library/fsl/fsl_base.pas @@ -44,11 +44,9 @@ interface {$ENDIF} EMPTY_HASH = -1; -{.$.DEFINE TRACK_CLASSES } - -{$IFDEF TRACK_CLASSES} +{$IFDEF OBJECT_TRACKING} const - CLASS_NAME_OF_INTEREST = 'TFhirString'; + CLASS_NAME_OF_INTEREST = '!TFhirString'; ID_OF_INTEREST = -1; {$ENDIF} @@ -56,10 +54,12 @@ interface var UnderDebugger : boolean = false; // this doesn't automatically detect whether debugging; you have to set this through a command line parameter SuppressLeakDialog : boolean = false; + BuildDescription : String; threadvar gExceptionStack : String; gException : Exception; + GThreadDoingConstruction : boolean; var DebugConsoleMessages : boolean = false; @@ -95,6 +95,7 @@ function ExceptionStack(e : Exception) : String; // particular subclasses EFslAbstract = Class(EFslException); EFslAssertion = Class(EFslException); + EObjectTrackingFail = class (EFslAssertion); ETodo = Class(EFslException) public Constructor Create(place : String); @@ -168,24 +169,19 @@ EJsonException = class (EFslException); // error reading or writing Json // Reference counted using Interlocked* Windows API functions. FFslObjectReferenceCount : TFslReferenceCount; FTagObject : TObject; - FOwningThread : TThreadId; - FMagic : integer; - {$IFDEF TRACK_CLASSES} - FNamedInstance : string; - {$ENDIF} - {$IFOPT D+} - // This is a workaround for the delphi debugger not showing the actual class of an object that is polymorphic + FMagic : integer; // used to stop recursion measuring object size. + {$IFDEF OBJECT_TRACKING} + // FNamedClass is a workaround for the delphi debugger not showing the actual class of an object that is polymorphic // It's sole purpose is to be visible in the debugger. No other functionality should depend on it + // same for FDebugInfo FNamedClass : TNameString; FDebugInfo : String; - {$ENDIF} - {$IFDEF OBJECT_TRACKING} FSerial : integer; FNext, FPrev : TFslObject; // same class type FThreadName : String; + FNamedInstance : string; {$ENDIF} - function ObjectCrossesThreads : boolean; function dumpSummary : String; function updatedDebugInfo : String; Protected @@ -213,7 +209,7 @@ EJsonException = class (EFslException); // error reading or writing Json Function ErrorClass : EFslExceptionClass; Overload; Virtual; function sizeInBytesV(magic : integer) : cardinal; virtual; - {$IFDEF TRACK_CLASSES} + {$IFDEF OBJECT_TRACKING} procedure freeNotification(done : boolean); virtual; {$ENDIF} Public @@ -243,13 +239,9 @@ EJsonException = class (EFslException); // error reading or writing Json Property FslObjectReferenceCount : TFslReferenceCount Read FFslObjectReferenceCount; property TagObject : TObject read FTagObject write FTagObject; // no ownership.... - {$IFDEF TRACK_CLASSES} + {$IFDEF OBJECT_TRACKING} property NamedInstance : string read FNamedInstance write FNamedInstance; - {$ENDIF} - {$IFOPT D+} property NamedClass : TNameString read FNamedClass; - {$ENDIF} - {$IFDEF OBJECT_TRACKING} property SerialNumber : integer read FSerial; {$ENDIF} function debugInfo : String; virtual; // what's visible to the debugger @@ -385,6 +377,7 @@ TDefaultComparer = class (TFslComparer) {$ENDIF NEXTGEN} function Add(const Value: T): Integer; + function addIfNotNull(const Value: T): Integer; procedure AddRange(const Values: array of T); overload; procedure AddRange(const Collection: IEnumerable); overload; @@ -506,7 +499,6 @@ TItem = record TItemArray = array of TItem; private FFslObjectReferenceCount : TFslReferenceCount; - FOwningThread : TThreadId; FItems: TItemArray; FCount: Integer; FGrowThreshold: Integer; @@ -529,7 +521,6 @@ TItem = record procedure DoSetValue(Index: Integer; const Value: T); function DoRemove(const Key: String; HashCode: Integer; Notification: TCollectionNotification): T; function InCircularRange(Bottom, Item, TopInc: Integer): Boolean; - function ObjectCrossesThreads : boolean; private function GetEmpty: Boolean; private @@ -673,11 +664,9 @@ TKeyCollection = class(TEnumerable) TFslStringDictionary = class (TDictionary) private FFslObjectReferenceCount : TFslReferenceCount; - FOwningThread : TThreadId; FMagic : integer; function GetValue(const Key: String): String; procedure SetValue(const Key, Value: String); - function ObjectCrossesThreads : boolean; public // Cannot be virtual as they are allowed to be called from Nil or invalid objects (but will assert). constructor Create; @@ -787,7 +776,12 @@ procedure initUnit; InitializeCriticalSection(GLock); GClassTracker := TDictionary.Create; GInited := true; - ShowObjectLeaks := true; + ShowObjectLeaks := true; + {$IFDEF PRODUCTION} + BuildDescription := 'Production Build'; + {$ELSE} + BuildDescription := 'Development Build'; + {$ENDIF} end; end; @@ -1012,24 +1006,46 @@ procedure TClassTrackingType.check(msg: String; condition: boolean); Message := Description; End; +procedure handleObjectTrackingFail(msg : String); +var + fn : String; + f : System.text; +begin + // Application is pretty much cactus at this point, so we don't mind doing + // a slow file operation inside such a system critical lock as GLock + + try + fn := 'c:\temp\object-tracking-errors.log'; + AssignFile(f, fn); + if (FileExists(fn)) then + Append(f) + else + Rewrite(f); + writeln(f, msg); + closeFile(f); + except + // nothing - we really can't do anything + end; + + raise EObjectTrackingFail.create(msg); +end; + { TFslObject } constructor TFslObject.Create; var t : TClassTrackingType; + {$IFOPT C+} + isNil : boolean; + {$ENDIF} Begin Inherited; - {$IFOPT D+} - FNamedClass := copy(ClassName, 1, 16); - {$ENDIF} - FOwningThread := GetCurrentThreadId; - {$IFDEF TRACK_CLASSES} + {$IFDEF OBJECT_TRACKING} if (className = CLASS_NAME_OF_INTEREST) then freeNotification(false); - {$ENDIF} - {$IFDEF OBJECT_TRACKING} + FNamedClass := copy(ClassName, 1, 16); if not GInited then initUnit; if Assigned(GetThreadNameStatusDelegate) then @@ -1041,17 +1057,22 @@ constructor TFslObject.Create; t := TClassTrackingType.Create; GClassTracker.Add(ClassName, t); end; + {$IFOPT C+} + isNil := t.firstObject = nil; + if not (isNil = (t.count = 0)) then + handleObjectTrackingFail(className+': firstObject = '+BoolToStr(isNil{$IFDEF FPC}, 'Nil', 'not nil'{$ENDIF})+' and count = '+inttostr(t.count)+' (create)'); + {$ENDIF} + inc(t.count); inc(t.deltaCount); inc(t.serial); FSerial := t.serial; - {$IFDEF TRACK_CLASSES} + {$IFDEF OBJECT_TRACKING} if (t.serial = ID_OF_INTEREST) and (className = CLASS_NAME_OF_INTEREST) then NamedInstance := '!'; {$ENDIF} if t.firstObject = nil then begin - assert(t.count = 1); t.firstObject := self; t.lastObject := self; FPrev := nil; @@ -1072,7 +1093,10 @@ constructor TFslObject.Create; destructor TFslObject.Destroy; var - t : TClassTrackingType; + t : TClassTrackingType; + {$IFOPT C+} + isNil : boolean; + {$ENDIF} Begin {$IFDEF OBJECT_TRACKING} if GInited then @@ -1080,9 +1104,17 @@ destructor TFslObject.Destroy; EnterCriticalSection(GLock); try if GClassTracker.TryGetValue(ClassName, t) then // this will succeed - begin + begin + {$IFOPT C+} + if (t.count = 0) then + handleObjectTrackingFail(className+': count is 0 freeing object'); + if (FPrev <> nil) and (FPrev.ClassName <> className) then + handleObjectTrackingFail(className+': Previous object wrong class: '+FPrev.ClassName); + if (FNext <> nil) and (FNext.ClassName <> className) then + handleObjectTrackingFail(className+': Next object wrong class: '+FNext.ClassName); + {$ENDIF} + dec(t.Count); - assert(t.count >= 0); dec(t.deltaCount); if FPrev = nil then begin @@ -1109,7 +1141,19 @@ destructor TFslObject.Destroy; self.FPrev.FNext := self.FNext; self.FNext.FPrev := self.FPrev; end; + end + else + begin + {$IFOPT C+} + handleObjectTrackingFail(ClassName+': tracking record not found in destroy'); + {$ENDIF} end; + + {$IFOPT C+} + isNil := t.firstObject = nil; + if not (isNil = (t.count = 0)) then + handleObjectTrackingFail(className+': firstObject = '+BoolToStr(isNil{$IFDEF FPC}, 'Nil', 'not nil'{$ENDIF})+' and count = '+inttostr(t.count)+' (destroy)'); + {$ENDIF} finally LeaveCriticalSection(GLock); end; @@ -1151,7 +1195,9 @@ procedure TFslObject.Free; clsName := 'n/a'; nmCls := 'n/a'; try + {$IFDEF OBJECT_TRACKING} nmCls := FNamedClass; + {$ENDIF} except nmCls := '??'; end; @@ -1170,14 +1216,14 @@ clsName := className; Assert(Invariants('Free', TFslObject)); - if ObjectCrossesThreads then - done := (InterlockedDecrement(FFslObjectReferenceCount) < 0) - else + if GThreadDoingConstruction then begin - dec(FFslObjectReferenceCount); + Dec(FFslObjectReferenceCount); done := FFslObjectReferenceCount < 0; - end; - {$IFDEF TRACK_CLASSES} + end + else + done := (InterlockedDecrement(FFslObjectReferenceCount) < 0); + {$IFDEF OBJECT_TRACKING} if (classname = CLASS_NAME_OF_INTEREST) then self.freeNotification(done); {$ENDIF} @@ -1266,13 +1312,13 @@ function TFslObject.Unlink: TFslObject; Begin Assert(Invariants('Unlink', TFslObject)); - if ObjectCrossesThreads then - done := (InterlockedDecrement(FFslObjectReferenceCount) < 0) - else + if (GThreadDoingConstruction) then begin - dec(FFslObjectReferenceCount); - done := FFslObjectReferenceCount < 0; - end; + Dec(FFslObjectReferenceCount); + done := FFslObjectReferenceCount < 0 + end + else + done := (InterlockedDecrement(FFslObjectReferenceCount) < 0); If done Then Begin Destroy; @@ -1289,12 +1335,11 @@ function TFslObject.Link: TFslObject; If Assigned(Self) Then Begin Assert(Invariants('Link', TFslObject)); - - if ObjectCrossesThreads then - InterlockedIncrement(FFslObjectReferenceCount) + if (GThreadDoingConstruction) then + inc(FFslObjectReferenceCount) else - inc(FFslObjectReferenceCount); - {$IFDEF TRACK_CLASSES} + InterlockedIncrement(FFslObjectReferenceCount); + {$IFDEF OBJECT_TRACKING} if self.classname = CLASS_NAME_OF_INTEREST then freeNotification(false); {$ENDIF} @@ -1335,8 +1380,10 @@ function TFslObject._AddRef: Integer; Stdcall; Begin Assert(Invariants('_AddRef', TFslObject)); - FOwningThread := NULL_THREAD; - Result := InterlockedIncrement(FFslObjectReferenceCount); + if (GThreadDoingConstruction) then + inc(FFslObjectReferenceCount) + else + Result := InterlockedIncrement(FFslObjectReferenceCount); End Else Begin @@ -1350,8 +1397,13 @@ function TFslObject._Release: Integer; Stdcall; Begin Assert(Invariants('_Release', TFslObject)); - FOwningThread := NULL_THREAD; - Result := InterlockedDecrement(FFslObjectReferenceCount); + if GThreadDoingConstruction then + begin + Dec(FFslObjectReferenceCount); + Result := FFslObjectReferenceCount + end + else + Result := InterlockedDecrement(FFslObjectReferenceCount); If Result < 0 Then Destroy; @@ -1467,40 +1519,24 @@ function TFslObject.debugInfo: String; procedure TFslObject.updateDebugInfo; begin + {$IFDEF OBJECT_TRACKING} FDebugInfo := debugInfo; -end; - -function TFslObject.ObjectCrossesThreads: boolean; -var - t : TThreadID; -begin - if FOwningThread = NULL_THREAD then - result := true - else - begin - t := GetCurrentThreadId; - result := t <> FOwningThread; - if result then - FOwningThread := NULL_THREAD; - end; + {$ENDIF} end; function TFslObject.dumpSummary: String; begin result := inttostr(FFslObjectReferenceCount+1); - {$IFDEF TRACK_CLASSES} + {$IFDEF OBJECT_TRACKING} if FNamedInstance <> '' then result := result + FNamedInstance - {$ELSE} - if false then - {$ENDIF} - {$IFDEF OBJECT_TRACKING} else if (updatedDebugInfo <> '?') then result := result +'(^'+FDebugInfo+')' else if (FSerial > 0) then result := result +'(#'+inttostr(FSerial)+')' + else {$ENDIF} - else if FMagic <> 0 then + if FMagic <> 0 then result := result +'($'+inttostr(FMagic)+')'; end; @@ -1510,7 +1546,7 @@ function TFslObject.updatedDebugInfo: String; updateDebugInfo; except end; - result := FDebugInfo; + result := {$IFDEF OBJECT_TRACKING}FDebugInfo{$ELSE}''{$ENDIF}; end; function TFslObject.CheckCondition(bCorrect: Boolean; const sMethod, sMessage: String): Boolean; @@ -1592,15 +1628,13 @@ function TFslObject.sizeInBytes(magic : integer) : cardinal; function TFslObject.sizeInBytesV(magic : integer) : cardinal; begin result := sizeof(self); - {$IFOPT D+} - inc(result, (length(FNamedClass))+2); - {$ENDIF} {$IFDEF OBJECT_TRACKING} + inc(result, (length(FNamedClass))+2); inc(result, length(FThreadName)+12); {$ENDIF} end; -{$IFDEF TRACK_CLASSES} +{$IFDEF OBJECT_TRACKING} procedure noop(done : boolean); begin // nothing; @@ -1947,6 +1981,14 @@ function TFslList.Add(const Value: T): Integer; NotifyChange(Value, cnAdded); end; +function TFslList.addIfNotNull(const Value: T): Integer; +begin + if value = nil then + result := -1 + else + result := add(value); +end; + procedure TFslList.AddRange(const Values: array of T); begin InsertRange(Count, Values); @@ -2079,7 +2121,7 @@ function TFslList.First: T; Result := Items[0]; end; -function TFslList.forEnum: TFslList; +function TFslList.forEnum: TFslList; begin FEnumFree := true; result := self; @@ -2686,7 +2728,7 @@ function TFslMap.Link: TFslMap; Result := Self; If Assigned(Self) Then - if ObjectCrossesThreads then + if not GThreadDoingConstruction then InterlockedIncrement(FFslObjectReferenceCount) else inc(FFslObjectReferenceCount); @@ -2700,21 +2742,6 @@ procedure TFslMap.listAll(other: TFslList); other.Add(T(TFslObject(item).link)); end; -function TFslMap.ObjectCrossesThreads: boolean; -var - t : TThreadID; -begin - if FOwningThread = NULL_THREAD then - result := true - else - begin - t := GetCurrentThreadId; - result := t <> FOwningThread; - if result then - FOwningThread := NULL_THREAD; - end; -end; - procedure TFslMap.ValueNotify(const Value: T; Action: TCollectionNotification); begin if Assigned(FOnValueNotify) then @@ -2724,7 +2751,6 @@ procedure TFslMap.ValueNotify(const Value: T; Action: TCollectionNotification constructor TFslMap.Create(name : String = ''; ACapacity: Integer = 0); begin inherited Create; - FOwningThread := GetCurrentThreadId; FName := name; if ACapacity < 0 then raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange); @@ -2960,7 +2986,7 @@ procedure TFslMap.free; if FFslObjectReferenceCount = -1 then raise EFslException.Create('Attempt to free a class a second time (of type '+className+'?)'); - if ObjectCrossesThreads then + if not GThreadDoingConstruction then done := (InterlockedDecrement(FFslObjectReferenceCount) < 0) else begin @@ -3263,7 +3289,6 @@ function TFslMap.TKeyCollection.ToArray: TArray; constructor TFslStringDictionary.Create; begin inherited Create; - FOwningThread := GetCurrentThreadId; end; procedure TFslStringDictionary.free; @@ -3275,7 +3300,7 @@ procedure TFslStringDictionary.free; if FFslObjectReferenceCount = -1 then raise EFslException.Create('Attempt to free a class a second time (of type '+className+'?)'); - if ObjectCrossesThreads then + if not GThreadDoingConstruction then done := (InterlockedDecrement(FFslObjectReferenceCount) < 0) else begin @@ -3297,27 +3322,12 @@ function TFslStringDictionary.Link: TFslStringDictionary; begin Result := Self; If Assigned(Self) Then - if ObjectCrossesThreads then + if not GThreadDoingConstruction then InterlockedIncrement(FFslObjectReferenceCount) else inc(FFslObjectReferenceCount); end; -function TFslStringDictionary.ObjectCrossesThreads: boolean; -var - t : TThreadID; -begin - if FOwningThread = NULL_THREAD then - result := true - else - begin - t := GetCurrentThreadId; - result := t <> FOwningThread; - if result then - FOwningThread := NULL_THREAD; - end; -end; - procedure TFslStringDictionary.SetValue(const Key, Value: String); begin Items[key] := value; diff --git a/library/fsl/fsl_collections.pas b/library/fsl/fsl_collections.pas index b31b979fb..bda743701 100644 --- a/library/fsl/fsl_collections.pas +++ b/library/fsl/fsl_collections.pas @@ -29,6 +29,7 @@ } {$I fhir.inc} + Interface @@ -1750,7 +1751,6 @@ TFslObjectListIterator = class(TFslObjectIterator) uses fsl_stream; - Procedure TFslCollection.BeforeDestruction; Begin InternalClear; @@ -5525,7 +5525,6 @@ function TFslObjectList.ExistsByDefault(oValue: TFslObject): boolean; Result := ExistsByIndex(IndexByDefault(oValue)); end; - function TFslObjectList.Add(oValue: TFslObject): integer; begin Assert(ValidateItem('Add', oValue, 'oValue')); diff --git a/library/fsl/fsl_comparisons.pas b/library/fsl/fsl_comparisons.pas index 8816acfad..e1098611c 100644 --- a/library/fsl/fsl_comparisons.pas +++ b/library/fsl/fsl_comparisons.pas @@ -70,10 +70,10 @@ function MakeXmlPretty(ASrc: String): String; i: Integer; l: Integer; LLevelIsSimple: Boolean; - b : TStringBuilder; + b : TFslStringBuilder; begin Result := ''; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try l := -1; LLevelIsSimple := False; diff --git a/library/fsl/fsl_cpu.pas b/library/fsl/fsl_cpu.pas new file mode 100644 index 000000000..9f90678df --- /dev/null +++ b/library/fsl/fsl_cpu.pas @@ -0,0 +1,171 @@ +unit fsl_cpu; + +{$i fhir.inc} + +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} +// adapted from https://w-shadow.com/blog/2006/08/27/how-to-get-the-cpu-usage-of-a-process/ and + +interface + +uses + Classes, SysUtils, + fsl_base, fsl_threads; + +const + wsMinMeasurementInterval=250; + {minimum amount of time that must have elapsed to calculate CPU usage, miliseconds. If time elapsed is less than this, previous result is returned, or zero, if there is no previous result.} + +type + + { TCPUUsageData } + + TCPUUsageData = class (TFslObject) + private + FLock : TFslLock; + FPID : cardinal; + {$IFDEF WINDOWS} + FHandle:cardinal; + {$ENDIF} + FOldUser, FOldKernel : Int64; + FLastUpdateTime : cardinal; + FLastUsage : single; //Last result of wsGetCpuUsage is saved here + public + constructor Create(PID : cardinal = 0); + destructor Destroy; override; + + function cpuUsage : Single; + function usage : String; + end; + +implementation + +uses +{$IFDEF WINDOWS} + Windows; +{$ELSE} + baseunix; +{$ENDIF} + +constructor TCPUUsageData.Create(PID : cardinal = 0); +{$IFDEF WINDOWS} +var + mCreationTime, mExitTime, mKernelTime, mUserTime:_FILETIME; + h : cardinal; +{$ENDIF} +begin + inherited create; + FLock := TFslLock.create('cpu.usage'); +{$IFDEF WINDOWS} + if FPID = 0 then + FPID := GetCurrentProcessId; + + //We need a handle with PROCESS_QUERY_INFORMATION privileges + FHandle := OpenProcess(PROCESS_QUERY_INFORMATION,false,FPID); + if FHandle <> 0 then + begin + FLastUpdateTime := GetTickCount64; + FLastUsage:=0; + if GetProcessTimes(FHandle, mCreationTime, mExitTime, mKernelTime, mUserTime) then + begin + //convert _FILETIME to Int64 + FOldKernel:=int64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)); + FOldUser:=int64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32)); + end + end; +{$ELSE} +{$ENDIF}; +end; + +destructor TCPUUsageData.Destroy; +begin +{$IFDEF WINDOWS} + CloseHandle(FHandle); +{$ELSE} +{$ENDIF}; + FLock.Free; + inherited; +end; + +//{$IFNDEF WINDOWS} +//function getrusage(usage : integer; var data : rusage) : integer; +//begin +//// result := host_processor_info(); +// // result := Getrusage(); +//end; +// +//{$ENDIF} + +function TCPUUsageData.cpuUsage : Single; +{$IFDEF WINDOWS} +var + mCreationTime, mExitTime, mKernelTime, mUserTime:_FILETIME; + DeltaMs, ThisTime:cardinal; + mKernel, mUser, mDelta:int64; + {$ENDIF} +begin + result := 0; + {$IFDEF WINDOWS} + if (FHandle <> 0) then + begin + FLock.Lock('cpuUage'); + try + result := FLastUsage; + ThisTime := GetTickCount; //Get the time elapsed since last query + DeltaMs := ThisTime - FLastUpdateTime; + if DeltaMs > wsMinMeasurementInterval then + begin + FLastUpdateTime := ThisTime; + GetProcessTimes(FHandle, mCreationTime, mExitTime, mKernelTime, mUserTime); + //convert _FILETIME to Int64. + mKernel := int64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)); + mUser := int64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32)); + //get the delta + mDelta := mUser + mKernel - FOldUser - FOldKernel; + FOldUser := mUser; + FOldKernel := mKernel; + Result := (mDelta / DeltaMs) / 100; //mDelta is in units of 100 nanoseconds, so… + FLastUsage := Result; //just in case you want to use it later, too + end; + finally + FLock.Unlock; + end; + end; + {$ELSE} + // getrusage... + {$ENDIF}; +end; + +function TCPUUsageData.usage: String; +begin + result := inttostr(trunc(cpuUsage))+'%'; +end; + + +end. + diff --git a/library/fsl/fsl_fpc.pas b/library/fsl/fsl_fpc.pas index e8a6f0d13..530f110ce 100644 --- a/library/fsl/fsl_fpc.pas +++ b/library/fsl/fsl_fpc.pas @@ -39,12 +39,12 @@ interface {$IFDEF LINUX} baseunix, unix, {$ENDIF} - Classes, SysUtils, SyncObjs, Contnrs, Character, Generics.Collections, Types + Classes, SysUtils, SyncObjs, Contnrs, Character, Generics.Collections, ZLib, Types {$IFDEF FPC}, {$IFDEF OSX} MacOSAll, CFBase, CFString, {$ENDIF} - dateutils{$ENDIF}; + ZStream, dateutils{$ENDIF}; type {$IFDEF FPC} @@ -128,6 +128,8 @@ procedure FileSetModified(const FileName : String; dateTime : TDateTime); {$IFDEF FPC} type + TZDecompressionStream = TDecompressionStream; + TZCompressionStream = TCompressionStream; { TDirectory } @@ -190,19 +192,16 @@ function unicodeChars(s : String) : TUCharArray; i, c, l, cl : integer; ch : LongWord; p: PChar; - ss : String; begin l := length(s); SetLength(result, l); // maximum possible length i := 0; c := 1; p := @s[1]; - ss := ''; while l > 0 do begin ch := UTF8CodepointToUnicode(p, cl); result[i] := UnicodeChar(ch); - ss := ss + IntToHex(ch, 4)+'.'; inc(i); dec(l, cl); inc(p, cl); diff --git a/library/fsl/fsl_graphql.pas b/library/fsl/fsl_graphql.pas index eb7856c7b..143cdd90f 100644 --- a/library/fsl/fsl_graphql.pas +++ b/library/fsl/fsl_graphql.pas @@ -44,7 +44,7 @@ TGraphQLArgument = class; TGraphQLValue = class (TFslObject) public Function Link : TGraphQLValue; overload; - procedure write(str : TStringBuilder; indent : integer); virtual; + procedure write(str : TFslStringBuilder; indent : integer); virtual; function isValue(v : String): boolean; virtual; end; @@ -57,7 +57,7 @@ TGraphQLVariableValue = class (TGraphQLValue) constructor Create(value : String); Function Link : TGraphQLVariableValue; overload; property Value : String read FValue write FValue; - procedure write(str : TStringBuilder; indent : integer); override; + procedure write(str : TFslStringBuilder; indent : integer); override; function ToString : String; override; end; @@ -70,7 +70,7 @@ TGraphQLNumberValue = class (TGraphQLValue) constructor Create(value : String); Function Link : TGraphQLNumberValue; overload; property Value : String read FValue write FValue; - procedure write(str : TStringBuilder; indent : integer); override; + procedure write(str : TFslStringBuilder; indent : integer); override; function isValue(v : String): boolean; override; function ToString : String; override; end; @@ -84,7 +84,7 @@ TGraphQLNameValue = class (TGraphQLValue) constructor Create(value : String); Function Link : TGraphQLValue; overload; property Value : String read FValue write FValue; - procedure write(str : TStringBuilder; indent : integer); override; + procedure write(str : TFslStringBuilder; indent : integer); override; function isValue(v : String): boolean; override; function ToString : String; override; end; @@ -98,7 +98,7 @@ TGraphQLStringValue = class (TGraphQLValue) constructor Create(value : String); Function Link : TGraphQLStringValue; overload; property Value : String read FValue write FValue; - procedure write(str : TStringBuilder; indent : integer); override; + procedure write(str : TFslStringBuilder; indent : integer); override; function isValue(v : String): boolean; override; function ToString : String; override; end; @@ -117,7 +117,7 @@ TGraphQLObjectValue = class (TGraphQLValue) Function Link : TGraphQLObjectValue; overload; property Fields : TFslList read FFields; function addField(name : String; listStatus : TGraphQLArgumentListStatus) : TGraphQLArgument; - procedure write(str : TStringBuilder; indent : integer); override; + procedure write(str : TFslStringBuilder; indent : integer); override; end; TGraphQLArgument = class (TFslObject) @@ -125,7 +125,7 @@ TGraphQLArgument = class (TFslObject) FName: String; FValues: TFslList; FListStatus: TGraphQLArgumentListStatus; - procedure write(str : TStringBuilder; indent : integer); + procedure write(str : TFslStringBuilder; indent : integer); procedure valuesFromNode(json : TJsonNode); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -320,7 +320,7 @@ TGraphQLPackage = class (TFslObject) TGraphQLParser = class (TFslTextExtractor) private // lexer - FToken : TStringBuilder; + FToken : TFslStringBuilder; FPeek : String; FLexType: TGraphQLLexType; FLocation : TSourceLocation; @@ -433,7 +433,7 @@ procedure TGraphQLArgument.valuesFromNode(json: TJsonNode); end; -procedure TGraphQLArgument.write(str: TStringBuilder; indent : integer); +procedure TGraphQLArgument.write(str: TFslStringBuilder; indent : integer); var i : integer; Begin @@ -1352,7 +1352,7 @@ procedure TGraphQLParser.consumePunctuation(punc: String); constructor TGraphQLParser.Create; begin inherited; - FToken := TStringBuilder.Create; + FToken := TFslStringBuilder.Create; end; destructor TGraphQLParser.Destroy; @@ -1398,7 +1398,7 @@ function TGraphQLValue.Link: TGraphQLValue; result := TGraphQLValue(inherited Link); end; -procedure TGraphQLValue.write(str : TStringBuilder; indent : integer); +procedure TGraphQLValue.write(str : TFslStringBuilder; indent : integer); begin raise ELibraryException.create('Need to override '+className+'.write'); end; @@ -1426,7 +1426,7 @@ function TGraphQLNumberValue.ToString: String; result := FValue; end; -procedure TGraphQLNumberValue.write(str : TStringBuilder; indent : integer); +procedure TGraphQLNumberValue.write(str : TFslStringBuilder; indent : integer); begin str.append(FValue); end; @@ -1455,7 +1455,7 @@ function TGraphQLVariableValue.ToString: String; result := FValue; end; -procedure TGraphQLVariableValue.write(str : TStringBuilder; indent : integer); +procedure TGraphQLVariableValue.write(str : TFslStringBuilder; indent : integer); begin raise ELibraryException.create('Cannot write a variable to JSON'); end; @@ -1489,7 +1489,7 @@ function TGraphQLNameValue.ToString: String; result := FValue; end; -procedure TGraphQLNameValue.write(str: TStringBuilder; indent : integer); +procedure TGraphQLNameValue.write(str: TFslStringBuilder; indent : integer); begin str.append(FValue); end; @@ -1523,7 +1523,7 @@ function TGraphQLStringValue.ToString: String; result := FValue; end; -procedure TGraphQLStringValue.write(str: TStringBuilder; indent : integer); +procedure TGraphQLStringValue.write(str: TFslStringBuilder; indent : integer); var i : integer; Begin @@ -1602,7 +1602,7 @@ function TGraphQLObjectValue.Link: TGraphQLObjectValue; result := TGraphQLObjectValue(inherited Link); end; -procedure TGraphQLObjectValue.write(str: TStringBuilder; indent : integer); +procedure TGraphQLObjectValue.write(str: TFslStringBuilder; indent : integer); var i, ni : integer; s, se : String; diff --git a/library/fsl/fsl_gzip.pas b/library/fsl/fsl_gzip.pas index 4c8dcf0bb..723cf1a38 100644 --- a/library/fsl/fsl_gzip.pas +++ b/library/fsl/fsl_gzip.pas @@ -33,31 +33,47 @@ interface uses - Classes, SysUtils, zflate, + Classes, SysUtils, + {$IFDEF FPC} + zflate, + {$ELSE} + ZLib, + {$ENDIF} fsl_base; { - for FPC, we use the zflate units by fibonacci. + for FPC, we use the zflate units by fibodevy (thanks). for delphi, we use delphi's inbuilt ZLib support - - this unit is to handle the $IFDEF between the two (tbd) } -function gzip(bytes : TBytes; header : boolean; level: dword=9) : TBytes; -function ungzip(bytes : TBytes) : TBytes; +function gzip(bytes : TBytes; header : boolean; level: {$IFDEF FPC}dword=9{$ELSE}TZCompressionLevel=TZCompressionLevel.zcDefault{$ENDIF}) : TBytes; +function ungzip(bytes : TBytes; description : String) : TBytes; implementation -function gzip(bytes : TBytes; header : boolean; level: dword=9) : TBytes; +function gzip(bytes : TBytes; header : boolean; level: {$IFDEF FPC}dword=9{$ELSE}TZCompressionLevel=TZCompressionLevel.zcDefault{$ENDIF}) : TBytes; begin + {$IFDEF FPC} result := zflate.gzcompress(bytes, level); + {$ELSE} + ZLib.ZCompress(bytes, result, level); + {$ENDIF} end; -function ungzip(bytes : TBytes) : TBytes; +function ungzip(bytes : TBytes; description : String) : TBytes; begin + {$IFDEF FPC} result := zflate.zdecompress(bytes); if zlastError <> 0 then - raise EFslException.create('Failed to read compressed content: '+zflatetranslatecode(zlasterror)); + raise EFslException.create('Failed to uncompress '+description+': '+zflatetranslatecode(zlasterror)); + {$ELSE} + try + ZLib.ZDecompress(bytes, result); + except + on ex: Exception do + raise EFslException.create('Failed to uncompress '+description+': '+ex.Message); + end; + {$ENDIF} end; diff --git a/library/fsl/fsl_htmlgen.pas b/library/fsl/fsl_htmlgen.pas index 964e76ec4..93c273098 100644 --- a/library/fsl/fsl_htmlgen.pas +++ b/library/fsl/fsl_htmlgen.pas @@ -34,7 +34,7 @@ interface uses SysUtils, - fsl_base, fsl_utilities, fsl_stream, fsl_http; + fsl_base, fsl_utilities, fsl_stream, fsl_http, fsl_fpc; Type @@ -43,11 +43,13 @@ interface THtmlPublisher = class (TFslObject) private FBuilder : TFslStringBuilder; + FBaseURL: String; FLangList : THTTPLanguageList; FVersion: String; FLogId: String; - procedure SetLangList(AValue: THTTPLanguageList); + procedure SetLangList(AValue: THTTPLanguageList); + procedure escapeText(AStr: String; attr : boolean); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -119,6 +121,42 @@ implementation { THtmlPublisher } + +procedure THtmlPublisher.escapeText(AStr: String; attr : boolean); +var + c : UnicodeChar; +begin + for c in unicodeChars(aStr) do + begin + case c of + '"': if attr then FBuilder.append('"') else FBuilder.append('"'); + '''': if attr then FBuilder.append(''') else FBuilder.append(''''); + '&': FBuilder.append('&'); + '<': FBuilder.append('<'); + '>': FBuilder.append('>'); + #32: FBuilder.append(' '); + + #13, #10: + if attr then + begin + FBuilder.append('&#'); + FBuilder.append(IntToStr(Ord(c))); + FBuilder.append(';') + end + else + FBuilder.append(char(c)); + else if (ord(c) < 127) and (Ord(c) >= 32) then + FBuilder.append(char(c)) + else + begin + FBuilder.append('&#x'); + FBuilder.append(IntToHex(Ord(c), 2)); + FBuilder.append(';'); + end; + end; + end; +end; + procedure THtmlPublisher.AddListItem(text: String); begin StartListItem; @@ -143,9 +181,11 @@ procedure THtmlPublisher.AddTableCell(text: String; bold: boolean); procedure THtmlPublisher.AddTableCellHint(text, hint: String); begin StartTableCell; - FBuilder.Append(''); + FBuilder.append(''); addtext(text, false, false); - FBuilder.Append(''); + FBuilder.append(''); EndTableCell; end; @@ -159,19 +199,19 @@ procedure THtmlPublisher.AddTableCellURL(text, url: String; hint : String = ''); procedure THtmlPublisher.AddText(text: String; bold, italics: boolean); begin if bold then - FBuilder.Append(''); + FBuilder.append(''); if italics then - FBuilder.Append(''); + FBuilder.append(''); AddTextPlain(text); if italics then - FBuilder.Append(''); + FBuilder.append(''); if bold then - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.AddTextPlain(text: String); begin - FBuilder.Append(FormatTextToXml(text, xmlText)); + escapeText(text, false); end; procedure THtmlPublisher.AddTitle(text: String); @@ -181,26 +221,28 @@ procedure THtmlPublisher.AddTitle(text: String); procedure THtmlPublisher.break; begin - FBuilder.Append('
'); + FBuilder.append('
'); end; procedure THtmlPublisher.checkbox(name : String; value : boolean; text : String); begin + FBuilder.append(' '+text) - else - FBuilder.Append(' '+text); + FBuilder.append('" checked'); + FBuilder.append(' value="1"/> '); + FBuilder.append(text); end; procedure THtmlPublisher.endDiv; begin - FBuilder.Append('') + FBuilder.append('') end; constructor THtmlPublisher.Create(); begin inherited Create; - FBuilder := TFslStringBuilder.Create; + FBuilder := TFslStringBuilder.create; end; destructor THtmlPublisher.Destroy; @@ -210,87 +252,98 @@ destructor THtmlPublisher.Destroy; inherited; end; - - procedure THtmlPublisher.Done; begin - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.EndBlockQuote; begin - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndForm; begin - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndList(ordered: boolean); begin if ordered then - FBuilder.Append(''#13#10) + FBuilder.append(''#13#10) else - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndListItem; begin - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndParagraph; begin - FBuilder.Append('

'#13#10); + FBuilder.append('

'#13#10); end; procedure THtmlPublisher.endPre; begin - FBuilder.Append('

'#13#10);
+  FBuilder.append('
'#13#10);
 end;
 
 procedure THtmlPublisher.EndTable;
 begin
-  FBuilder.Append('
'#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndTableCell; begin - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.EndTableRow; begin - FBuilder.Append(''#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.Heading(level: integer; text: String); begin - FBuilder.Append(''); + FBuilder.append(''); AddTextPlain(text); - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.hiddenInput(name, value: String); begin - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.Line; begin - FBuilder.Append('
'#13#10); + FBuilder.append('
'#13#10); end; procedure THtmlPublisher.Memo(name, value, text: String); begin - FBuilder.Append(text+''); + FBuilder.append(text); + FBuilder.append(''); end; function THtmlPublisher.output: String; begin - result := FBuilder.ToString; + result := FBuilder.toString; end; procedure THtmlPublisher.ParaURL(text, url: String); @@ -302,53 +355,61 @@ procedure THtmlPublisher.ParaURL(text, url: String); procedure THtmlPublisher.Spacer; begin - FBuilder.Append(' '); + FBuilder.append(' '); end; procedure THtmlPublisher.StartBlockQuote; begin - FBuilder.Append('
'); + FBuilder.append('
'); end; procedure THtmlPublisher.startDiv; begin - FBuilder.Append('
') + FBuilder.append('
') end; procedure THtmlPublisher.StartForm(method, action: String); begin - FBuilder.Append('
'#13#10); + FBuilder.append(''#13#10); end; procedure THtmlPublisher.StartList(ordered: boolean); begin if ordered then - FBuilder.Append('
    ') + FBuilder.append('
      ') else - FBuilder.Append('
        '); + FBuilder.append('
          '); end; procedure THtmlPublisher.StartListItem; begin - FBuilder.Append('
        • '); + FBuilder.append('
        • '); end; procedure THtmlPublisher.StartParagraph; begin - FBuilder.Append('

          '); + FBuilder.append('

          '); end; procedure THtmlPublisher.StartPre; begin - FBuilder.Append('

          '#13#10);
          +  FBuilder.append('
          '#13#10);
           end;
           
           procedure THtmlPublisher.StartRow(bgcolor : string = '');
           begin
             if (bgcolor <> '') then
          -    FBuilder.Append('')
          +  begin
          +    FBuilder.append('')
          +  end
             else
          -    FBuilder.Append('')
          +    FBuilder.append('')
           end;
           
           procedure THtmlPublisher.StartTable(borders: boolean; clss : String);
          @@ -356,80 +417,85 @@ procedure THtmlPublisher.StartTable(borders: boolean; clss : String);
             if clss <> '' then
               clss := ' class="'+clss+'"';
             if borders then
          -    FBuilder.Append('')
          +    FBuilder.append('
          ') else - FBuilder.Append('
          '); + FBuilder.append('
          '); end; procedure THtmlPublisher.StartTableCell(span: integer); begin if (span <> 1) then - FBuilder.Append('') + FBuilder.append('') end; procedure THtmlPublisher.Submit(name: String); begin - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.TextInput(name, value: String; length: integer); begin - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.TextInput(name: String; length: integer); begin - FBuilder.Append(''); + FBuilder.append(''); end; procedure THtmlPublisher.URL(text, url: String; hint: string); begin if (hint <> '') then - FBuilder.Append('') + begin + FBuilder.append('') + end else - FBuilder.Append(''); + begin + FBuilder.append(''); + end; AddTextPlain(text); - FBuilder.Append(''); -end; - -//procedure THtmlPublisher.writeXhtml(node: TFhirXHtmlNode); -//var -// i : integer; -//begin -// case node.NodeType of -// fhntElement, fhntDocument: -// begin -// FBuilder.Append('<'+node.Name); -// if node.HasAttributes then -// for i := 0 to node.Attributes.Count - 1 do -// FBuilder.Append(' '+node.Attributes[i].Name+'="'+FormatTextToXml(node.Attributes[i].value, xmlAttribute)+'"'); -// if node.ChildNodes.Count = 0 then -// FBuilder.Append('/>') -// else -// begin -// FBuilder.Append('>'); -// for i := 0 to node.ChildNodes.Count - 1 do -// writeXhtml(node.ChildNodes[i]); -// FBuilder.Append(''); -// end; -// end; -// fhntText: -// AddTextPlain(node.Content); -// fhntComment: -// FBuilder.Append(''); -// end; -//end; -// + FBuilder.append(''); +end; + procedure THtmlPublisher.TextInput(name, value, text: String; length: integer); begin - FBuilder.Append(' '+text); + FBuilder.append(' '); + FBuilder.append(text); end; procedure THtmlPublisher.SetLangList(AValue: THTTPLanguageList); @@ -441,7 +507,7 @@ procedure THtmlPublisher.SetLangList(AValue: THTTPLanguageList); function THtmlPublisher.sizeInBytesV(magic : integer) : cardinal; begin result := inherited sizeInBytesV(magic); - inc(result, FBuilder.sizeInBytes(magic)); + inc(result, FBuilder.memSize()); inc(result, (FBaseURL.length * sizeof(char)) + 12); inc(result, FLangList.sizeInBytes(magic)); inc(result, (FVersion.length * sizeof(char)) + 12); diff --git a/library/fsl/fsl_http.pas b/library/fsl/fsl_http.pas index 7d8d6bdbd..4cd646290 100644 --- a/library/fsl/fsl_http.pas +++ b/library/fsl/fsl_http.pas @@ -137,6 +137,8 @@ THTTPLanguageEntry = class (TFslObject) property value : double read FValue write FValue; property ietf : TIETFLang read FIetf write SetIetf; property auto : boolean read FAuto write FAuto; + + function matches(lang : String; exact : boolean) : boolean; end; { THTTPLanguageEntrySorter } @@ -157,6 +159,7 @@ THTTPLanguageList = class (TFslObject) FLangs : TFslList; //function codeMatches(code, spec : String) : boolean; + function getCount: integer; procedure process; public constructor Create(source : String; wildcard : boolean); @@ -172,9 +175,11 @@ THTTPLanguageList = class (TFslObject) function asString(incWildcard : boolean) : String; function prefLang : String; - function matches(definitions : TIETFLanguageDefinitions; code: String): boolean; //function prefLang : String; function sizeInBytes(magic : integer) : cardinal; + property count : integer read getCount; + + function matches(lang : String; exact : boolean) : boolean; end; implementation @@ -640,6 +645,13 @@ function THTTPLanguageEntry.sizeInBytes(magic: integer): cardinal; inc(result, (FLang.length * sizeof(char)) + 12); end; +function THTTPLanguageEntry.matches(lang : String; exact : boolean) : boolean; +begin + if exact then + result := FLang = lang + else + result := FLang.startsWith(lang); +end; { THTTPLanguageEntrySorter } @@ -723,14 +735,17 @@ function THTTPLanguageList.prefLang: String; exit(e.lang); end; -function THTTPLanguageList.matches(definitions: TIETFLanguageDefinitions; code: String): boolean; +function THTTPLanguageList.matches(lang : String; exact : boolean) : boolean; +var + entry : THTTPLanguageEntry; begin - if (self = nil) then - exit(false); - - RESULT := false; + for entry in FLangs do + if (entry.matches(lang, exact)) then + exit(true); + result := FWildcard; end; + procedure THTTPLanguageList.process; var i : integer; @@ -739,6 +754,7 @@ procedure THTTPLanguageList.process; wc : boolean; begin i := 0; + wc := false; for s in FSource.Split([',']) do begin if (s.trim() <> '') then @@ -765,6 +781,11 @@ procedure THTTPLanguageList.process; FLangs.Sort(THTTPLanguageEntrySorter.create); end; +function THTTPLanguageList.getCount: integer; +begin + result := FLangs.Count; +end; + // diff --git a/library/fsl/fsl_json.pas b/library/fsl/fsl_json.pas index 5b658abd4..bf155fef0 100644 --- a/library/fsl/fsl_json.pas +++ b/library/fsl/fsl_json.pas @@ -427,7 +427,7 @@ TJSONLexer = class (TFslTextExtractor) Private FLoose : boolean; FPeek : String; - FValue: TStringBuilder; + FValue: TFslStringBuilder; FLexType: TJSONLexType; FStates : TStringList; FLastLocationBWS : TSourceLocation; @@ -769,10 +769,10 @@ function TJSONWriter.JSONString(const value: String): String; Function UnJSONString(const value : String) : String; var i : integer; - b : TStringBuilder; + b : TFslStringBuilder; hex : String; Begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try i := 1; while i <= length(value) do @@ -1449,7 +1449,7 @@ constructor TJSONLexer.Create(oStream: TFslStream; loose : boolean); FLocation := TSourceLocation.Create; FPrevLocation := FLocation; FStates := TStringList.Create; - FValue := TStringBuilder.Create; + FValue := TFslStringBuilder.Create; end; destructor TJSONLexer.Destroy; diff --git a/library/fsl/fsl_lang.pas b/library/fsl/fsl_lang.pas index 2479cc7d6..873b72d80 100644 --- a/library/fsl/fsl_lang.pas +++ b/library/fsl/fsl_lang.pas @@ -187,6 +187,7 @@ TIETFLanguageDefinitions = class (TFslObject) FScripts : TFslMap; FRegions : TFslMap; FVariants : TFslMap; + FParsed : TFslMap; function readVars(st : TStringList; i : integer; vars : TFslStringDictionary) :integer; function loadLanguage(vars : TFslStringDictionary; i : integer) :integer; function loadExtLang(vars : TFslStringDictionary; i : integer) :integer; @@ -289,6 +290,7 @@ constructor TIso4217CurrencySet.Create; inherited; FCodes := TFslList.Create; FMap := TFslMap.create('tx.currency'); + FMap.defaultValue := nil; Load; end; @@ -612,11 +614,13 @@ constructor TIETFLanguageDefinitions.Create(source : String); FScripts := TFslMap.create('tx.lang.scripts'); FRegions := TFslMap.create('tx.lang.reg'); FVariants := TFslMap.create('tx.lang.var'); + FParsed := TFslMap.create('tx.lang.parsed'); Load(source); end; destructor TIETFLanguageDefinitions.Destroy; begin + FParsed.free; FVariants.free; FScripts.free; FExtLanguages.free; @@ -669,58 +673,66 @@ function TIETFLanguageDefinitions.parse(code : String; var msg : String) : TIETF if (code = '') then exit(nil); - msg := ''; - res := TIETFLang.create(code); - try - if code <> '' then - begin - parts := code.Split(['-']); - c := 0; - t := length(parts); - if not FLanguages.ContainsKey(parts[c]) and (parts[c] <> '*') then - msg := 'Invalid Language code "'+parts[c]+'"' - else + if (FParsed.TryGetValue(code, result)) then + result.link + else + begin + msg := ''; + res := TIETFLang.create(code); + try + if code <> '' then begin - res.FLanguage := parts[c]; - inc(c); - for i := 1 to 3 do + parts := code.Split(['-']); + c := 0; + t := length(parts); + if not FLanguages.ContainsKey(parts[c]) and (parts[c] <> '*') then + msg := 'Invalid Language code "'+parts[c]+'"' + else begin - if (c < t) and FExtLanguages.ContainsKey(parts[c]) then + res.FLanguage := parts[c]; + inc(c); + for i := 1 to 3 do + begin + if (c < t) and FExtLanguages.ContainsKey(parts[c]) then + begin + res.addExtLang(parts[c]); + inc(c); + end; + end; + if (c < t) and FScripts.ContainsKey(parts[c]) then begin - res.addExtLang(parts[c]); + res.FScript := parts[c]; inc(c); end; + if (c < t) and FRegions.ContainsKey(parts[c]) then + begin + res.FRegion := parts[c]; + inc(c); + end; + if (c < t) and FVariants.ContainsKey(parts[c]) then + begin + res.FVariant := parts[c]; + inc(c); + end; + while (c < t) and parts[c].StartsWith('x') do + begin + res.addPrivateUse(parts[c]); + inc(c); + end; + if (c < t) then + msg := 'Unable to recognise part '+inttostr(c+1)+' ("'+parts[c]+'") as a valid language part'; end; - if (c < t) and FScripts.ContainsKey(parts[c]) then - begin - res.FScript := parts[c]; - inc(c); - end; - if (c < t) and FRegions.ContainsKey(parts[c]) then - begin - res.FRegion := parts[c]; - inc(c); - end; - if (c < t) and FVariants.ContainsKey(parts[c]) then - begin - res.FVariant := parts[c]; - inc(c); - end; - while (c < t) and parts[c].StartsWith('x') do - begin - res.addPrivateUse(parts[c]); - inc(c); - end; - if (c < t) then - msg := 'Unable to recognise part '+inttostr(c+1)+' ("'+parts[c]+'") as a valid language part'; end; + if msg = '' then + begin + result := res.Link; + FParsed.AddOrSetValue(code, result.link); + end + else + result := nil; + finally + res.free; end; - if msg = '' then - result := res.Link - else - result := nil; - finally - res.free; end; end; @@ -739,7 +751,7 @@ function TIETFLanguageDefinitions.present(code: TIETFLang; template: String): St function TIETFLanguageDefinitions.present(code: TIETFLang): String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; procedure note(n, v : String); begin @@ -756,7 +768,7 @@ function TIETFLanguageDefinitions.present(code: TIETFLang): String; result := '' else begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(FLanguages[code.language].display); if (code.region <> '') or (code.script <> '') or (code.variant <> '') then @@ -768,7 +780,7 @@ function TIETFLanguageDefinitions.present(code: TIETFLang): String; if (code.region <> '') then note('Region', FRegions[code.region].display); if (code.variant <> '') then - note('Region', FVariants[code.variant].display); + note('Variant', FVariants[code.variant].display); b.Append(')'); end; diff --git a/library/fsl/fsl_logging.pas b/library/fsl/fsl_logging.pas index a7db7942e..fa350f57f 100644 --- a/library/fsl/fsl_logging.pas +++ b/library/fsl/fsl_logging.pas @@ -33,9 +33,9 @@ interface uses - {$IFDEF WINDOWS} Windows, {$IFDEF DELPHI} FastMM4, {$ENDIF} {$IFDEF FPC}JwaPsApi, {$ELSE} PsApi, {$ENDIF}{$ENDIF} + {$IFDEF WINDOWS} Windows, {$IFDEF FPC}JwaPsApi, {$ELSE} PsApi, {$ENDIF}{$ENDIF} SysUtils, Classes, - fsl_threads, fsl_base, fsl_utilities, fsl_collections{$IFDEF FPC}, fsl_fpc_memory{$ENDIF}; + fsl_threads, fsl_base, fsl_utilities, fsl_collections, fsl_cpu{$IFDEF FPC}, fsl_fpc_memory{$ENDIF}; Type TLogEvent = procedure (msg : String) of object; @@ -141,6 +141,7 @@ TLogging = class (TFslObject) FLogToConsole : boolean; FFileLogger : TLogger; FListeners : TFslList; + FShuttingDown: boolean; FStarting: boolean; FStartTime : TDateTime; FLastday : integer; @@ -148,10 +149,12 @@ TLogging = class (TFslObject) FCount : integer; FHeld : TStringlist; FLock : TFslLock; + FCPU : TCPUUsageData; procedure checkDay; procedure close; procedure LogDoubleFreeCallBack(name1, name2: String); + procedure SetShuttingDown(AValue: boolean); protected function sizeInBytesV(magic : integer) : cardinal; override; public @@ -162,6 +165,7 @@ TLogging = class (TFslObject) property LogToConsole : boolean read FLogToConsole write FLogToConsole; property FileLog : TLogger read FFileLogger; + property CPU : TCPUUsageData read FCPU; procedure logToFile(filename : String); procedure addListener(listener : TLogListener); @@ -179,6 +183,8 @@ TLogging = class (TFslObject) function MemoryStatus(full : boolean) : String; function InternalMem : UInt64; + + property shuttingDown : boolean read FShuttingDown write SetShuttingDown; end; var @@ -361,7 +367,7 @@ procedure TLogger.WriteToLog(bytes: TBytes); exit; If length(bytes) = 0 Then Exit; - FLock.Lock; + FLock.Lock('WriteToLog'); Try sName := ProcessFileName; size := 0; @@ -485,10 +491,12 @@ constructor TLogging.Create; FLastDay := 0; FHeld := TStringList.Create; DoubleFreeCallBack := LogDoubleFreeCallBack; + FCPU := TCPUUsageData.create(); end; destructor TLogging.Destroy; begin + FCPU.free; DoubleFreeCallBack := nil; close; FHeld.free; @@ -503,6 +511,12 @@ procedure TLogging.LogDoubleFreeCallBack(name1, name2 : String); log('Attempt to free a class a second time (of type '+name1+' or '+name2+'?)'); end; +procedure TLogging.SetShuttingDown(AValue: boolean); +begin + if FShuttingDown=AValue then Exit; + FShuttingDown:=AValue; +end; + procedure TLogging.addListener(listener: TLogListener); begin FListeners.Add(listener.Link) @@ -570,14 +584,12 @@ function OSMem : UInt64; function TLogging.InternalMem : UInt64; {$IFDEF DELPHI} var - st : TMemoryManagerUsageSummary; -{$ELSE} - //hs : TFPCHeapStatus; + st : THeapStatus; {$ENDIF} begin {$IFDEF DELPHI} - GetMemoryManagerUsageSummary(st); - result := st.AllocatedBytes + st.OverheadBytes; + st := GetHeapStatus; + result := st.TotalAllocated + st.Overhead; {$ELSE} result := TFPCMemoryManagerTracker.totalMemory; {$ENDIF} @@ -615,7 +627,7 @@ procedure TLogging.checkDay; if FLogToConsole then begin try - FLock.Lock; + FLock.Lock('checkDay'); try System.Writeln(s); finally @@ -653,7 +665,7 @@ procedure TLogging.log(s: String); var listener : TLogListener; begin - FLock.Lock; + FLock.Lock('log'); try if FWorkingLine <> '' then begin @@ -666,7 +678,7 @@ procedure TLogging.log(s: String); checkDay; if FStarting then - s := FormatDateTime('hh:nn:ss', now)+ ' '+FormatDateTime('hh:nn:ss', now - FStartTime)+' '+MemoryStatus(false)+' '+s + s := FormatDateTime('hh:nn:ss', now)+ ' '+FormatDateTime('hh:nn:ss', now - FStartTime)+' '+MemoryStatus(false)+' '+FCPU.usage+' '+s else s := FormatDateTime('hh:nn:ss', now)+ ' '+s; if FFileLogger <> nil then @@ -674,7 +686,7 @@ procedure TLogging.log(s: String); if FLogToConsole then begin try - FLock.Lock; + FLock.Lock('log2'); try System.Writeln(s); finally @@ -707,7 +719,7 @@ procedure TLogging.start(s : String); if FLogToConsole then begin try - FLock.Lock; + FLock.Lock('start'); try System.Write(s); finally @@ -734,7 +746,7 @@ procedure TLogging.continue(s : String); FWorkingLine := FWorkingLine+s; if FLogToConsole then begin - FLock.Lock; + FLock.Lock('continue'); try System.Write(s); finally @@ -758,7 +770,7 @@ procedure TLogging.finish(s : String = ''); begin if FLogToConsole then begin - FLock.Lock; + FLock.Lock('finish'); try System.Writeln(s); finally @@ -785,7 +797,7 @@ procedure TLogging.finish(s : String = ''); except end; end; - FLock.Lock; + FLock.Lock('finish2'); try for h in FHeld do log(h); diff --git a/library/fsl/fsl_npm.pas b/library/fsl/fsl_npm.pas index 312e69edf..2443111f5 100644 --- a/library/fsl/fsl_npm.pas +++ b/library/fsl/fsl_npm.pas @@ -213,7 +213,7 @@ TNpmPackage = class (TNpmPackageObject) property size : integer read FSize write FSize; function isCore : boolean; - procedure report(b : TStringBuilder); + procedure report(b : TFslStringBuilder); function presentation : String; end; @@ -589,7 +589,7 @@ function TNpmPackage.GetDependencies: TArray; begin sl := TStringList.Create; try - if (info.has('dependencies')) then + if (info.has('dependencies')) and (info.obj['dependencies'] <> nil) then begin for n in info.obj['dependencies'].properties.keys do sl.add(n+'#'+info.obj['dependencies'].str[n]); @@ -1086,7 +1086,7 @@ procedure TNpmPackage.readStream(tgz: TStream; desc: String; progress: TWorkProg b : TBytes; bi : TBytesStream; begin - bs := TBytesStream.create(ungzip(streamToBytes(tgz))); + bs := TBytesStream.create(ungzip(streamToBytes(tgz), desc)); try tar := TTarArchive.Create(bs); try @@ -1114,15 +1114,18 @@ procedure TNpmPackage.readStream(tgz: TStream; desc: String; progress: TWorkProg bs.free; end; try - FNpm := TJsonParser.parse(folders['package'].fetchFile('package.json')); - except + if folders['package'] <> nil then + FNpm := TJsonParser.parse(folders['package'].fetchFile('package.json')) + else + raise EFslException.create('Error parsing '+desc+'#'+'package/package.json: Not found'); + except on e : Exception do raise EFslException.create('Error parsing '+desc+'#'+'package/package.json: '+e.Message); end; checkIndexed(desc); end; -procedure TNpmPackage.report(b : TStringBuilder); +procedure TNpmPackage.report(b : TFslStringBuilder); begin b.AppendLine(' '+Version+' on '+FhirVersion+' from '+url+' in '+FPath); b.AppendLine(' dependencies: '+dependencySummary); diff --git a/library/fsl/fsl_rdf.pas b/library/fsl/fsl_rdf.pas index 7c95f283e..c1946f57a 100644 --- a/library/fsl/fsl_rdf.pas +++ b/library/fsl/fsl_rdf.pas @@ -78,7 +78,7 @@ TRDFComplex = class (TRDFTriple) public constructor Create(gen : TRDFGenerator); destructor Destroy; override; - function write(b : TStringBuilder; indent : integer) : boolean; + function write(b : TFslStringBuilder; indent : integer) : boolean; function predicate(predicate, obj : String) : TRDFComplex; overload; function predicate(predicate, obj, xtype : String) : TRDFComplex; overload; function predicate(predicate : String; obj : TRDFTriple) : TRDFComplex; overload; @@ -146,16 +146,16 @@ TRDFGenerator = class (TFslObject) FFormat: TRDFFormat; FLastId : integer; - procedure ln(b: TStringBuilder; s : String); + procedure ln(b: TFslStringBuilder; s : String); function sorted(list : TEnumerable) : TArray; procedure checkPrefix(pname : String); overload; procedure checkPrefix(obj : TRDFTriple); overload; function hasSection(sn : String) : boolean; - procedure writeTurtlePrefixes(b : TStringBuilder; header : boolean); - procedure writeTurtleSection(b : TStringBuilder; section : TRDFSection); - procedure writeNTripleSection(b : TStringBuilder; section : TRDFSection); - procedure writeNTripleComplex(b: TStringBuilder; complex: TRDFComplex); - procedure writeNTriple(b: TStringBuilder; url1, url2, url3: String); + procedure writeTurtlePrefixes(b : TFslStringBuilder; header : boolean); + procedure writeTurtleSection(b : TFslStringBuilder; section : TRDFSection); + procedure writeNTripleSection(b : TFslStringBuilder; section : TRDFSection); + procedure writeNTripleComplex(b: TFslStringBuilder; complex: TRDFComplex); + procedure writeNTriple(b: TFslStringBuilder; url1, url2, url3: String); function fullUrl(s: String): String; protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -167,7 +167,7 @@ TRDFGenerator = class (TFslObject) property format : TRDFFormat read FFormat write FFormat; procedure prefix(code, url : String); function section(sn: String) : TRDFSection; - procedure generate(b : TStringBuilder; header : boolean); + procedure generate(b : TFslStringBuilder; header : boolean); end; function ttlLiteral(s : String) : String; @@ -181,12 +181,12 @@ function ttlLiteral(s : String) : String; function pctEncode(s : String; isString : boolean) : String; var - b : TStringBuilder; + b : TFslStringBuilder; c : char; begin if s = '' then exit(''); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for c in s do begin @@ -277,7 +277,7 @@ function TRDFComplex.predicate(predicate: String; obj: TRDFTriple): TRDFComplex; result := self; end; -function TRDFComplex.write(b: TStringBuilder; indent: integer): boolean; +function TRDFComplex.write(b: TFslStringBuilder; indent: integer): boolean; var left : String; i : integer; @@ -537,7 +537,7 @@ function TRDFGenerator.Link: TRDFGenerator; result := TRDFGenerator(inherited link); end; -procedure TRDFGenerator.ln(b: TStringBuilder; s: String); +procedure TRDFGenerator.ln(b: TFslStringBuilder; s: String); begin b.Append(s); b.Append(#13#10); @@ -644,7 +644,7 @@ function TRDFGenerator.fullUrl(s : String) : String; end; end; -procedure TRDFGenerator.writeNTriple(b: TStringBuilder; url1, url2, url3 : String); +procedure TRDFGenerator.writeNTriple(b: TFslStringBuilder; url1, url2, url3 : String); begin b.Append(url1); b.Append(' '); @@ -654,7 +654,7 @@ procedure TRDFGenerator.writeNTriple(b: TStringBuilder; url1, url2, url3 : Strin b.Append(#13#10); end; -procedure TRDFGenerator.writeNTripleComplex(b: TStringBuilder; complex : TRDFComplex); +procedure TRDFGenerator.writeNTripleComplex(b: TFslStringBuilder; complex : TRDFComplex); var pred : TRDFPredicate; begin @@ -676,7 +676,7 @@ procedure TRDFGenerator.writeNTripleComplex(b: TStringBuilder; complex : TRDFCom writeNTripleComplex(b, pred.FObj as TRDFComplex); end; -procedure TRDFGenerator.writeNTripleSection(b: TStringBuilder; section: TRDFSection); +procedure TRDFGenerator.writeNTripleSection(b: TFslStringBuilder; section: TRDFSection); var subject : TRDFSubject; begin @@ -687,7 +687,7 @@ procedure TRDFGenerator.writeNTripleSection(b: TStringBuilder; section: TRDFSect end; end; -procedure TRDFGenerator.writeTurtlePrefixes(b: TStringBuilder; header : boolean); +procedure TRDFGenerator.writeTurtlePrefixes(b: TFslStringBuilder; header : boolean); var p : String; begin @@ -702,7 +702,7 @@ procedure TRDFGenerator.writeTurtlePrefixes(b: TStringBuilder; header : boolean) ln(b, ''); end; -procedure TRDFGenerator.writeTurtleSection(b: TStringBuilder; section: TRDFSection); +procedure TRDFGenerator.writeTurtleSection(b: TFslStringBuilder; section: TRDFSection); var sbj : TRDFSubject; i : integer; @@ -743,7 +743,7 @@ procedure TRDFGenerator.writeTurtleSection(b: TStringBuilder; section: TRDFSecti end; end; -procedure TRDFGenerator.generate(b: TStringBuilder; header: boolean); +procedure TRDFGenerator.generate(b: TFslStringBuilder; header: boolean); var s : TRDFSection; begin diff --git a/library/fsl/fsl_scrypt.pas b/library/fsl/fsl_scrypt.pas index beb540da0..29835c063 100644 --- a/library/fsl/fsl_scrypt.pas +++ b/library/fsl/fsl_scrypt.pas @@ -1017,11 +1017,15 @@ class function TScrypt.CheckPassword(const Passphrase: String; ExpectedHashStrin if not scrypt.TryParseHashString(ExpectedHashString, {out}costFactor, blockSizeFactor, parallelizationFactor, salt, expected) then raise EScryptException.Create(SCouldNotParsePassword); try - {$IFNDEF FPC} + {$IFDEF FPC} + t1 := GetTickCount64; + {$ELSE} QueryPerformanceCounter(t1); {$ENDIF} actual := scrypt.DeriveBytes(Passphrase, salt, costFactor, blockSizeFactor, ParallelizationFactor, Length(expected)); - {$IFNDEF FPC} + {$IFDEF FPC} + t2 := GetTickCount64; + {$ELSE} QueryPerformanceCounter(t2); {$ENDIF} @@ -1035,11 +1039,14 @@ class function TScrypt.CheckPassword(const Passphrase: String; ExpectedHashStrin //Only advertise a rehash being needed if they got the correct password. //Don't want someone blindly re-hashing with a bad password because they forgot to check the result, //or because they decided to handle "PasswordRehashNeeded" first. - {$IFNDEF FPC} + {$IFDEF FPC} + freq := 1; + {$ELSE} if QueryPerformanceFrequency(freq) then begin + freq := freq * 1000; // ms {$ENDIF} - duration := (t2-t1)/freq * 1000; //ms + duration := (t2-t1)/freq; if duration < 250 then PasswordRehashNeeded := True; {$IFNDEF FPC} diff --git a/library/fsl/fsl_service.pas b/library/fsl/fsl_service.pas index 5d9528208..bb499d83c 100644 --- a/library/fsl/fsl_service.pas +++ b/library/fsl/fsl_service.pas @@ -149,6 +149,7 @@ procedure TSystemService.Execute; LMsg : string; LCheckTime : TDateTime; begin + SetThreadStatus('Executing'); {$IFNDEF WINDOWS} fpSignal(SigTerm, SignalHandler(@handleSigTerm)); fpSignal(SigQuit, SignalHandler(@handleSigQuit)); @@ -163,6 +164,7 @@ procedure TSystemService.Execute; // todo: is there a way to do this? SetConsoleTitle(pChar(FDisplayName+MemoryStatus)); if (LCheckTime < Now) then begin + SetThreadStatus('Executing'); LCheckTime := now + 10 * DATETIME_SECOND_ONE; if CheckClose(LMsg) then begin diff --git a/library/fsl/fsl_stream.pas b/library/fsl/fsl_stream.pas index 23f4650e2..617b66ac6 100644 --- a/library/fsl/fsl_stream.pas +++ b/library/fsl/fsl_stream.pas @@ -37,7 +37,7 @@ {$IFDEF LINUX} unixtype, baseunix, unix, {$ENDIF} {$IFDEF FPC} ZStream, {$ELSE} AnsiStrings, {$ENDIF} SysUtils,Classes, RTLConsts, ZLib, - fsl_fpc, fsl_base, fsl_collections, fsl_utilities, fsl_logging, fsl_gzip; + fsl_fpc, fsl_base, fsl_collections, fsl_utilities, fsl_gzip; type EParserException = class; @@ -1022,7 +1022,7 @@ TFslStreamReader = class(TFslTextReader) FHasQuote : Boolean; FIgnoreWhitespace: boolean; - FEntry : TStringBuilder; + FEntry : TFslStringBuilder; FCache : Char; FReadBuffer: SysUtils.TCharArray; @@ -2092,7 +2092,7 @@ procedure TFslBuffer.LoadFromFileName(const sFilename: String); Var oFile : TFslFile; Begin - oFile := TFslFile.Create(sFilename, fmOpenRead); + oFile := TFslFile.Create(sFilename, fmOpenRead + fmShareDenyWrite); Try LoadFromFile(oFile); Finally @@ -3591,7 +3591,7 @@ function TFslFile.sizeInBytesV(magic : integer) : cardinal; constructor TFslCSVExtractor.Create; Begin Inherited; - FEntry := TStringBuilder.create(2048); + FEntry := TFslStringBuilder.create(2048); FSeparator := ','; FQuote := '"'; FHasQuote := True; @@ -4363,7 +4363,7 @@ constructor TFslStreamReader.Create(const Filename: string; Encoding: TEncoding; var oFile : TFslFile; begin - oFile := TFslFile.Create(FileName, fmOpenRead); + oFile := TFslFile.Create(FileName, fmOpenRead + fmShareDenyWrite); Try Create(oFile.Link, Encoding, DetectBOM, BufferSize); Finally @@ -4853,7 +4853,8 @@ function FileToString(filename : String; encoding : TEncoding; AShareMode : Word finally LFileStream.free; end; - if encoding = nil then // special case + if (encoding = nil) // special case + {$IFDEF FPC} {$IFDEF OSX} or (encoding = TEncoding.UTF8) {$ENDIF} {$ENDIF} then // work around FPC bug begin SetLength(result, length(bytes)); move(bytes[0], result[1], length(bytes)); @@ -5302,16 +5303,33 @@ procedure TFslZipPartList.add(name: String; bytes: TBytes); Procedure TFslZipReader.ReadKnownDeflate(pIn : Pointer; partName : string; iSizeComp, iSizeDecomp : LongWord; oBuffer : TFslBuffer); Var - src : TBytes; + oSrc : TStream; + oDecompressor : TZDecompressionStream; {$IFOPT C+} iRead : Integer; {$ENDIF} Begin If iSizeDecomp > 0 Then Begin - setLength(src, iSizeComp); - move(pIn^, src[0], iSizeComp); - oBuffer.AsBytes := ungzip(src); + oSrc := TPointerMemoryStream.Create(pIn, iSizeComp); + Try + oDecompressor := TZDecompressionStream.Create(oSrc); + Try + oBuffer.Capacity := iSizeDecomp; + + {$IFOPT C+} + iRead := oDecompressor.Read(oBuffer.Data^, iSizeDecomp); + Assert(CheckCondition(iRead = iSizeDecomp, 'ReadKnownDeflate', partName+': Expected to read '+IntegerToString(iSizeDecomp)+ + ' bytes, but actually found '+IntegerToString(iRead)+' bytes')); + {$ELSE} + oDecompressor.Read(oBuffer.Data^, iSizeDecomp); + {$ENDIF} + Finally + oDecompressor.free; + End; + Finally + oSrc.free; + End; End; End; @@ -5514,7 +5532,9 @@ procedure TFslZipWriter.addFile(name, actual: String); oCompressor := TCompressionStream.Create(clMax, oCompressedStream); Try oCompressor.Write(bytes[0], length(bytes)); + {$IFDEF FPC} oCompressor.flush; + {$ENDIF} Finally oCompressor.free; End; diff --git a/library/fsl/fsl_threads.pas b/library/fsl/fsl_threads.pas index bfa5a2fe8..0fb2aab09 100644 --- a/library/fsl/fsl_threads.pas +++ b/library/fsl/fsl_threads.pas @@ -61,7 +61,8 @@ procedure ThreadPing; procedure SetThreadName(name : String); procedure SetThreadStatus(status : String); function GetThreadInfo : String; -function GetThreadReport : String; +function GetThreadInfoForThread(threadId : TThreadId) : String; +function GetThreadReport(ids : boolean = true; sep : String = '|') : String; function GetThreadCount : Integer; function GetThreadNameStatus : String; procedure closeThread; @@ -85,7 +86,8 @@ TFslLock = class(TFslObject) FOwnID: Integer; // unique serial number assigned to all critical sections FName: String; // Name of the critical section object - FLockName: Array of String; // Name of the current Lock (first one to grab) + FLockName: String; // Name(s) of the routines that have the Lock + FWaiting : TStringList; // list of thread ids waiting for the lock // debugging dead lock detection FDelayCount: Integer; // Number of times there has been a failed attempt to lock a critical section FUseCount: Integer; // The amount of times there has been a succesful attempt to lock a critical section FCurrLockTime: UInt64; // Time which the owning thread obtained the lock for the thread @@ -97,6 +99,7 @@ TFslLock = class(TFslObject) procedure MarkEntered; procedure MarkLeft; Function DebugSummary : String; + procedure Lock; Overload; Public constructor Create; Overload; constructor Create(AName: String); Overload; @@ -104,7 +107,6 @@ TFslLock = class(TFslObject) function link : TFslLock; overload; // core functionality - procedure Lock; Overload; procedure Lock(const Name: String); Overload; procedure Unlock; procedure Enter; Overload; @@ -137,6 +139,7 @@ TFslLock = class(TFslObject) Function CriticalSectionChecksPass(Var sMessage : String) : Boolean; function DumpLocks(all : boolean; sep : String = '') : String; +function NameLockedToThread(id : TThreadID) : string; Type TFslThreadHandle = TThreadHandle; @@ -176,6 +179,7 @@ function DumpLocks(all : boolean; sep : String = '') : String; function Terminated : boolean; Property Running : Boolean read FRunning; + Property Stopped : Boolean read FStopped; Property AutoFree : boolean read FAutoFree write FAutoFree; Property TimePeriod : cardinal read FTimePeriod write FTimePeriod; // milliseconds. If this is >0, execute will called after TimePeriod delay until Stopped @@ -695,7 +699,33 @@ function GetThreadCount : Integer; end; end; -function GetThreadReport : String; +function GetThreadInfoForThread(threadId: TThreadId): String; +var + id : TThreadId; + i : integer; + p : PThreadRecord; + s : String; +begin + EnterCriticalSection(GCritSct); + try + for i := GThreadList.Count - 1 downto 0 do + begin + p := GThreadList[i]; + if (p.id = threadId) then + begin + s := p.name; + if p.state <> '' then + s := s + '='+p.state; + break; + end; + end; + finally + LeaveCriticalSection(GCritSct); + end; + result := s; +end; + +function GetThreadReport(ids : boolean = true; sep : String = '|') : String; var i : integer; s : String; @@ -708,8 +738,8 @@ function GetThreadReport : String; begin p := GThreadList[i]; if (s <> '') then - s := s + '|'; - s := s + info(p, true); + s := s + sep; + s := s + info(p, ids); end; finally LeaveCriticalSection(GCritSct); @@ -816,7 +846,7 @@ procedure TFslExternalProcessThread.execute; i : integer; begin {$IFDEF FPC} - FLock.Lock; + FLock.Lock('execute'); try FStatus := epsRunning; FProcess := TProcess.create(nil); @@ -858,7 +888,7 @@ procedure TFslExternalProcessThread.execute; until BytesRead = 0; FExitCode := FProcess.ExitCode; finally - FLock.Lock; + FLock.Lock('execute2'); try FProcess.free; FProcess := nil; @@ -965,14 +995,15 @@ constructor TFslLock.Create; begin inherited Create; FName := ClassName; - SetLength(FLockName, 0); FDelayCount := 0; + FLockName := ''; FUseCount := 0; FCurrLockTime := 0; FTimeLocked := 0; FDelayTime := 0; FLockThread := NO_THREAD; FEntryCount := 0; + FWaiting := TStringList.create; if not GHaveCritSect then InitUnit; InitializeCriticalSection(FCritSect); @@ -982,19 +1013,17 @@ constructor TFslLock.Create; inc(GTotal); FOwnID := GTotal; if GFirst = NIL then - begin - FNext := NIL; - end + FNext := NIL else - begin + begin FNext := GFirst; FNext.FPrev := self; - end; + end; FPrev := NIL; GFirst := self; finally LeaveCriticalSection(GCritSct); - end; + end; end; procedure TFslLock.changeName(aName: String); @@ -1027,6 +1056,7 @@ destructor TFslLock.Destroy; end; end; DeleteCriticalSection(FCritSect); + FWaiting.free; inherited; end; @@ -1058,20 +1088,19 @@ procedure TFslLock.MarkEntered; inc(FUseCount); FCurrLockTime := GetTickCount64; end; - SetLength(FLockName, FEntryCount); end; procedure TFslLock.MarkLeft; begin assert(FLockThread = GetCurrentThreadID); dec(FEntryCount); - SetLength(FLockName, FEntryCount); if FEntryCount = 0 then - begin + begin FLockThread := NO_THREAD; FTimeLocked := FTimeLocked + (GetTickCount64 - FCurrLockTime); FCurrLockTime := 0; - end; + FLockName := ''; + end; end; function TFslLock.LockedToMe: Boolean; @@ -1085,29 +1114,45 @@ procedure TFslLock.Lock; begin // the current time is set by a successful trylock. if not TryLock then - begin - LStartTime := GetTickCount64; - EnterCriticalSection(FCritSect); - MarkEntered; - inc(FDelayTime, FCurrLockTime); - dec(FDelayTime, LStartTime); - inc(FDelayCount); + begin + EnterCriticalSection(GCritSct); + try + FWaiting.Add(inttostr(NativeUInt(ThreadID))); + finally + LeaveCriticalSection(GCritSct); end; + try + LStartTime := GetTickCount64; + EnterCriticalSection(FCritSect); + MarkEntered; + inc(FDelayTime, FCurrLockTime); + dec(FDelayTime, LStartTime); + inc(FDelayCount); + finally + EnterCriticalSection(GCritSct); + try + FWaiting.Delete(FWaiting.IndexOf(inttostr(NativeUInt(ThreadID)))); + finally + LeaveCriticalSection(GCritSct); + end; + end; + end; end; procedure TFslLock.Lock(const Name: String); begin Lock; - FLockName[FEntryCount - 1] := Name; + if (FLockName <> '') then + FLockName := Name+'; '+FLockName + else + FLockName := Name; end; function TFslLock.Trylock: Boolean; begin Result := TryEnterCriticalSection(FCritSect); if Result then - begin MarkEntered; - end; end; procedure TFslLock.Unlock; @@ -1172,13 +1217,13 @@ function TFslLock.DebugSummary: String; Col(IntToStr(FCurrLockTime), 9)+ Col(IntToStr(FTimeLocked), 10)+ Col(IntToStr(FDelayTime), 10)+ + Col(IntToStr(FEntryCount), 10)+ Col(threadToString(FLockThread), 9); - - for i := 0 to High(FLockName) do - if (i > 0) then - result := result + '|' + FLockName[i] + if FEntryCount > 0 then + if FWaiting.count > 0 then + result := result + FLockName+' ('+FWaiting.CommaText+')' else - result := result + FLockName[i]; + result := result + FLockName; end; Function CriticalSectionChecksPass(Var sMessage : String) : Boolean; @@ -1215,17 +1260,48 @@ function DumpLocks(all : boolean; sep : String = '') : String; if (sep = '') then sep := #13#10; - Result := IntToStr(TFslLock.CurrentCount) + ' Critical Sections (@'+InttoStr(GetTickCount64)+')'+sep; - Result := Result+'ID Name Use# Delay# Curr(ms) Total(ms) Delay(ms) Thread ID Routine'+sep; - oCrit := GFirst; - While oCrit <> nil Do - Begin - if all or (oCrit.EntryCount > 0) Then - Result := Result + oCrit.DebugSummary + sep; - oCrit := oCrit.FNext; - End; + if (all) then + begin + Result := IntToStr(TFslLock.CurrentCount) + ' Critical Sections (@'+InttoStr(GetTickCount64)+')'+sep; + Result := Result+'ID Name Use# Delay# Curr(ms) Total(ms) Delay(ms) #UseCount Thread ID Routine'+sep; + end + else + begin + Result := 'ID Name (of '+StringPadRight(inttostr(TFslLock.CurrentCount)+')', ' ', 6)+' Use# Delay# Curr(ms) Total(ms) Delay(ms) #UseCount Thread ID Routine'+sep; + end; + EnterCriticalSection(GCritSct); + try + oCrit := GFirst; + While oCrit <> nil Do + Begin + if all or (oCrit.EntryCount > 0) Then + Result := Result + oCrit.DebugSummary + sep; + oCrit := oCrit.FNext; + End; + finally + LeaveCriticalSection(GCritSct); + end; End; +function NameLockedToThread(id: TThreadID): string; +var + oCrit : TFslLock; +begin + result := ''; + EnterCriticalSection(GCritSct); + try + oCrit := GFirst; + While oCrit <> nil Do + Begin + if oCrit.FLockThread = id Then + CommaAdd(result, oCrit.Name); + oCrit := oCrit.FNext; + End; + finally + LeaveCriticalSection(GCritSct); + end; +end; + type TInternalThread = class (TThread) diff --git a/library/fsl/fsl_turtle.pas b/library/fsl/fsl_turtle.pas index 11c6822e2..d360ad63b 100644 --- a/library/fsl/fsl_turtle.pas +++ b/library/fsl/fsl_turtle.pas @@ -48,7 +48,7 @@ TTurtleObject = class (TFslObject) protected FStart : TSourceLocation; FStop : TSourceLocation; - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; virtual; abstract; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; virtual; abstract; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(start : TSourceLocation); overload; @@ -65,7 +65,7 @@ TTurtleLiteral = class (TTurtleObject) Fvalue : String; Ftype : String; protected - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(start : TSourceLocation); overload; @@ -84,7 +84,7 @@ TTurtleURL = class (TTurtleObject) Furi : String; procedure setUri(value : String); protected - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(start : TSourceLocation); overload; @@ -100,7 +100,7 @@ TTurtleList = class (TTurtleObject) private Flist : TFslList; protected - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(start : TSourceLocation); overload; @@ -118,7 +118,7 @@ TTurtleComplex = class (TTurtleObject) FPredicates : TFslMap; FNames : TStringList; protected - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; override; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(start : TSourceLocation); overload; @@ -148,7 +148,7 @@ TTurtlePredicate = class (TFslObject) FURL : TTurtleURL; FValue : TTurtleComplex; protected - function write(b : TStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; + function write(b : TFslStringBuilder; doc : TTurtleDocument; indent : integer) : boolean; function sizeInBytesV(magic : integer) : cardinal; override; public constructor Create(url : TTurtleURL; value : TTurtleComplex); @@ -229,7 +229,7 @@ TTurtleParser = class (TFslObject) TTurtleComposer = class (TFslObject) public - class procedure writePrefixes(b : TStringBuilder; doc : TTurtleDocument); + class procedure writePrefixes(b : TFslStringBuilder; doc : TTurtleDocument); public class function compose(doc : TTurtleDocument) : String; overload; class procedure compose(doc : TTurtleDocument; dest : TStream); overload; @@ -261,7 +261,7 @@ function sorted(list: TEnumerable): TArray; end; end; -procedure ln(b: TStringBuilder; line: String); +procedure ln(b: TFslStringBuilder; line: String); begin b.Append(line); b.Append(#13#10); @@ -325,7 +325,7 @@ function TTurtleLiteral.singleLiteral: String; result := FValue; end; -function TTurtleLiteral.write(b: TStringBuilder; doc: TTurtleDocument; indent: integer): boolean; +function TTurtleLiteral.write(b: TFslStringBuilder; doc: TTurtleDocument; indent: integer): boolean; var p : String; c : char; @@ -400,7 +400,7 @@ function TTurtleURL.singleLiteral: String; result := Furi; end; -function TTurtleURL.write(b: TStringBuilder; doc: TTurtleDocument; indent: integer): boolean; +function TTurtleURL.write(b: TFslStringBuilder; doc: TTurtleDocument; indent: integer): boolean; var s : String; begin @@ -470,7 +470,7 @@ function TTurtleList.singleLiteral: String; raise EWebException.create('Error finding single value: '+inttostr(FList.count)+' not found'); end; -function TTurtleList.write(b: TStringBuilder; doc: TTurtleDocument; indent: integer): boolean; +function TTurtleList.write(b: TFslStringBuilder; doc: TTurtleDocument; indent: integer): boolean; var first : boolean; obj : TTurtleObject; @@ -556,7 +556,7 @@ function TTurtleComplex.stringLiteral(uri: String): String; result := predicates[uri].singleLiteral; end; -function TTurtleComplex.write(b: TStringBuilder; doc: TTurtleDocument; indent: integer): boolean; +function TTurtleComplex.write(b: TFslStringBuilder; doc: TTurtleDocument; indent: integer): boolean; var left : String; i : integer; @@ -740,6 +740,7 @@ function TTurtleComplex.sizeInBytesV(magic : integer) : cardinal; constructor TTurtleLexer.Create(source: String); begin + inherited create; Fsource := source; cursor := 1; pos := TSourceLocation.Create; @@ -787,7 +788,7 @@ function TTurtleLexer.grab() : char; procedure TTurtleLexer.readNext(postColon : boolean); var ch : char; - b : TStringBuilder; + b : TFslStringBuilder; e, s : String; begin Ftoken := ''; @@ -797,7 +798,7 @@ procedure TTurtleLexer.readNext(postColon : boolean); exit; startPos := pos; ch := grab(); - b := TStringBuilder.create(); + b := TFslStringBuilder.create(); try case ch of '@', '.', ':', ';', '^', ',', ']', '[', '(', ')': @@ -895,12 +896,12 @@ procedure TTurtleLexer.readNext(postColon : boolean); function TTurtleLexer.unescape(s : String; isUri : boolean) : String; var - b : TStringBuilder; + b : TFslStringBuilder; i, l, uc : integer; ch : char; n : String; begin - b := TStringBuilder.create(); + b := TFslStringBuilder.create(); try i := 1; while (i <= s.length) do @@ -1391,7 +1392,7 @@ destructor TTurtlePredicate.Destroy; inherited; end; -function TTurtlePredicate.write(b: TStringBuilder; doc: TTurtleDocument; indent: integer): boolean; +function TTurtlePredicate.write(b: TFslStringBuilder; doc: TTurtleDocument; indent: integer): boolean; begin // FURL.write(b, doc, indent); b.append('<'); @@ -1491,10 +1492,10 @@ function TTurtleDocument.sizeInBytesV(magic : integer) : cardinal; class function TTurtleComposer.compose(doc: TTurtleDocument): String; var - b : TStringBuilder; + b : TFslStringBuilder; pred : TTurtlePredicate; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try writePrefixes(b, doc); for pred in doc.objects do @@ -1515,7 +1516,7 @@ class procedure TTurtleComposer.compose(doc: TTurtleDocument; dest: TFslStream); StringToStream(compose(doc), dest, TEncoding.UTF8); end; -class procedure TTurtleComposer.writePrefixes(b: TStringBuilder; doc: TTurtleDocument); +class procedure TTurtleComposer.writePrefixes(b: TFslStringBuilder; doc: TTurtleDocument); var p : String; done : boolean; diff --git a/library/fsl/fsl_unicode.pas b/library/fsl/fsl_unicode.pas index dbfe1b8d7..f0b20a770 100644 --- a/library/fsl/fsl_unicode.pas +++ b/library/fsl/fsl_unicode.pas @@ -34,7 +34,7 @@ interface uses - Classes, SysUtils, Contnrs, fsl_fpc; + Classes, SysUtils, Contnrs, fsl_fpc, fsl_utilities; const LRE = #$202a; @@ -147,14 +147,18 @@ class function TUnicodeUtilities.describe(c: UnicodeChar): String; class function TUnicodeUtilities.replaceBiDiChars(src: String): String; var - b : TStringBuilder; + b : TFslStringBuilder; c : UnicodeChar; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for c in unicodeChars(src) do if inSet(c, ALL_BIDI_CHARS) then - b.append('|'+describe(c)+'|') + begin + b.append('|'); + b.append(describe(c)); + b.append('|') + end else b.append(TEncoding.UTF8.getString(TEncoding.UTF8.GetBytes(c))); result := b.toString(); diff --git a/library/fsl/fsl_utilities.pas b/library/fsl/fsl_utilities.pas index 42b771da3..49c39bcbc 100644 --- a/library/fsl/fsl_utilities.pas +++ b/library/fsl/fsl_utilities.pas @@ -253,6 +253,7 @@ function clength(b : TBytes) : cardinal; overload; Function StringArrayExists(Const aNames : Array Of String; Const sName: String) : Boolean; Overload; Function StringGet(Const sValue : String; iIndex : Integer) : Char; Overload; Function StringStartsWith(Const sValue, sFind : String; sensitive : boolean = false) : Boolean; Overload; +Function StringStartsWith(Const sValue : String; aFind : Array of String; sensitive : boolean = false) : Boolean; Overload; Function StringStartsWithSensitive(Const sValue, sFind : String) : Boolean; Overload; Function StringStartsWithInsensitive(Const sValue, sFind : String) : Boolean; Overload; Function StringEndsWith(Const sValue, sFind : String; sensitive : boolean = false) : Boolean; Overload; @@ -454,8 +455,11 @@ function isAbsoluteUrl(s: String): boolean; Function AnsiStringSplit(Const sValue : AnsiString; Const aDelimiters : TAnsiCharSet; Var sLeft, sRight: AnsiString) : Boolean; Function AnsiPadString(const AStr: AnsiString; AWidth: Integer; APadChar: AnsiChar; APadLeft: Boolean): AnsiString; -Type +const + DEFAULT_STRING_DELTA = 256-12; + LARGE_STRING_DELTA = 2048; +Type { TCommaSeparatedStringBuilder } TCommaSeparatedStringBuilder = class (TFslObject) @@ -473,25 +477,33 @@ TCommaSeparatedStringBuilder = class (TFslObject) function makeString : String; end; + { TFslStringBuilder } + TFslStringBuilder = Class (TFslObject) Private - FBuilder : TStringBuilder; + FSource : String; + FCursor : Integer; + FDelta : Word; Function GetLength : Integer; function GetAsString: String; + procedure doAppend(s : String); Public constructor Create; Override; + constructor Create(delta : word); Overload; + constructor Create(initial : String; delta : word = DEFAULT_STRING_DELTA); Overload; destructor Destroy; Override; Property AsString : String read GetAsString; Procedure Clear; Procedure Append(ch : Char); Overload; + Procedure Append(c : Cardinal); Overload; Procedure Append(Const sStr : String); Overload; {$IFNDEF FPC} Procedure Append(Const sStr : AnsiString); Overload; {$ENDIF} - Procedure AppendLine(Const sStr : String); Overload; + Procedure AppendLine(Const sStr : String = ''); Overload; Procedure AppendPadded(Const sStr : String; iCount : Integer; cPad : Char = ' '); Procedure AppendFixed(Const sStr : String; iCount : Integer; cPad : Char = ' '); Procedure Append(Const oBuilder : TFslStringBuilder); Overload; @@ -516,6 +528,7 @@ TCommaSeparatedStringBuilder = class (TFslObject) Property Length : Integer Read GetLength; function ToString : String; override; + function MemSize() : integer; End; type @@ -867,26 +880,26 @@ TTimeStamp = record } TFslDateTime = record private - Source : String; // for debugging convenience, and also used to mark whether the record has any content - year: Smallint; - month: Word; - day: Word; - hour: Word; - minute: Word; - second: Word; - fraction: Cardinal; + FSource : String; // for debugging convenience, and also used to mark whether the record has any content + FYear: Smallint; + FMonth: Word; + FDay: Word; + FHour: Word; + FMinute: Word; + FSecond: Word; + FFraction: Cardinal; { The precision to which the date and time is specified } FPrecision : TFslDateTimePrecision; - FractionPrecision : integer; + FFractionPrecision : integer; { The type of timezone } - TimezoneType : TFslDateTimeTimezone; - TimeZoneHours : Integer; - TimezoneMins : Integer; + FTimezoneType : TFslDateTimeTimezone; + FTimeZoneHours : Integer; + FTimezoneMins : Integer; procedure clear(); procedure check; function checkNoException : boolean; @@ -895,6 +908,20 @@ TFslDateTime = record function tz(sep: String): String; public + property Source : String read FSource; + property Year: Smallint read FYear; + property Month: Word read FMonth; + property Day: Word read FDay; + property Hour: Word read FHour; + property Minute: Word read FMinute; + property Second: Word read FSecond; + property Fraction: Cardinal read FFraction; + property Precision : TFslDateTimePrecision read FPrecision; + property FractionPrecision : integer read FFractionPrecision; + property TimezoneType : TFslDateTimeTimezone read FTimezoneType; + property TimeZoneHours : Integer read FTimeZoneHours; + property TimezoneMins : Integer read FTimezoneMins; + // various kind of constructors class function makeNull : TFslDateTime; static; // because this is record, not a class, it can't be nil. use makeNull / null instead class function makeUTC : TFslDateTime; overload; static; // now, in UTC timezone @@ -990,8 +1017,6 @@ TFslDateTime = record class function isValidXmlDate(value : String) : Boolean; static; class function isValidDate(format, date: String; AllowBlankTimes: Boolean = False; allowNoDay: Boolean = False; allownodate: Boolean = False; noFixYear : boolean = false) : boolean; static; - property Precision : TFslDateTimePrecision read FPrecision; - function clone : TFslDateTime; function link : TFslDateTime; @@ -1644,6 +1669,8 @@ function StringIsDecimal(s : String) : Boolean; type TByte = Byte; + { TFslBytesBuilder } + TFslBytesBuilder = Class (TFslObject) Private FContent : TBytes; @@ -1663,6 +1690,7 @@ function StringIsDecimal(s : String) : Boolean; Function EndsWith(aBytes : TBytes) : Boolean; Property Length : Cardinal Read FLength; + Procedure AddByte(val : byte); Procedure AddWord(val : word); Procedure AddCardinal(val : cardinal); Procedure AddInteger(val : integer); @@ -1864,6 +1892,8 @@ TCacheInformation = class (TFslObject) end; +function RoundDateTimeToNearestInterval(vTime : TDateTime; vInterval : TDateTime = 60/SecsPerDay) : TDateTime; + Implementation Uses @@ -2862,7 +2892,7 @@ procedure FileSetModified(Const sFileName : String; time : TDateTime); var f : TFileStream; begin - f := TFileStream.create(sFileName, fmOpenRead); + f := TFileStream.create(sFileName, fmOpenRead + fmShareDenyWrite); try result := f.size; finally @@ -5455,6 +5485,15 @@ class procedure TFileLauncher.Open(const FilePath: string); End; +Function StringStartsWith(Const sValue : String; aFind : Array of String; sensitive : boolean = false) : Boolean; +var + s : String; +begin + result := false; + for s in aFind do + if StringStartsWith(sValue, s, sensitive) then + exit(true); +end; Function StringEqualsSensitive(Const sA, sB : String) : Boolean; Begin @@ -6176,7 +6215,10 @@ function jsonUnescape(s : String) : String; b.append(chr(StrToInt('$'+hex))); end Else - b.append('?'+ch); + begin + b.append('?'); + b.append(ch); + end; End; End Else if (ch = '"') then @@ -6550,351 +6592,102 @@ function AnsiPadString(const AStr: AnsiString; AWidth: Integer; APadChar: AnsiCh end; end; -{$IFDEF NO_BUILDER} - - -Constructor TFslStringBuilder.Create; -Begin - Inherited; - - FBufferSize := BUFFER_INCREMENT_SIZE; -End; - - -Destructor TFslStringBuilder.Destroy; -Begin +constructor TFslStringBuilder.Create; +begin inherited; -End; - - -Procedure TFslStringBuilder.Clear; -Begin - FContent := ''; - FLength := 0; -End; - - -Function TFslStringBuilder.ToString : String; -Begin - Result := Copy(FContent, 1, FLength); -End; - - -Procedure TFslStringBuilder.AppendPadded(Const sStr : String; iCount : Integer; cPad : Char = ' '); -Var - iLen : Integer; -Begin - iLen := IntegerMax(System.Length(sStr), iCount); - - If (iLen > 0) Then - Begin - If FLength + iLen > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + IntegerMax(FBufferSize, iLen)); - - Move(sStr[1], FContent[FLength + 1], System.Length(sStr) * SizeOf(Char)); - - If iLen = iCount Then - FillChar(FContent[FLength + 1 + System.Length(sStr)], (iCount - System.Length(sStr)) * SizeOf(Char), cPad); - - Inc(FLength, iLen); - End; -End; - - -Function TFslStringBuilder.AsString: String; -Begin - Result := ToString; -End; - - -Procedure TFslStringBuilder.AppendFixed(Const sStr : String; iCount : Integer; cPad : Char = ' '); -Begin - If (iCount > 0) Then - Begin - If FLength + iCount > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + IntegerMax(FBufferSize, iCount)); - Move(sStr[1], FContent[FLength + 1], IntegerMin(System.Length(sStr), iCount) * SizeOf(Char)); - - If System.Length(sStr) < iCount Then - FillChar(FContent[FLength + 1 + System.Length(sStr)], (iCount - System.Length(sStr)) * SizeOf(Char), cPad); - - Inc(FLength, iCount); - End; -End; - - -Procedure TFslStringBuilder.Append(ch : Char); -Begin - If FLength + 1 > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + FBufferSize); - - Move(ch, FContent[FLength + 1], SizeOf(Char)); - Inc(FLength); -End; - - -Procedure TFslStringBuilder.Append(Const sStr : String); -Begin - If (sStr <> '') Then - Begin - If FLength + System.Length(sStr) > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + IntegerMax(FBufferSize, System.Length(sStr))); - - Move(sStr[1], FContent[FLength + 1], System.Length(sStr) * SizeOf(Char)); - - Inc(FLength, System.Length(sStr)); - End; -End; - - -Procedure TFslStringBuilder.Append(Const oBuilder : TFslStringBuilder); -Begin - Append(oBuilder.ToString); -End; - - -Procedure TFslStringBuilder.AppendEOL; -Begin - Append(cReturn); -End; - - -Procedure TFslStringBuilder.Append(Const iInt : Integer); -Begin - Append(IntegerToString(iInt)); -End; - - -Procedure TFslStringBuilder.Insert(Const sStr : String; iIndex : Integer); -Begin - If (sStr <> '') Then - Begin - If FLength + System.Length(sStr) > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + IntegerMax(FBufferSize, System.Length(sStr))); - - If (iIndex) <> FLength Then - Move(FContent[iIndex+1], FContent[iIndex+1 + System.Length(sStr)], (FLength - iIndex) * SizeOf(Char)); - - Move(sStr[1], FContent[iIndex+1], System.Length(sStr) * SizeOf(Char)); - - Inc(FLength, System.Length(sStr)); - End; -End; - - -Procedure TFslStringBuilder.Insert(Const oBuilder : TFslStringBuilder; iIndex : Integer); -Begin - Insert(oBuilder.ToString, iIndex); -End; - - -Procedure TFslStringBuilder.Delete(iIndex, iLength : Integer); -Begin - System.Delete(FContent, iIndex+1, iLength); - Dec(FLength, iLength); -End; - - -Function TFslStringBuilder.IndexOf(Const sStr : String; bCase : Boolean = False) : Integer; -Var - iLoop : Integer; - iUpper : Integer; - iLen : Integer; -Begin - Result := -1; - iLoop := 1; - iLen := System.Length(sStr); - iUpper := FLength - iLen + 1; - - While (Result = -1) And (iLoop <= iUpper) Do - Begin - If (bCase And (Copy(FContent, iLoop, iLen) = sStr)) Or (Not bCase And StringEquals(Copy(FContent, iLoop, iLen), sStr)) Then - Result := iLoop - 1; - - Inc(iLoop); - End; -End; - - -Function TFslStringBuilder.LastIndexOf(Const sStr : String; bCase : Boolean = False) : Integer; -Var - iLoop : Integer; - iUpper : Integer; - iLen : Integer; -Begin - Result := -1; - iLen := System.Length(sStr); - iUpper := FLength - iLen + 1; - iLoop := iUpper; - While (Result = -1) And (iLoop > 0) Do - Begin - If (bCase And (Copy(FContent, iLoop, iLen) = sStr)) Or (Not bCase And StringEquals(Copy(FContent, iLoop, iLen), sStr)) Then - Result := iLoop - 1; - - Dec(iLoop); - End; -End; - - -Procedure TFslStringBuilder.Append(Const bytes : TBytes); -Begin -{$IFNDEF FPC} -If (System.length(bytes) > 0) Then - Begin - If FLength + iBytes > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + Integermax(FBufferSize, iBytes)); - - oStream.Read(FContent[FLength + 1], iBytes); - - Inc(FLength, iBytes); - End; -{$ENDIF} -End; - - -Procedure TFslStringBuilder.Insert(Const bytes : TBytes; iBytes : Integer; iIndex : Integer); -Begin - {$IFNDEF FPC} - If (iBytes > 0) Then - Begin - If FLength + iBytes > System.Length(FContent) Then - SetLength(FContent, System.Length(FContent) + IntegerMax(FBufferSize, iBytes)); - - If (iIndex) <> FLength Then - Move(FContent[iIndex+1], FContent[iIndex+1 + iBytes], (FLength - iIndex) * SizeOf(Char)); - - oStream.Read(FContent[iIndex + 1], iBytes); - - Inc(FLength, iBytes); - End; - {$ENDIF} -End; - - - -Procedure TFslStringBuilder.CommaAdd(const sStr: String); -Begin - if Length > 0 Then - Append(', '); - Append(sStr); -End; - - -Procedure TFslStringBuilder.AddCardinalAsBytes(iVal: Cardinal); -Var - s : AnsiString; -Begin - SetLength(s, 4); - move(iVal, s[1], 4); - Append(s); -End; - - -Procedure TFslStringBuilder.AddWordAsBytes(iVal: word); -Var - s : AnsiString; -Begin - SetLength(s, 2); - move(iVal, s[1], 2); - Append(s); -End; - - -Procedure TFslStringBuilder.AddInt64AsBytes(iVal: Int64); -Var - s : AnsiString; -Begin - SetLength(s, 8); - move(iVal, s[1], 8); - Append(s); -End; - - -Procedure TFslStringBuilder.AddByteAsBytes(iVal: Byte); -Var - s : AnsiString; -Begin - SetLength(s, 1); - move(iVal, s[1], 1); - Append(s); -End; - - -Procedure TFslStringBuilder.AppendLine(const sStr: String); -Begin - Append(sStr); - AppendEOL; -End; + FSource := ''; + FCursor := 0; + FDelta := DEFAULT_STRING_DELTA; +end; -procedure TFslStringBuilder.Append(const bBytes: array of Byte; amount: Integer); -var - i : integer; +constructor TFslStringBuilder.Create(delta: word); begin - for i := 0 to amount - 1 Do - Append(chr(bBytes[i])); - + inherited Create; + FSource := ''; + FCursor := 0; + FDelta := delta; end; - -procedure TFslStringBuilder.Overwrite(index: integer; content: String); +constructor TFslStringBuilder.Create(initial : String; delta : word = DEFAULT_STRING_DELTA); begin - if index < 1 Then - RaiseError('Overwrite', 'index < 1'); - if index + System.length(Content) > FLength Then - RaiseError('Overwrite', 'index > length'); - if content <> '' Then - Move(Content[1], FContent[index], System.length(Content)); + inherited create; + FSource := ''; + FCursor := 0; + FDelta := delta; + doAppend(initial); end; -procedure TFslStringBuilder.Read(index: integer; var buffer; ilength: integer); +destructor TFslStringBuilder.Destroy; begin - if index < 1 Then - RaiseError('Read', 'index < 1'); - if index + length > FLength Then - RaiseError('Read', 'index > length'); - Move(FContent[index], buffer, length); + inherited; end; -{$ELSE} - +function TFslStringBuilder.GetLength: Integer; +begin + result := FCursor; +end; -Procedure TFslStringBuilder.Clear; +procedure TFslStringBuilder.Clear; Begin - FBuilder.Clear; + FCursor := 0; End; - -Function TFslStringBuilder.GetAsString : String; +function TFslStringBuilder.GetAsString: String; Begin - Result := FBuilder.ToString; + result := FSource.subString(0, FCursor); End; +procedure TFslStringBuilder.doAppend(s: String); +var + delta : Integer; +begin + if (s <> '') then + begin + if (s.length + FCursor > FSource.length) then + begin + delta := FDelta; + while delta < s.length do + delta := delta + FDelta; + SetLength(FSource, FSource.length+delta); + end; + + move(s[1], FSource[FCursor+1], s.length * sizeof(char)); + inc(FCursor, s.length); + if (FCursor > 1024) then + FDelta := LARGE_STRING_DELTA; + end; +end; -Procedure TFslStringBuilder.AppendPadded(Const sStr : String; iCount : Integer; cPad : Char = ' '); +procedure TFslStringBuilder.AppendPadded(const sStr: String; iCount: Integer; + cPad: Char); Begin - FBuilder.Append(StringPadRight(sStr, cPad, iCount)); + doAppend(StringPadRight(sStr, cPad, iCount)); End; -Procedure TFslStringBuilder.AppendFixed(Const sStr : String; iCount : Integer; cPad : Char = ' '); +procedure TFslStringBuilder.AppendFixed(const sStr: String; iCount: Integer; + cPad: Char); Begin - FBuilder.Append(StringPadRight(copy(sStr, 1, iCount), cPad, iCount)); + doAppend(StringPadRight(copy(sStr, 1, iCount), cPad, iCount)); End; -Procedure TFslStringBuilder.Append(ch : Char); +procedure TFslStringBuilder.Append(ch: Char); Begin - FBuilder.Append(ch); + doAppend(ch); End; -Procedure TFslStringBuilder.Append(Const sStr : String); +procedure TFslStringBuilder.Append(c: Cardinal); +begin + append(inttostr(c)); +end; + +procedure TFslStringBuilder.Append(const sStr: String); Begin - FBuilder.Append(sStr); + doAppend(sStr); End; - - -Procedure TFslStringBuilder.Append(Const oBuilder : TFslStringBuilder); +procedure TFslStringBuilder.Append(const oBuilder: TFslStringBuilder); Begin Append(oBuilder.AsString); End; @@ -6906,19 +6699,30 @@ procedure TFslStringBuilder.Append(const sStr: AnsiString); end; {$ENDIF} -Procedure TFslStringBuilder.AppendEOL; +procedure TFslStringBuilder.AppendEOL; Begin Append(cReturn); End; -Procedure TFslStringBuilder.Insert(Const sStr : String; iIndex : Integer); +procedure TFslStringBuilder.Insert(const sStr: String; iIndex: Integer); Begin - FBuilder.Insert(iIndex, sStr); + If (sStr <> '') Then + Begin + If FCursor + sStr.Length > FSource.Length Then + SetLength(FSource, FSource.Length + IntegerMax(FDelta, sStr.length)); + + If (iIndex) <> FCursor Then + Move(FSource[iIndex+1], FSource[iIndex+1 + sStr.length], (FCursor - iIndex) * SizeOf(Char)); + + Move(sStr[1], FSource[iIndex+1], sStr.length * SizeOf(Char)); + + Inc(FCursor, sStr.length); + End; End; -Procedure TFslStringBuilder.Insert(Const oBuilder : TFslStringBuilder; iIndex : Integer); +procedure TFslStringBuilder.Insert(const oBuilder: TFslStringBuilder; iIndex: Integer); Begin Insert(oBuilder.AsString, iIndex); End; @@ -6929,34 +6733,21 @@ procedure TFslStringBuilder.seperator(sep: String); Append(sep); end; -function TFslStringBuilder.toString: String; +function TFslStringBuilder.ToString: String; begin result := AsString; end; -Procedure TFslStringBuilder.Delete(iIndex, iLength : Integer); -Begin - FBuilder.Remove(iIndex, iLength); -End; - - -destructor TFslStringBuilder.Destroy; -begin - FBuilder.free; - inherited; -end; - -function TFslStringBuilder.GetLength: Integer; +function TFslStringBuilder.MemSize(): integer; begin - result := FBuilder.Length; + result := SizeOf(self); end; -constructor TFslStringBuilder.Create; -begin - inherited; - FBuilder := TStringBuilder.Create; - FBuilder.Capacity := 2048; -end; +procedure TFslStringBuilder.Delete(iIndex, iLength: Integer); +Begin + System.delete(FSource, iIndex, iLength); + dec(FCursor, iLength); +End; procedure TFslStringBuilder.CommaAdd(const sStr: String); begin @@ -7011,12 +6802,12 @@ procedure TFslStringBuilder.AddByteAsBytes(iVal: Byte); Append(s); end; -procedure TFslStringBuilder.AppendLine(const sStr: String); +procedure TFslStringBuilder.AppendLine(const sStr: String = ''); begin - Append(sStr); + if (sStr <> '') then + Append(sStr); AppendEOL; end; -{$ENDIF} procedure TFslStringBuilder.WriteToStream(aStream: TStream; encoding : TEncoding); var @@ -7804,10 +7595,10 @@ function TFslDateTime.add(length: TDuration): TFslDateTime; begin result := makeUTC(dateTime + length); result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := TimezoneType; - result.TimeZoneHours := TimeZoneHours; - result.TimezoneMins := TimezoneMins; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := FTimezoneType; + result.FTimeZoneHours := FTimeZoneHours; + result.FTimezoneMins := FTimezoneMins; end; function TFslDateTime.precisionMatches(other: TFslDateTime): boolean; @@ -7815,23 +7606,23 @@ function TFslDateTime.precisionMatches(other: TFslDateTime): boolean; this, that : TFslDateTimePrecision; begin this := FPrecision; - if (this = dtpNanoSeconds) and (fraction = 0) then + if (this = dtpNanoSeconds) and (FFraction = 0) then this := dtpSec; that := other.FPrecision; - if (that = dtpNanoSeconds) and (fraction = 0) then + if (that = dtpNanoSeconds) and (FFraction = 0) then that := dtpSec; result := this = that; if result and (this = dtpNanoSeconds) then - result := FractionPrecision = other.FractionPrecision; + result := FFractionPrecision = other.FFractionPrecision; end; function TFslDateTime.canCompare(other: TFslDateTime): boolean; begin if not precisionMatches(other) then exit(false) - else if (TimezoneType = dttzUnknown) and (other.TimezoneType = dttzUnknown) then + else if (FTimezoneType = dttzUnknown) and (other.FTimezoneType = dttzUnknown) then exit(true) - else if (TimezoneType = dttzUnknown) or (other.TimezoneType = dttzUnknown) then + else if (FTimezoneType = dttzUnknown) or (other.FTimezoneType = dttzUnknown) then exit(false) else exit(true); @@ -7842,23 +7633,23 @@ procedure TFslDateTime.check; err : String; begin err := ''; - if (year < 0001) or (year > 9999) then + if (FYear < 0001) or (FYear > 9999) then err := 'Year is not valid' - else if (FPrecision >= dtpMonth) and ((Month > 12) or (Month < 1)) then + else if (FPrecision >= dtpMonth) and ((FMonth > 12) or (FMonth < 1)) then err := 'Month is not valid' - else if (FPrecision >= dtpDay) and ((Day < 1) or (Day >= 32) or (MONTHS_DAYS[IsLeapYear(Year)][TMonthOfYear(Month)] < Day)) then - err := 'Day is not valid for '+inttostr(Year)+'/'+inttostr(Month) - else if (FPrecision >= dtpHour) and (Hour > 23) then + else if (FPrecision >= dtpDay) and ((FDay < 1) or (FDay >= 32) or (MONTHS_DAYS[IsLeapYear(FYear)][TMonthOfYear(FMonth)] < FDay)) then + err := 'Day is not valid for '+inttostr(FYear)+'/'+inttostr(FMonth) + else if (FPrecision >= dtpHour) and (FHour > 23) then err := 'Hour is not valid' - else if (FPrecision >= dtpMin) and (Minute > 59) then + else if (FPrecision >= dtpMin) and (FMinute > 59) then err := 'Minute is not valid' - else if (FPrecision >= dtpSec) and (Second > 59) then + else if (FPrecision >= dtpSec) and (FSecond > 59) then err := 'Second is not valid' - else if (FPrecision >= dtpNanoSeconds) and (FractionPrecision > 999999999) then + else if (FPrecision >= dtpNanoSeconds) and (FFractionPrecision > 999999999) then err := 'Fraction is not valid' - else if (TimezoneType = dttzSpecified) and ((TimezoneHours < -13) or (TimezoneHours > 14)) then + else if (FTimezoneType = dttzSpecified) and ((FTimezoneHours < -13) or (FTimezoneHours > 14)) then err := 'Timezone hours is not valid' - else if (TimezoneType = dttzSpecified) and not ((TimezoneMins = 0) or (TimezoneMins = 15) or (TimezoneMins = 30) or (TimezoneMins = 45)) then + else if (FTimezoneType = dttzSpecified) and not ((FTimezoneMins = 0) or (FTimezoneMins = 15) or (FTimezoneMins = 30) or (FTimezoneMins = 45)) then err := 'Timezone minutes is not valid'; if err <> '' then raise EDateFormatError.Create(err+' ('+privToString+')'); @@ -7869,42 +7660,42 @@ function TFslDateTime.checkNoException: boolean; err : String; begin err := ''; - if (year < 1000) or (year > 3000) then + if (FYear < 1000) or (FYear > 3000) then err := 'Year is not valid' - else if (FPrecision >= dtpMonth) and ((Month > 12) or (Month < 1)) then + else if (FPrecision >= dtpMonth) and ((FMonth > 12) or (FMonth < 1)) then err := 'Month is not valid' - else if (FPrecision >= dtpDay) and ((Day < 1) or (Day >= 32) or (MONTHS_DAYS[IsLeapYear(Year)][TMonthOfYear(Month)] < Day)) then - err := 'Day is not valid for '+inttostr(Year)+'/'+inttostr(Month) - else if (FPrecision >= dtpHour) and (Hour > 23) then + else if (FPrecision >= dtpDay) and ((FDay < 1) or (FDay >= 32) or (MONTHS_DAYS[IsLeapYear(FYear)][TMonthOfYear(FMonth)] < FDay)) then + err := 'Day is not valid for '+inttostr(FYear)+'/'+inttostr(FMonth) + else if (FPrecision >= dtpHour) and (FHour > 23) then err := 'Hour is not valid' - else if (FPrecision >= dtpMin) and (Minute > 59) then + else if (FPrecision >= dtpMin) and (FMinute > 59) then err := 'Minute is not valid' - else if (FPrecision >= dtpSec) and (Second > 59) then + else if (FPrecision >= dtpSec) and (FSecond > 59) then err := 'Second is not valid' - else if (FPrecision >= dtpNanoSeconds) and (FractionPrecision > 999999999) then + else if (FPrecision >= dtpNanoSeconds) and (FFractionPrecision > 999999999) then err := 'Fraction is not valid' - else if (TimezoneType = dttzSpecified) and ((TimezoneHours < -13) or (TimezoneHours > 14)) then + else if (FTimezoneType = dttzSpecified) and ((FTimezoneHours < -13) or (FTimezoneHours > 14)) then err := 'Timezone hours is not valid' - else if (TimezoneType = dttzSpecified) and not ((TimezoneMins = 0) or (TimezoneMins = 15) or (TimezoneMins = 30) or (TimezoneMins = 45)) then + else if (FTimezoneType = dttzSpecified) and not ((FTimezoneMins = 0) or (FTimezoneMins = 15) or (FTimezoneMins = 30) or (FTimezoneMins = 45)) then err := 'Timezone minutes is not valid'; result := err = ''; end; procedure TFslDateTime.clear(); begin - Source := ''; - year := 0; - month := 0; - day := 0; - hour := 0; - minute := 0; - second := 0; - fraction := 0; + FSource := ''; + FYear := 0; + FMonth := 0; + FDay := 0; + FHour := 0; + FMinute := 0; + FSecond := 0; + FFraction := 0; FPrecision := dtpYear; - FractionPrecision := 0; - TimezoneType := dttzUnknown; - TimeZoneHours := 0; - TimezoneMins := 0; + FFractionPrecision := 0; + FTimezoneType := dttzUnknown; + FTimeZoneHours := 0; + FTimezoneMins := 0; end; function TFslDateTime.compare(other: TFslDateTime): integer; @@ -7972,36 +7763,36 @@ class function TFslDateTime.compareTimeStrings(left, right: String): TComparison function TFslDateTime.compareTimes(other: TFslDateTime; def: TComparisonQuadState): TComparisonQuadState; begin - if (self.year < other.year) then + if (self.FYear < other.FYear) then exit(compLess) - else if (self.year > other.year) then + else if (self.FYear > other.FYear) then exit(compGreater) else if (self.FPrecision = dtpYear) and (other.FPrecision = dtpYear) then exit(compEqual) else if (self.FPrecision = dtpYear) or (other.FPrecision = dtpYear) then exit(def); - if (self.month < other.month) then + if (self.FMonth < other.FMonth) then exit(compLess) - else if (self.month > other.month) then + else if (self.FMonth > other.FMonth) then exit(compGreater) else if (self.FPrecision = dtpMonth) and (other.FPrecision = dtpMonth) then exit(compEqual) else if (self.FPrecision = dtpMonth) or (other.FPrecision = dtpMonth) then exit(def); - if (self.day < other.day) then + if (self.FDay < other.FDay) then exit(compLess) - else if (self.day > other.day) then + else if (self.FDay > other.FDay) then exit(compGreater) else if (self.FPrecision = dtpDay) and (other.FPrecision = dtpDay) then exit(compEqual) else if (self.FPrecision = dtpDay) or (other.FPrecision = dtpDay) then exit(def); - if (self.hour < other.hour) then + if (self.FHour < other.FHour) then exit(compLess) - else if (self.hour > other.hour) then + else if (self.FHour > other.FHour) then exit(compGreater); // hour is not a valid precision // else if (self.FPrecision = dtpHour) and (other.FPrecision = dtpHour) then @@ -8009,25 +7800,25 @@ function TFslDateTime.compareTimes(other: TFslDateTime; def: TComparisonQuadStat // else if (self.FPrecision = dtpHour) or (other.FPrecision = dtpHour) then // exit(def); - if (self.minute < other.minute) then + if (self.FMinute < other.FMinute) then exit(compLess) - else if (self.minute > other.minute) then + else if (self.FMinute > other.FMinute) then exit(compGreater) else if (self.FPrecision = dtpMin) and (other.FPrecision = dtpMin) then exit(compEqual) else if (self.FPrecision = dtpMin) or (other.FPrecision = dtpMin) then exit(def); - if (self.second < other.second) then + if (self.FSecond < other.FSecond) then exit(compLess) - else if (self.second > other.second) then + else if (self.FSecond > other.FSecond) then exit(compGreater) else if (self.FPrecision = dtpSec) and (other.FPrecision = dtpSec) then exit(compEqual); - if (self.fraction < other.fraction) then + if (self.FFraction < other.FFraction) then exit(compLess) - else if (self.fraction > other.fraction) then + else if (self.FFraction > other.FFraction) then exit(compGreater) else exit(compEqual); @@ -8052,19 +7843,19 @@ function TFslDateTime.compareUsingFhirPathRules(other: TFslDateTime; equivalence function TFslDateTime.clone: TFslDateTime; begin - result.Source := Source; - result.year := year; - result.month := month; - result.day := day; - result.hour := hour; - result.minute := minute; - result.second := second; - result.fraction := fraction; + result.FSource := FSource; + result.FYear := FYear; + result.FMonth := FMonth; + result.FDay := FDay; + result.FHour := FHour; + result.FMinute := FMinute; + result.FSecond := FSecond; + result.FFraction := FFraction; result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := TimezoneType; - result.TimeZoneHours := TimeZoneHours; - result.TimezoneMins := TimezoneMins; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := FTimezoneType; + result.FTimeZoneHours := FTimeZoneHours; + result.FTimezoneMins := FTimezoneMins; end; function TFslDateTime.DateTime: TDateTime; @@ -8074,13 +7865,13 @@ function TFslDateTime.DateTime: TDateTime; check; case FPrecision of - dtpYear : Result := EncodeDate(Year, 1, 1); - dtpMonth : Result := EncodeDate(Year, Month, 1); - dtpDay: Result := EncodeDate(Year, Month, Day); - dtpHour : Result := EncodeDate(Year, Month, Day) + EncodeTime(Hour, 0, 0, 0); - dtpMin : Result := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, 0, 0); - dtpSec : Result := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, 0); - dtpNanoSeconds : Result := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, Fraction div 1000000); + dtpYear : Result := EncodeDate(FYear, 1, 1); + dtpMonth : Result := EncodeDate(FYear, FMonth, 1); + dtpDay: Result := EncodeDate(FYear, FMonth, FDay); + dtpHour : Result := EncodeDate(FYear, FMonth, FDay) + EncodeTime(FHour, 0, 0, 0); + dtpMin : Result := EncodeDate(FYear, FMonth, FDay) + EncodeTime(FHour, FMinute, 0, 0); + dtpSec : Result := EncodeDate(FYear, FMonth, FDay) + EncodeTime(FHour, FMinute, FSecond, 0); + dtpNanoSeconds : Result := EncodeDate(FYear, FMonth, FDay) + EncodeTime(FHour, FMinute, FSecond, FFraction div 1000000); else Result := 0; end; @@ -8095,14 +7886,14 @@ function TFslDateTime.equal(other: TFslDateTime; precision: TFslDateTimePrecisio begin result := (FPrecision >= precision) and (other.Precision >= precision) and - (year = other.year) and - ((precision < dtpMonth) or (month = other.month)) and - ((precision < dtpDay) or (day = other.day)) and - ((precision < dtpHour) or (hour = other.hour)) and - ((precision < dtpMin) or (minute = other.minute)) and - ((precision < dtpSec) or (second = other.second)) and - ((precision < dtpNanoSeconds) or ((fraction = other.fraction) and (FractionPrecision = other.FractionPrecision))) and - (TimezoneType = other.TimezoneType) and (TimeZoneHours = other.TimeZoneHours) and (TimezoneMins = other.TimezoneMins); + (FYear = other.FYear) and + ((precision < dtpMonth) or (FMonth = other.FMonth)) and + ((precision < dtpDay) or (FDay = other.FDay)) and + ((precision < dtpHour) or (FHour = other.FHour)) and + ((precision < dtpMin) or (FMinute = other.FMinute)) and + ((precision < dtpSec) or (FSecond = other.FSecond)) and + ((precision < dtpNanoSeconds) or ((FFraction = other.FFraction) and (FFractionPrecision = other.FFractionPrecision))) and + (FTimezoneType = other.FTimezoneType) and (FTimeZoneHours = other.FTimeZoneHours) and (FTimezoneMins = other.FTimezoneMins); end; procedure FindBlock(ch: Char; const s: String; var start, blength: Integer); @@ -8133,16 +7924,16 @@ class function TFslDateTime.make(value: TDateTime; tz: TFslDateTimeTimezone): TF yr: Word; begin result.clear; - DecodeTime(value, result.Hour, result.Minute, result.Second, ms); - result.Fraction := ms * 1000000; - if result.second > 59 then + DecodeTime(value, result.FHour, result.FMinute, result.FSecond, ms); + result.FFraction := ms * 1000000; + if result.FSecond > 59 then raise ELibraryException.create('Fail!'); - DecodeDate(value, yr, result.Month, result.Day); - result.Year := yr; + DecodeDate(value, yr, result.FMonth, result.FDay); + result.FYear := yr; result.FPrecision := dtpNanoSeconds; - result.FractionPrecision := 3; - result.TimezoneType := tz; - result.Source := 'makeDT'; + result.FFractionPrecision := 3; + result.FTimezoneType := tz; + result.FSource := 'makeDT'; end; class function TFslDateTime.makeLocal(precision: TFslDateTimePrecision): TFslDateTime; @@ -8174,7 +7965,7 @@ function checkFormat(format : String) : string; class function TFslDateTime.fromDB(value: String; tz : TFslDateTimeTimezone = dttzUTC): TFslDateTime; begin result := fromFormat('yyyy-mm-dd hh:nn:ss.sss', value, true, true, false); - result.TimezoneType := tz; + result.FTimezoneType := tz; end; class function TFslDateTime.makeDay(d, m, y: word): TFslDateTime; @@ -8190,13 +7981,13 @@ class function TFslDateTime.fromFormat(format, date: String; AllowBlankTimes: Bo begin result.clear; format := checkFormat(format); - Result.year := 0; - Result.month := 0; - Result.day := 0; - Result.hour := 0; - Result.minute := 0; - Result.second := 0; - Result.fraction := 0; + Result.FYear := 0; + Result.FMonth := 0; + Result.FDay := 0; + Result.FHour := 0; + Result.FMinute := 0; + Result.FSecond := 0; + Result.FFraction := 0; FindBlock('y', Format, start, length); tmp := copy(date, start, length); if lowercase(tmp) = 'nown' then @@ -8205,14 +7996,14 @@ class function TFslDateTime.fromFormat(format, date: String; AllowBlankTimes: Bo // we don't bother with the year else begin - Result.year := UserStrToInt(tmp, 'Year from "' + date + '"'); + Result.FYear := UserStrToInt(tmp, 'Year from "' + date + '"'); if not NoFixYear then begin - if Result.year < 100 then - if abs(Result.year) > {$IFNDEF VER130}FormatSettings.{$ENDIF}TwoDigitYearCenturyWindow then //abs as result.year is a smallint, twodigityearcenturywindow is a word (range checking) - inc(Result.year, 1900) + if Result.FYear < 100 then + if abs(Result.FYear) > {$IFNDEF VER130}FormatSettings.{$ENDIF}TwoDigitYearCenturyWindow then //abs as result.year is a smallint, twodigityearcenturywindow is a word (range checking) + inc(Result.FYear, 1900) else - inc(Result.year, 2000); + inc(Result.FYear, 2000); end; end; FindBlock('m', Format, start, length); @@ -8224,38 +8015,38 @@ class function TFslDateTime.fromFormat(format, date: String; AllowBlankTimes: Bo if length > 2 then begin if (s = 'jan') or (s = 'january') then - Result.month := 1 + Result.FMonth := 1 else if (s = 'feb') or (s = 'february') then - Result.month := 2 + Result.FMonth := 2 else if (s = 'mar') or (s = 'march') then - Result.month := 3 + Result.FMonth := 3 else if (s = 'apr') or (s = 'april') then - Result.month := 4 + Result.FMonth := 4 else if (s = 'may') then - Result.month := 5 + Result.FMonth := 5 else if (s = 'jun') or (s = 'june') then - Result.month := 6 + Result.FMonth := 6 else if (s = 'jul') or (s = 'july') then - Result.month := 7 + Result.FMonth := 7 else if (s = 'aug') or (s = 'august') then - Result.month := 8 + Result.FMonth := 8 else if (s = 'sep') or (s = 'september') then - Result.month := 9 + Result.FMonth := 9 else if (s = 'oct') or (s = 'october') then - Result.month := 10 + Result.FMonth := 10 else if (s = 'nov') or (s = 'november') then - Result.month := 11 + Result.FMonth := 11 else if (s = 'dec') or (s = 'december') then - Result.month := 12 + Result.FMonth := 12 else - raise EDateFormatError.Create('The Month "' + s + '" is unknown in '+date); + raise EDateFormatError.Create('The Month "' + s + '" is unknown in '+date+' (using format '+format+', from '+inttostr(start)+' for '+inttostr(length)+' chars'); end else if s = '' then - Result.Month := 1 + Result.FMonth := 1 else - Result.month := UserStrToInt(s, 'Month from "' + date + '"'); - if (Result.month > 12) or (Result.month < 1) then - raise EDateFormatError.Create('invalid month ' + IntToStr(Result.month)); + Result.FMonth := UserStrToInt(s, 'Month from "' + date + '"'); + if (Result.FMonth > 12) or (Result.FMonth < 1) then + raise EDateFormatError.Create('invalid month ' + IntToStr(Result.FMonth)); end; FindBlock('d', Format, start, length); tmp := copy(date, start, length); @@ -8263,55 +8054,55 @@ class function TFslDateTime.fromFormat(format, date: String; AllowBlankTimes: Bo // we don't check the day else begin - Result.day := UserStrToInt(tmp, 'Day from "' + date + '"'); + Result.FDay := UserStrToInt(tmp, 'Day from "' + date + '"'); end; FindBlock('h', Format, start, length); if length <> 0 then if AllowBlankTimes then - Result.hour := StrToIntDef(copy(date, start, length), 0) + Result.FHour := StrToIntDef(copy(date, start, length), 0) else - Result.hour := UserStrToInt(copy(date, start, length), 'Hour from "' + date + '"'); + Result.FHour := UserStrToInt(copy(date, start, length), 'Hour from "' + date + '"'); FindBlock('s', Format, start, length); if length <> 0 then if AllowBlankTimes then - Result.second := StrToIntDef(copy(date, start, length), 0) + Result.FSecond := StrToIntDef(copy(date, start, length), 0) else - Result.second := UserStrToInt(copy(date, start, length), 'Second from "' + date + '"'); + Result.FSecond := UserStrToInt(copy(date, start, length), 'Second from "' + date + '"'); FindBlock('n', Format, start, length); if length <> 0 then if AllowBlankTimes then - Result.minute := StrToIntDef(copy(date, start, length), 0) + Result.FMinute := StrToIntDef(copy(date, start, length), 0) else - Result.minute := UserStrToInt(copy(date, start, length), 'Minute from "' + date + '"'); + Result.FMinute := UserStrToInt(copy(date, start, length), 'Minute from "' + date + '"'); FindBlock('z', Format, start, length); if length <> 0 then if AllowBlankTimes then - Result.fraction := StrToIntDef(copy(date, start, length), 0); + Result.FFraction := StrToIntDef(copy(date, start, length), 0); FindBlock('x', Format, start, length); if length <> 0 then if uppercase(copy(date, start, length)) = 'AM' then begin - if Result.hour = 12 then - Result.hour := 0 + if Result.FHour = 12 then + Result.FHour := 0 end else - inc(Result.hour, 12); + inc(Result.FHour, 12); - if Result.hour = 24 then + if Result.FHour = 24 then begin - Result.hour := 0; - inc(result.day); + Result.FHour := 0; + inc(result.FDay); end; result.RollUp; result.check; - if (result.Hour = 0) and (result.Minute = 0) and (result.Second = 0) then + if (result.FHour = 0) and (result.FMinute = 0) and (result.FSecond = 0) then result.FPrecision := dtpDay else result.FPrecision := dtpSec; - result.FractionPrecision := 0; - result.TimezoneType := dttzLocal; - result.Source := date; + result.FFractionPrecision := 0; + result.FTimezoneType := dttzLocal; + result.FSource := date; end; class function TFslDateTime.fromFormatStrict(format, date: String; AllowBlankTimes: Boolean = False; allowNoDay: Boolean = False; allownodate: Boolean = False) : TFslDateTime; @@ -8322,21 +8113,21 @@ class function TFslDateTime.fromFormatStrict(format, date: String; AllowBlankTim function TFslDateTime.IncrementMonth : TFslDateTime; begin result := self; - if result.month = 12 then + if result.FMonth = 12 then begin - inc(result.year); - result.month := 1 + inc(result.FYear); + result.FMonth := 1 end else - inc(result.month); - if result.day > MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)] then - result.Day := MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)]; + inc(result.FMonth); + if result.FDay > MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)] then + result.FDay := MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)]; end; function TFslDateTime.IncrementYear : TFslDateTime; begin result := self; - inc(result.year); + inc(result.FYear); end; Function sv(i, w : integer):String; @@ -8377,7 +8168,7 @@ class function TFslDateTime.isValidDate(format, date: String; AllowBlankTimes, a begin try dt := TFslDateTime.fromFormat(format, date, AllowBlankTimes, allowNoDay, allownodate, noFixYear); - result := dt.year > 0; + result := dt.FYear > 0; except result := false; end; @@ -8392,10 +8183,10 @@ class function TFslDateTime.isValidXmlDate(value: String): Boolean; if value = '' then exit(false); - res.Source := Value; + res.FSource := Value; if pos('Z', value) = length(value) then begin - res.TimezoneType := dttzUTC; + res.FTimezoneType := dttzUTC; Delete(value, length(value), 1); end else if (pos('T', value) > 0) and StringContainsAny(copy(Value, pos('T', value)+1, $FF), ['-', '+']) then @@ -8404,49 +8195,49 @@ class function TFslDateTime.isValidXmlDate(value: String): Boolean; StringSplitRight(value, ['-', '+'], value, s); if length(s) <> 5 then raise ELibraryException.create('Unable to parse date/time "'+value+'": timezone is illegal length - must be 5'); - res.TimezoneHours := vsv(s, 1, 2, 0, 14, 'timezone hours'); - res.TimezoneMins := vsv(s, 4, 2, 0, 59, 'timezone minutes'); - res.TimezoneType := dttzSpecified; + res.FTimezoneHours := vsv(s, 1, 2, 0, 14, 'timezone hours'); + res.FTimezoneMins := vsv(s, 4, 2, 0, 59, 'timezone minutes'); + res.FTimezoneType := dttzSpecified; if neg then - res.TimezoneHours := -res.TimezoneHours; + res.FTimezoneHours := -res.FTimezoneHours; end; - res.FractionPrecision := 0; + res.FFractionPrecision := 0; if Length(value) >=4 then - res.Year := vsv(Value, 1, 4, 1800, 2100, 'years'); + res.FYear := vsv(Value, 1, 4, 1800, 2100, 'years'); if Length(value) < 7 then res.FPrecision := dtpYear else begin - res.Month := vsv(Value, 6, 2, 1, 12, 'months'); + res.FMonth := vsv(Value, 6, 2, 1, 12, 'months'); if length(Value) < 10 then res.FPrecision := dtpMonth else begin - res.Day := vsv(Value, 9, 2, 1, 31, 'days'); + res.FDay := vsv(Value, 9, 2, 1, 31, 'days'); if length(Value) < 13 then res.FPrecision := dtpDay else begin - res.Hour := vsv(Value, 12, 2, 0, 23, 'hours'); + res.FHour := vsv(Value, 12, 2, 0, 23, 'hours'); if length(Value) < 15 then res.FPrecision := dtpHour else begin - res.Minute := vsv(Value, 15, 2, 0, 59, 'minutes'); + res.FMinute := vsv(Value, 15, 2, 0, 59, 'minutes'); if length(Value) < 18 then res.FPrecision := dtpMin else begin - res.Second := vsv(Value, 18, 2, 0, 59, 'seconds'); + res.FSecond := vsv(Value, 18, 2, 0, 59, 'seconds'); if length(Value) <= 20 then res.FPrecision := dtpSec else begin s := copy(Value, 21, 6); - res.FractionPrecision := length(s); - res.fraction := trunc(vsv(Value, 21, 4, 0, 999999, 'fractions') * power(10, 9 - res.FractionPrecision)); + res.FFractionPrecision := length(s); + res.FFraction := trunc(vsv(Value, 21, 4, 0, 999999, 'fractions') * power(10, 9 - res.FFractionPrecision)); res.FPrecision := dtpNanoSeconds; end; end; @@ -8488,7 +8279,7 @@ function TFslDateTime.IncrementWeek : TFslDateTime; result := self; for i := 1 to 7 do begin - inc(result.day); + inc(result.FDay); result.rollUp; end; end; @@ -8496,7 +8287,7 @@ function TFslDateTime.IncrementWeek : TFslDateTime; function TFslDateTime.IncrementDay : TFslDateTime; begin result := self; - inc(result.day); + inc(result.FDay); result.RollUp; end; @@ -8512,13 +8303,13 @@ function ReplaceSubString(var AStr: String; const ASearchStr, AReplaceStr: Strin function TFslDateTime.tz(sep : String) : String; begin result := ''; - case TimezoneType of + case FTimezoneType of dttzUTC : result := result + 'Z'; dttzSpecified : - if TimezoneHours < 0 then - result := result + sv(TimezoneHours, 2) + sep+sv(TimezoneMins, 2) + if FTimezoneHours < 0 then + result := result + sv(FTimezoneHours, 2) + sep+sv(FTimezoneMins, 2) else - result := result + '+'+sv(TimezoneHours, 2) + sep+sv(TimezoneMins, 2); + result := result + '+'+sv(FTimezoneHours, 2) + sep+sv(FTimezoneMins, 2); dttzLocal : if TimeZoneBias > 0 then result := result + '+'+FormatDateTime('hh'+sep+'nn', TimeZoneBias, FormatSettings) @@ -8531,27 +8322,27 @@ function TFslDateTime.tz(sep : String) : String; function TFslDateTime.toString(format: String): String; begin - if Source = '' then + if FSource = '' then exit(''); check; format := checkFormat(format); Result := format; - if not ReplaceSubString(Result, 'yyyy', StringPadRight(IntToStr(year), '0', 4)) then - if not replaceSubstring(Result, 'yy', copy(IntToStr(year), 3, 2)) then ; - replaceSubstring(Result, 'y', copy(IntToStr(year), 3, 2)); - if not ReplaceSubString(Result, 'mmmm', copy(MONTHOFYEAR_LONG[TMonthOfYear(month)], 1, 4)) then - if not ReplaceSubString(Result, 'mmm', MONTHOFYEAR_SHORT[TMonthOfYear(month)]) then - if not ReplaceSubString(Result, 'mm', StringPadLeft(IntToStr(month), '0', 2)) then - ReplaceSubString(Result, 'm', IntToStr(month)); - if not ReplaceSubString(Result, 'dd', StringPadLeft(IntToStr(day), '0', 2)) then - ReplaceSubString(Result, 'd', IntToStr(day)); - ReplaceSubString(Result, 'HH', StringPadLeft(IntToStr(hour), '0', 2)); - ReplaceSubString(Result, 'H', IntToStr(hour)); - ReplaceSubString(Result, 'hh', StringPadLeft(IntToStr(hour mod 12), '0', 2)); - ReplaceSubString(Result, 'h', IntToStr(hour mod 12)); - ReplaceSubString(Result, 'nn', StringPadLeft(IntToStr(minute), '0', 2)); - ReplaceSubString(Result, 'ss', StringPadLeft(IntToStr(second), '0', 2)); - if hour < 12 then + if not ReplaceSubString(Result, 'yyyy', StringPadRight(IntToStr(FYear), '0', 4)) then + if not replaceSubstring(Result, 'yy', copy(IntToStr(FYear), 3, 2)) then ; + replaceSubstring(Result, 'y', copy(IntToStr(FYear), 3, 2)); + if not ReplaceSubString(Result, 'mmmm', copy(MONTHOFYEAR_LONG[TMonthOfYear(FMonth)], 1, 4)) then + if not ReplaceSubString(Result, 'mmm', MONTHOFYEAR_SHORT[TMonthOfYear(FMonth)]) then + if not ReplaceSubString(Result, 'mm', StringPadLeft(IntToStr(FMonth), '0', 2)) then + ReplaceSubString(Result, 'm', IntToStr(FMonth)); + if not ReplaceSubString(Result, 'dd', StringPadLeft(IntToStr(FDay), '0', 2)) then + ReplaceSubString(Result, 'd', IntToStr(FDay)); + ReplaceSubString(Result, 'HH', StringPadLeft(IntToStr(FHour), '0', 2)); + ReplaceSubString(Result, 'H', IntToStr(FHour)); + ReplaceSubString(Result, 'hh', StringPadLeft(IntToStr(FHour mod 12), '0', 2)); + ReplaceSubString(Result, 'h', IntToStr(FHour mod 12)); + ReplaceSubString(Result, 'nn', StringPadLeft(IntToStr(FMinute), '0', 2)); + ReplaceSubString(Result, 'ss', StringPadLeft(IntToStr(FSecond), '0', 2)); + if FHour < 12 then ReplaceSubString(Result, 'AMPM', 'AM') else ReplaceSubString(Result, 'AMPM', 'PM'); @@ -8570,11 +8361,11 @@ class function TFslDateTime.fromHL7(value: String) : TFslDateTime; exit(makeNull); result.clear; - result.Source := Value; + result.FSource := Value; if pos('Z', value) = length(value) then begin - result.TimezoneType := dttzUTC; + result.FTimezoneType := dttzUTC; Delete(value, length(value), 1); end else if StringContainsAny(Value, ['-', '+']) then @@ -8583,49 +8374,49 @@ class function TFslDateTime.fromHL7(value: String) : TFslDateTime; StringSplit(value, ['-', '+'], value, s); if length(s) <> 4 then raise ELibraryException.create('Unable to parse date/time "'+value+'": timezone is illegal length - must be 4'); - result.TimezoneHours := vs(s, 1, 2, 0, 13, 'timezone hours'); - result.TimezoneMins := vs(s, 3, 2, 0, 59, 'timezone minutes'); - result.TimezoneType := dttzSpecified; + result.FTimezoneHours := vs(s, 1, 2, 0, 13, 'timezone hours'); + result.FTimezoneMins := vs(s, 3, 2, 0, 59, 'timezone minutes'); + result.FTimezoneType := dttzSpecified; if neg then - result.TimezoneHours := -result.TimezoneHours; + result.FTimezoneHours := -result.FTimezoneHours; end; - result.FractionPrecision := 0; + result.FFractionPrecision := 0; if Length(value) >=4 then - result.Year := vs(Value, 1, 4, 1800, 2100, 'years'); + result.FYear := vs(Value, 1, 4, 1800, 2100, 'years'); if Length(value) < 6 then result.FPrecision := dtpYear else begin - result.Month := vs(Value, 5, 2, 1, 12, 'months'); + result.FMonth := vs(Value, 5, 2, 1, 12, 'months'); if length(Value) < 8 then result.FPrecision := dtpMonth else begin - result.Day := vs(Value, 7, 2, 1, 31, 'days'); + result.FDay := vs(Value, 7, 2, 1, 31, 'days'); if length(Value) < 10 then result.FPrecision := dtpDay else begin - result.Hour := vs(Value, 9, 2, 0, 23, 'hours'); + result.FHour := vs(Value, 9, 2, 0, 23, 'hours'); if length(Value) < 12 then result.FPrecision := dtpHour else begin - result.Minute := vs(Value, 11, 2, 0, 59, 'minutes'); + result.FMinute := vs(Value, 11, 2, 0, 59, 'minutes'); if length(Value) < 14 then result.FPrecision := dtpMin else begin - result.Second := vs(Value, 13, 2, 0, 59, 'seconds'); + result.FSecond := vs(Value, 13, 2, 0, 59, 'seconds'); if length(Value) <= 15 then result.FPrecision := dtpSec else begin s := copy(Value, 16, 4); - result.FractionPrecision := length(s); - result.fraction := trunc(vs(Value, 16, 4, 0, 9999, 'fractions') * power(10, 9 - result.FractionPrecision)); + result.FFractionPrecision := length(s); + result.FFraction := trunc(vs(Value, 16, 4, 0, 9999, 'fractions') * power(10, 9 - result.FFractionPrecision)); result.FPrecision := dtpNanoSeconds; end; end; @@ -8634,7 +8425,7 @@ class function TFslDateTime.fromHL7(value: String) : TFslDateTime; end; end; result.check; - result.source := value; + result.FSource := value; end; class function TFslDateTime.fromXML(value: String) : TFslDateTime; @@ -8646,10 +8437,10 @@ class function TFslDateTime.fromXML(value: String) : TFslDateTime; exit(makeNull); result.clear; - result.Source := Value; + result.FSource := Value; if pos('Z', value) = length(value) then begin - result.TimezoneType := dttzUTC; + result.FTimezoneType := dttzUTC; Delete(value, length(value), 1); end else if (pos('T', value) > 0) and StringContainsAny(copy(Value, pos('T', value)+1, $FF), ['-', '+']) then @@ -8658,49 +8449,49 @@ class function TFslDateTime.fromXML(value: String) : TFslDateTime; StringSplitRight(value, ['-', '+'], value, s); if length(s) <> 5 then raise ELibraryException.create('Unable to parse date/time "'+value+'": timezone is illegal length - must be 5'); - result.TimezoneHours := vs(s, 1, 2, 0, 14, 'timezone hours'); - result.TimezoneMins := vs(s, 4, 2, 0, 59, 'timezone minutes'); - result.TimezoneType := dttzSpecified; + result.FTimezoneHours := vs(s, 1, 2, 0, 14, 'timezone hours'); + result.FTimezoneMins := vs(s, 4, 2, 0, 59, 'timezone minutes'); + result.FTimezoneType := dttzSpecified; if neg then - result.TimezoneHours := -result.TimezoneHours; + result.FTimezoneHours := -result.FTimezoneHours; end; - result.FractionPrecision := 0; + result.FFractionPrecision := 0; if Length(value) >=4 then - result.Year := vs(Value, 1, 4, 0001, 9999, 'years'); + result.FYear := vs(Value, 1, 4, 0001, 9999, 'years'); if Length(value) < 7 then result.FPrecision := dtpYear else begin - result.Month := vs(Value, 6, 2, 1, 12, 'months'); + result.FMonth := vs(Value, 6, 2, 1, 12, 'months'); if length(Value) < 10 then result.FPrecision := dtpMonth else begin - result.Day := vs(Value, 9, 2, 1, 31, 'days'); + result.FDay := vs(Value, 9, 2, 1, 31, 'days'); if length(Value) < 13 then result.FPrecision := dtpDay else begin - result.Hour := vs(Value, 12, 2, 0, 23, 'hours'); + result.FHour := vs(Value, 12, 2, 0, 23, 'hours'); if length(Value) < 15 then result.FPrecision := dtpHour else begin - result.Minute := vs(Value, 15, 2, 0, 59, 'minutes'); + result.FMinute := vs(Value, 15, 2, 0, 59, 'minutes'); if length(Value) < 18 then result.FPrecision := dtpMin else begin - result.Second := vs(Value, 18, 2, 0, 59, 'seconds'); + result.FSecond := vs(Value, 18, 2, 0, 59, 'seconds'); if length(Value) <= 20 then result.FPrecision := dtpSec else begin s := copy(Value, 21, 6); - result.FractionPrecision := length(s); - result.fraction := trunc(vs(Value, 21, 4, 0, 999999, 'fractions') * power(10, 9 - result.FractionPrecision)); + result.FFractionPrecision := length(s); + result.FFraction := trunc(vs(Value, 21, 4, 0, 999999, 'fractions') * power(10, 9 - result.FFractionPrecision)); result.FPrecision := dtpNanoSeconds; end; end; @@ -8709,7 +8500,7 @@ class function TFslDateTime.fromXML(value: String) : TFslDateTime; end; end; result.check; - result.source := value; + result.FSource := value; end; class operator TFslDateTime.GreaterThan(a: TFslDateTime; b: TFslDateTime @@ -8727,13 +8518,13 @@ class function TFslDateTime.fromXML(value: String) : TFslDateTime; function TFslDateTime.toDB: String; begin case FPrecision of - dtpYear: result := sv(Year, 4); - dtpMonth: result := sv(Year, 4) + '-'+sv(Month, 2); - dtpDay: result := sv(Year, 4) + '-'+sv(Month, 2) + '-'+sv(Day, 2); - dtpHour: result := sv(Year, 4) + '-'+sv(Month, 2) + '-'+sv(Day, 2) + ' '+sv(hour, 2); - dtpMin: result := sv(Year, 4) + '-'+sv(Month, 2) + '-'+sv(Day, 2) + ' '+sv(hour, 2)+ ':'+sv(Minute, 2); - dtpSec: result := sv(Year, 4) + '-'+sv(Month, 2) + '-'+sv(Day, 2) + ' '+sv(hour, 2)+ ':'+sv(Minute, 2)+ ':'+sv(Second, 2); - dtpNanoSeconds: result := sv(Year, 4) + '-'+sv(Month, 2) + '-'+sv(Day, 2) + ' '+sv(hour, 2)+ ':'+sv(Minute, 2)+ ':'+sv(Second, 2)+'.'+copy(sv(Fraction, 9), 1, IntegerMax(FractionPrecision, 3)); + dtpYear: result := sv(FYear, 4); + dtpMonth: result := sv(FYear, 4) + '-'+sv(FMonth, 2); + dtpDay: result := sv(FYear, 4) + '-'+sv(FMonth, 2) + '-'+sv(FDay, 2); + dtpHour: result := sv(FYear, 4) + '-'+sv(FMonth, 2) + '-'+sv(FDay, 2) + ' '+sv(FHour, 2); + dtpMin: result := sv(FYear, 4) + '-'+sv(FMonth, 2) + '-'+sv(FDay, 2) + ' '+sv(FHour, 2)+ ':'+sv(FMinute, 2); + dtpSec: result := sv(FYear, 4) + '-'+sv(FMonth, 2) + '-'+sv(FDay, 2) + ' '+sv(FHour, 2)+ ':'+sv(FMinute, 2)+ ':'+sv(FSecond, 2); + dtpNanoSeconds: result := sv(FYear, 4) + '-'+sv(FMonth, 2) + '-'+sv(FDay, 2) + ' '+sv(FHour, 2)+ ':'+sv(FMinute, 2)+ ':'+sv(FSecond, 2)+'.'+copy(sv(FFraction, 9), 1, IntegerMax(FFractionPrecision, 3)); end; end; @@ -8742,21 +8533,21 @@ function TFslDateTime.toHL7: String; if null then exit(''); case FPrecision of - dtpYear: result := sv(Year, 4); - dtpMonth: result := sv(Year, 4) + sv(Month, 2); - dtpDay: result := sv(Year, 4) + sv(Month, 2) + sv(Day, 2); - dtpHour: result := sv(Year, 4) + sv(Month, 2) + sv(Day, 2) + sv(hour, 2); - dtpMin: result := sv(Year, 4) + sv(Month, 2) + sv(Day, 2) + sv(hour, 2)+ sv(Minute, 2); - dtpSec: result := sv(Year, 4) + sv(Month, 2) + sv(Day, 2) + sv(hour, 2)+ sv(Minute, 2)+ sv(Second, 2); - dtpNanoSeconds: result := sv(Year, 4) + sv(Month, 2) + sv(Day, 2) + sv(hour, 2)+ sv(Minute, 2)+ sv(Second, 2)+'.'+copy(sv(Fraction, 9), 1, IntegerMax(FractionPrecision, 3)); + dtpYear: result := sv(FYear, 4); + dtpMonth: result := sv(FYear, 4) + sv(FMonth, 2); + dtpDay: result := sv(FYear, 4) + sv(FMonth, 2) + sv(FDay, 2); + dtpHour: result := sv(FYear, 4) + sv(FMonth, 2) + sv(FDay, 2) + sv(FHour, 2); + dtpMin: result := sv(FYear, 4) + sv(FMonth, 2) + sv(FDay, 2) + sv(FHour, 2)+ sv(FMinute, 2); + dtpSec: result := sv(FYear, 4) + sv(FMonth, 2) + sv(FDay, 2) + sv(FHour, 2)+ sv(FMinute, 2)+ sv(FSecond, 2); + dtpNanoSeconds: result := sv(FYear, 4) + sv(FMonth, 2) + sv(FDay, 2) + sv(FHour, 2)+ sv(FMinute, 2)+ sv(FSecond, 2)+'.'+copy(sv(FFraction, 9), 1, IntegerMax(FFractionPrecision, 3)); end; - case TimezoneType of + case FTimezoneType of dttzUTC : result := result + 'Z'; dttzSpecified : - if TimezoneHours < 0 then - result := result + sv(TimezoneHours, 2) + sv(TimezoneMins, 2) + if FTimezoneHours < 0 then + result := result + sv(FTimezoneHours, 2) + sv(FTimezoneMins, 2) else - result := result + '+'+sv(TimezoneHours, 2) + sv(TimezoneMins, 2); + result := result + '+'+sv(FTimezoneHours, 2) + sv(FTimezoneMins, 2); dttzLocal : if TimeZoneBias > 0 then result := result + '+'+FormatDateTime('hhnn', TimeZoneBias, FormatSettings) @@ -8778,26 +8569,26 @@ function TFslDateTime.toXML: String; exit(''); case FPrecision of - dtpYear: result := sv(Year, 4); - dtpMonth: result := sv(Year, 4) + '-' + sv(Month, 2); - dtpDay: result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2); - dtpHour: result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2) + 'T' + sv(hour, 2) + ':' + sv(Minute, 2); // note minutes anyway in this case - dtpMin: result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2) + 'T' + sv(hour, 2) + ':' + sv(Minute, 2); - dtpSec: result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2) + 'T' + sv(hour, 2) + ':' + sv(Minute, 2)+ ':' + sv(Second, 2); + dtpYear: result := sv(FYear, 4); + dtpMonth: result := sv(FYear, 4) + '-' + sv(FMonth, 2); + dtpDay: result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2); + dtpHour: result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2) + 'T' + sv(FHour, 2) + ':' + sv(FMinute, 2); // note minutes anyway in this case + dtpMin: result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2) + 'T' + sv(FHour, 2) + ':' + sv(FMinute, 2); + dtpSec: result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2) + 'T' + sv(FHour, 2) + ':' + sv(FMinute, 2)+ ':' + sv(FSecond, 2); dtpNanoSeconds: - if FractionPrecision = 0 then - result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2) + 'T' + sv(hour, 2) + ':' + sv(Minute, 2)+ ':' + sv(Second, 2) + if FFractionPrecision = 0 then + result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2) + 'T' + sv(FHour, 2) + ':' + sv(FMinute, 2)+ ':' + sv(FSecond, 2) else - result := sv(Year, 4) + '-' + sv(Month, 2) + '-' + sv(Day, 2) + 'T' + sv(hour, 2) + ':' + sv(Minute, 2)+ ':' + sv(Second, 2)+'.'+copy(sv(Fraction, 9), 1, FractionPrecision); + result := sv(FYear, 4) + '-' + sv(FMonth, 2) + '-' + sv(FDay, 2) + 'T' + sv(FHour, 2) + ':' + sv(FMinute, 2)+ ':' + sv(FSecond, 2)+'.'+copy(sv(FFraction, 9), 1, FFractionPrecision); end; if (FPrecision > dtpDay) then - case TimezoneType of + case FTimezoneType of dttzUTC : result := result + 'Z'; dttzSpecified : - if TimezoneHours < 0 then - result := result + sv(TimezoneHours, 2) + ':'+sv(TimezoneMins, 2) + if FTimezoneHours < 0 then + result := result + sv(FTimezoneHours, 2) + ':'+sv(FTimezoneMins, 2) else - result := result + '+'+sv(TimezoneHours, 2) + ':'+sv(TimezoneMins, 2); + result := result + '+'+sv(FTimezoneHours, 2) + ':'+sv(FTimezoneMins, 2); dttzLocal : if TimeZoneBias > 0 then result := result + '+'+FormatDateTime('hh:nn', TimeZoneBias, FormatSettings) @@ -8820,11 +8611,11 @@ function TFslDateTime.truncToDay: TFslDateTime; result := clone; if result.FPrecision > dtpDay then result.FPrecision := dtpDay; - result.hour := 0; - result.minute := 0; - result.second := 0; - result.fraction := 0; - result.TimezoneType := dttzUnknown; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; + result.FTimezoneType := dttzUnknown; end; function TFslDateTime.Local: TFslDateTime; @@ -8832,22 +8623,22 @@ function TFslDateTime.Local: TFslDateTime; bias : TDateTime; begin if FPrecision >= dtpHour then - case TimezoneType of + case FTimezoneType of dttzUTC : result := TFslDateTime.makeLocal(TFslTimeZone.Local.ToLocalTime(self.DateTime)); dttzSpecified : begin - if TimezoneHours < 0 then - bias := - (-TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE) + if FTimezoneHours < 0 then + bias := - (-FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE) else - bias := (TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE); + bias := (FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE); result := TFslDateTime.makeLocal(TFslTimeZone.Local.ToLocalTime(self.DateTime-bias)); end else result := self; end; result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := dttzLocal; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := dttzLocal; end; function TFslDateTime.Max: TFslDateTime; @@ -8856,115 +8647,115 @@ function TFslDateTime.Max: TFslDateTime; case FPrecision of dtpYear: begin - inc(result.year); - result.Month := 1; - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + inc(result.FYear); + result.FMonth := 1; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMonth: begin - inc(result.Month); - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + inc(result.FMonth); + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpDay: begin - inc(result.Day); - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + inc(result.FDay); + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpHour: begin - inc(result.Hour); - result.minute := 0; - result.Second := 0; - result.fraction := 0; + inc(result.FHour); + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMin: begin - inc(result.minute); - result.Second := 0; - result.fraction := 0; + inc(result.FMinute); + result.FSecond := 0; + result.FFraction := 0; end; dtpSec: begin - inc(result.Second); - result.fraction := 0; + inc(result.FSecond); + result.FFraction := 0; end; dtpNanoSeconds: begin - inc(result.fraction); + inc(result.FFraction); end; end; result.RollUp; result.FPrecision := dtpNanoSeconds; - result.Source := result.toXML; + result.FSource := result.toXML; result.check; end; function TFslDateTime.MaxUTC: TFslDateTime; begin - if TimezoneType = dttzUnknown then + if FTimezoneType = dttzUnknown then begin result := add(14/24); - result.TimezoneType := dttzUTC; + result.FTimezoneType := dttzUTC; end else result := UTC; case FPrecision of dtpYear: begin - result.Month := 1; - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMonth := 1; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMonth: begin - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpDay: begin - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpHour: begin - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMin: begin - result.Second := 0; - result.fraction := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpSec: begin - result.fraction := 0; + result.FFraction := 0; end; dtpNanoSeconds: begin end; end; result.FPrecision := dtpNanoSeconds; - result.Source := result.toXML; + result.FSource := result.toXML; end; function TFslDateTime.Min: TFslDateTime; @@ -8973,106 +8764,106 @@ function TFslDateTime.Min: TFslDateTime; case FPrecision of dtpYear: begin - result.Month := 1; - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMonth := 1; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMonth: begin - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpDay: begin - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpHour: begin - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMin: begin - result.Second := 0; - result.fraction := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpSec: begin - result.fraction := 0; + result.FFraction := 0; end; dtpNanoSeconds: begin end; end; result.FPrecision := dtpNanoSeconds; - result.Source := result.toXML; + result.FSource := result.toXML; end; function TFslDateTime.MinUTC: TFslDateTime; begin - if TimezoneType = dttzUnknown then + if FTimezoneType = dttzUnknown then begin result := subtract(14/24); - result.TimezoneType := dttzUTC; + result.FTimezoneType := dttzUTC; end else result := UTC; case FPrecision of dtpYear: begin - result.Month := 1; - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMonth := 1; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMonth: begin - result.Day := 1; - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FDay := 1; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpDay: begin - result.Hour := 0; - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FHour := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpHour: begin - result.minute := 0; - result.Second := 0; - result.fraction := 0; + result.FMinute := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpMin: begin - result.Second := 0; - result.fraction := 0; + result.FSecond := 0; + result.FFraction := 0; end; dtpSec: begin - result.fraction := 0; + result.FFraction := 0; end; dtpNanoSeconds: begin end; end; result.FPrecision := dtpNanoSeconds; - result.Source := result.toXML; + result.FSource := result.toXML; end; class operator TFslDateTime.NotEqual(a: TFslDateTime; b: TFslDateTime): Boolean; @@ -9082,12 +8873,12 @@ function TFslDateTime.MinUTC: TFslDateTime; function TFslDateTime.notNull: boolean; begin - result := Source <> ''; + result := FSource <> ''; end; function TFslDateTime.null: boolean; begin - result := Source = ''; + result := FSource = ''; end; function TFslDateTime.overlaps(other: TFslDateTime): boolean; @@ -9110,21 +8901,21 @@ function TFslDateTime.overlaps(other: TFslDateTime): boolean; function TFslDateTime.privToString: String; begin Result := 'yyyy-mm-ddThh:nn:ss'; - if not ReplaceSubString(Result, 'yyyy', StringPadRight(IntToStr(year), '0', 4)) then - replaceSubstring(Result, 'yy', copy(IntToStr(year), 3, 2)); - if month <> 0 then + if not ReplaceSubString(Result, 'yyyy', StringPadRight(IntToStr(FYear), '0', 4)) then + replaceSubstring(Result, 'yy', copy(IntToStr(FYear), 3, 2)); + if FMonth <> 0 then begin - if not ReplaceSubString(Result, 'mmmm', copy(MONTHOFYEAR_LONG[TMonthOfYear(month)], 1, 4)) then - if not ReplaceSubString(Result, 'mmm', MONTHOFYEAR_SHORT[TMonthOfYear(month)]) then - if not ReplaceSubString(Result, 'mm', StringPadLeft(IntToStr(month), '0', 2)) then - ReplaceSubString(Result, 'm', IntToStr(month)); - if day > 0 then + if not ReplaceSubString(Result, 'mmmm', copy(MONTHOFYEAR_LONG[TMonthOfYear(FMonth)], 1, 4)) then + if not ReplaceSubString(Result, 'mmm', MONTHOFYEAR_SHORT[TMonthOfYear(FMonth)]) then + if not ReplaceSubString(Result, 'mm', StringPadLeft(IntToStr(FMonth), '0', 2)) then + ReplaceSubString(Result, 'm', IntToStr(FMonth)); + if FDay > 0 then begin - if not ReplaceSubString(Result, 'dd', StringPadLeft(IntToStr(day), '0', 2)) then - ReplaceSubString(Result, 'd', IntToStr(day)); - ReplaceSubString(Result, 'hh', StringPadLeft(IntToStr(hour), '0', 2)); - ReplaceSubString(Result, 'nn', StringPadLeft(IntToStr(minute), '0', 2)); - ReplaceSubString(Result, 'ss', StringPadLeft(IntToStr(second), '0', 2)); + if not ReplaceSubString(Result, 'dd', StringPadLeft(IntToStr(FDay), '0', 2)) then + ReplaceSubString(Result, 'd', IntToStr(FDay)); + ReplaceSubString(Result, 'hh', StringPadLeft(IntToStr(FHour), '0', 2)); + ReplaceSubString(Result, 'nn', StringPadLeft(IntToStr(FMinute), '0', 2)); + ReplaceSubString(Result, 'ss', StringPadLeft(IntToStr(FSecond), '0', 2)); end; end; end; @@ -9141,27 +8932,27 @@ function TFslDateTime.AsTz(ihr, imin: Integer): TFslDateTime; nbias := (iHr * DATETIME_HOUR_ONE) + (imin * DATETIME_MINUTE_ONE); bias := timezoneBias; - result.TimezoneType := dttzLocal; + result.FTimezoneType := dttzLocal; if FPrecision >= dtpHour then - case TimezoneType of + case FTimezoneType of dttzUTC : result := TFslDateTime.makeLocal(self.DateTime+nbias); dttzLocal : result := TFslDateTime.makeLocal(TFslTimeZone.Local.ToUniversalTime(self.DateTime-bias)+nbias); dttzSpecified : begin - if TimezoneHours < 0 then - bias := - (-TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE) + if FTimezoneHours < 0 then + bias := - (-FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE) else - bias := (TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE); + bias := (FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE); result := TFslDateTime.makeLocal(self.DateTime-bias+nbias); end; else result := self; end; result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := dttzSpecified; - result.TimezoneHours := ihr; - result.TimezoneMins := imin; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := dttzSpecified; + result.FTimezoneHours := ihr; + result.FTimezoneMins := imin; end; function TFslDateTime.UTC: TFslDateTime; @@ -9170,22 +8961,22 @@ function TFslDateTime.UTC: TFslDateTime; begin result := self; if FPrecision >= dtpHour then - case TimezoneType of + case FTimezoneType of dttzLocal : result := TFslDateTime.makeUTC(TFslTimeZone.Local.ToUniversalTime(self.DateTime)); dttzSpecified : begin - if TimezoneHours < 0 then - bias := (-TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE) + if FTimezoneHours < 0 then + bias := (-FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE) else - bias := -(TimezoneHours * DATETIME_HOUR_ONE) + (TimezoneMins * DATETIME_MINUTE_ONE); + bias := -(FTimezoneHours * DATETIME_HOUR_ONE) + (FTimezoneMins * DATETIME_MINUTE_ONE); result := TFslDateTime.makeUTC(self.DateTime+bias); end; else end; - result.Fraction := Fraction; // fix for issue representing fractions digitally. + result.FFraction := FFraction; // fix for issue representing fractions digitally. result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := dttzUTC; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := dttzUTC; end; class function TFslDateTime.makeUTC : TFslDateTime; @@ -9218,8 +9009,8 @@ class function TFslDateTime.make(value: TDateTime; zone: String): TFslDateTime; result := make(value, dttzSpecified); result.FPrecision := dtpSec; offs := {$IFDEF FPC}TTimeSpan.makeTicks{$ENDIF}(TBundledTimeZone.GetTimeZone(zone).GetUtcOffset(value)); - result.TimeZoneHours := offs.Hours; - result.TimezoneMins := offs.Minutes; + result.FTimeZoneHours := offs.hours; + result.FTimezoneMins := offs.minutes; end; class function TFslDateTime.makeLocal(value: TDateTime) : TFslDateTime; @@ -9230,7 +9021,7 @@ class function TFslDateTime.makeLocal(value: TDateTime) : TFslDateTime; class function TFslDateTime.makeNull: TFslDateTime; begin result.clear; - result.Source := ''; + result.FSource := ''; end; class function TFslDateTime.makeToday: TFslDateTime; @@ -9242,29 +9033,29 @@ class function TFslDateTime.makeToday: TFslDateTime; class function TFslDateTime.fromTS(value: TTimestamp; tz : TFslDateTimeTimezone): TFslDateTime; begin result.clear; - result.Year := value.year; - result.month := value.month; - result.day := value.day; - result.hour := value.hour; - result.minute := value.minute; - result.second := value.second; - result.Fraction := value.fraction; + result.FYear := value.year; + result.FMonth := value.month; + result.FDay := value.day; + result.FHour := value.hour; + result.FMinute := value.minute; + result.FSecond := value.second; + result.FFraction := value.fraction; result.FPrecision := dtpNanoSeconds; - result.FractionPrecision := 0; - result.TimezoneType := tz; - result.Source := 'fromTS'; + result.FFractionPrecision := 0; + result.FTimezoneType := tz; + result.FSource := 'fromTS'; end; function TFslDateTime.equal(other: TFslDateTime): Boolean; begin - result := (year = other.year) and - ((FPrecision < dtpMonth) or (month = other.month)) and - ((FPrecision < dtpDay) or (day = other.day)) and - ((FPrecision < dtpHour) or (hour = other.hour)) and - ((FPrecision < dtpMin) or (minute = other.minute)) and - ((FPrecision < dtpSec) or (second = other.second)) and - ((FPrecision < dtpNanoSeconds) or (fraction = other.fraction)) and (FPrecision = other.FPrecision) and (FractionPrecision = other.FractionPrecision) and - (TimezoneType = other.TimezoneType) and (TimeZoneHours = other.TimeZoneHours) and (TimezoneMins = other.TimezoneMins); + result := (FYear = other.FYear) and + ((FPrecision < dtpMonth) or (FMonth = other.FMonth)) and + ((FPrecision < dtpDay) or (FDay = other.FDay)) and + ((FPrecision < dtpHour) or (FHour = other.FHour)) and + ((FPrecision < dtpMin) or (FMinute = other.FMinute)) and + ((FPrecision < dtpSec) or (FSecond = other.FSecond)) and + ((FPrecision < dtpNanoSeconds) or (FFraction = other.FFraction)) and (FPrecision = other.FPrecision) and (FFractionPrecision = other.FFractionPrecision) and + (FTimezoneType = other.FTimezoneType) and (FTimeZoneHours = other.FTimeZoneHours) and (FTimezoneMins = other.FTimezoneMins); end; @@ -9276,8 +9067,8 @@ function TFslDateTime.fixPrecision(precision: TFslDateTimePrecision): TFslDateTi function TFslDateTime.sameTime(other: TFslDateTime): Boolean; begin - if (TimezoneType = dttzUnknown) or (other.TimezoneType = dttzUnknown) then - if (TimezoneType = dttzUnknown) and (other.TimezoneType = dttzUnknown) then + if (FTimezoneType = dttzUnknown) or (other.FTimezoneType = dttzUnknown) then + if (FTimezoneType = dttzUnknown) and (other.FTimezoneType = dttzUnknown) then result := self.equal(other) else result := false // unknown, really @@ -9287,15 +9078,15 @@ function TFslDateTime.sameTime(other: TFslDateTime): Boolean; function TFslDateTime.sameTimezone(other: TFslDateTime): boolean; begin - case TimezoneType of - dttzUnknown: result := other.TimezoneType = dttzUnknown; - dttzUTC: result := (other.TimezoneType = dttzUTC) or - ((other.TimezoneType = dttzLocal) and (TimeZoneBias = 0)) or - ((other.TimezoneType = dttzSpecified) and (other.TimeZoneHours = 0) and (other.TimezoneMins = 0)); - dttzLocal: result := (other.TimezoneType = dttzLocal) or - ((other.TimezoneType = dttzUTC) and (TimeZoneBias = 0)); - dttzSpecified: result := (other.TimezoneType = dttzSpecified) and - ((TimeZoneHours = other.TimeZoneHours) and (TimezoneMins = other.TimezoneMins)); + case FTimezoneType of + dttzUnknown: result := other.FTimezoneType = dttzUnknown; + dttzUTC: result := (other.FTimezoneType = dttzUTC) or + ((other.FTimezoneType = dttzLocal) and (TimeZoneBias = 0)) or + ((other.FTimezoneType = dttzSpecified) and (other.FTimeZoneHours = 0) and (other.FTimezoneMins = 0)); + dttzLocal: result := (other.FTimezoneType = dttzLocal) or + ((other.FTimezoneType = dttzUTC) and (TimeZoneBias = 0)); + dttzSpecified: result := (other.FTimezoneType = dttzSpecified) and + ((FTimeZoneHours = other.FTimeZoneHours) and (FTimezoneMins = other.FTimezoneMins)); else result := false; end; @@ -9342,30 +9133,30 @@ function IsAfterLastMonthDay(y, m, d : integer) : boolean; procedure TFslDateTime.RollUp; begin - if second >= 60 then + if FSecond >= 60 then begin - inc(minute); - second := 0; + inc(FMinute); + FSecond := 0; end; - if minute >= 60 then + if FMinute >= 60 then begin - inc(hour); - minute := 0; + inc(FHour); + FMinute := 0; end; - if hour >= 24 then + if FHour >= 24 then begin - inc(day); - hour := 0; + inc(FDay); + FHour := 0; end; - if day > MONTHS_DAYS[IsLeapYear(Year), TMonthOfYear(month)] then + if FDay > MONTHS_DAYS[IsLeapYear(FYear), TMonthOfYear(FMonth)] then begin - inc(month); - day := 1; + inc(FMonth); + FDay := 1; end; - if month > 12 then + if FMonth > 12 then begin - inc(year); - month := 1; + inc(FYear); + FMonth := 1; end; end; @@ -9373,46 +9164,46 @@ function TFslDateTime.subtract(length: TDuration): TFslDateTime; begin result := TFslDateTime.makeUTC(dateTime - length); result.FPrecision := FPrecision; - result.FractionPrecision := FractionPrecision; - result.TimezoneType := TimezoneType; - result.TimeZoneHours := TimeZoneHours; - result.TimezoneMins := TimezoneMins; + result.FFractionPrecision := FFractionPrecision; + result.FTimezoneType := FTimezoneType; + result.FTimeZoneHours := FTimeZoneHours; + result.FTimezoneMins := FTimezoneMins; end; function TFslDateTime.TimeStamp: TTimeStamp; begin FillChar(result, sizeof(result), 0); - result.Year := year; + result.year := FYear; if FPrecision >= dtpMonth then - result.month := month; + result.month := FMonth; if FPrecision >= dtpDay then - result.day := day; + result.day := FDay; if FPrecision >= dtpHour then - result.hour := hour; + result.hour := FHour; if FPrecision >= dtpMin then - result.minute := minute; + result.minute := FMinute; if FPrecision >= dtpSec then - result.second := second; + result.second := FSecond; if FPrecision >= dtpNanoSeconds then - result.Fraction := fraction; + result.fraction := FFraction; end; function afterInstant(uSelf, uOther : TFslDateTime) : boolean; begin - if (uSelf.year <> uOther.year) then - result := uSelf.year > uOther.year - else if (uSelf.month <> uOther.month) then - result := uSelf.month > uOther.month - else if (uSelf.day <> uOther.day) then - result := uSelf.day > uOther.day - else if (uSelf.hour <> uOther.hour) then - result := uSelf.hour > uOther.hour - else if (uSelf.minute <> uOther.minute) then - result := uSelf.minute > uOther.minute - else if (uSelf.second <> uOther.second) then - result := uSelf.second > uOther.second + if (uSelf.FYear <> uOther.FYear) then + result := uSelf.FYear > uOther.FYear + else if (uSelf.FMonth <> uOther.FMonth) then + result := uSelf.FMonth > uOther.FMonth + else if (uSelf.FDay <> uOther.FDay) then + result := uSelf.FDay > uOther.FDay + else if (uSelf.FHour <> uOther.FHour) then + result := uSelf.FHour > uOther.FHour + else if (uSelf.FMinute <> uOther.FMinute) then + result := uSelf.FMinute > uOther.FMinute + else if (uSelf.FSecond <> uOther.FSecond) then + result := uSelf.FSecond > uOther.FSecond else - result := (uSelf.fraction > uOther.fraction); + result := (uSelf.FFraction > uOther.FFraction); end; class operator TFslDateTime.Add(a: TFslDateTime; b: TDateTime): TFslDateTime; @@ -9428,31 +9219,31 @@ function TFslDateTime.add(value: integer; unit_: TDateTimeUnit): TFslDateTime; case unit_ of dtuYear : begin - inc(result.year, value); + inc(result.FYear, value); end; dtuMonth : begin - v := result.month + value; - inc(result.year, v div 12); - result.month := v mod 12; - if result.day > MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)] then - result.Day := MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)]; + v := result.FMonth + value; + inc(result.FYear, v div 12); + result.FMonth := v mod 12; + if result.FDay > MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)] then + result.FDay := MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)]; end; dtuDay : begin - v := result.day + value; - while v > MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)] do + v := result.FDay + value; + while v > MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)] do begin - v := v - MONTHS_DAYS[IsLeapYear(result.Year), TMonthOfYear(result.month)]; - if result.month = 12 then + v := v - MONTHS_DAYS[IsLeapYear(result.FYear), TMonthOfYear(result.FMonth)]; + if result.FMonth = 12 then begin - inc(result.year); - result.month := 1; + inc(result.FYear); + result.FMonth := 1; end else - inc(result.month); + inc(result.FMonth); end; - result.day := v; + result.FDay := v; end; dtuHour : begin @@ -12292,7 +12083,7 @@ function TimeZoneIANAName : String; function TFslDateTime.hasTimezone : boolean; begin - result := TimezoneType <> dttzUnknown; + result := FTimezoneType <> dttzUnknown; end; function TFslDateTime.couldBeTheSameTime(other: TFslDateTime): boolean; @@ -14530,6 +14321,15 @@ function TFslBytesBuilder.EndsWith(aBytes: TBytes): Boolean; result := result And (aBytes[i] = FContent[FLength - System.Length(aBytes) + i]); end; +procedure TFslBytesBuilder.AddByte(val: byte); +Var + s : TBytes; +Begin + SetLength(s, 1); + move(val, s[0], 1); + Append(s); +end; + procedure TFslBytesBuilder.Read(index : cardinal; var buffer; ilength: cardinal); begin if index < 1 Then @@ -14539,7 +14339,7 @@ procedure TFslBytesBuilder.Read(index : cardinal; var buffer; ilength: cardinal) Move(FContent[index], buffer, ilength); end; -procedure TFslBytesBuilder.WriteCardinal(index: cardinal; val: cardinal); +procedure TFslBytesBuilder.WriteCardinal(index: Cardinal; val: cardinal); begin if index < 1 Then RaiseError('Overwrite', 'index < 1'); @@ -14548,7 +14348,7 @@ procedure TFslBytesBuilder.WriteCardinal(index: cardinal; val: cardinal); Move(val, FContent[index], 4); end; -procedure TFslBytesBuilder.WriteString(index: cardinal; val: String); +procedure TFslBytesBuilder.WriteString(index: Cardinal; val: String); begin if index < 1 Then RaiseError('Overwrite', 'index < 1'); @@ -14557,7 +14357,7 @@ procedure TFslBytesBuilder.WriteString(index: cardinal; val: String); Move(val[1], FContent[index], (val.Length*2)); end; -procedure TFslBytesBuilder.WriteUInt64(index: cardinal; val: UInt64); +procedure TFslBytesBuilder.WriteUInt64(index: Cardinal; val: UInt64); begin if index < 1 Then RaiseError('Overwrite', 'index < 1'); @@ -14566,7 +14366,7 @@ procedure TFslBytesBuilder.WriteUInt64(index: cardinal; val: UInt64); Move(val, FContent[index], 8); end; -procedure TFslBytesBuilder.WriteWord(index: cardinal; val: word); +procedure TFslBytesBuilder.WriteWord(index: Cardinal; val: word); begin if index < 1 Then RaiseError('Overwrite', 'index < 1'); @@ -14575,20 +14375,20 @@ procedure TFslBytesBuilder.WriteWord(index: cardinal; val: word); Move(val, FContent[index], 2); end; -Procedure TFslBytesBuilder.Clear; +procedure TFslBytesBuilder.Clear; Begin FContent := nil; FLength := 0; End; -Function TFslBytesBuilder.AsBytes : TBytes; +function TFslBytesBuilder.AsBytes: TBytes; Begin Result := Copy(FContent, 0, FLength); End; -Procedure TFslBytesBuilder.Append(ch : AnsiChar); +procedure TFslBytesBuilder.Append(ch: AnsiChar); Begin If FLength + 1 > System.Length(FContent) Then SetLength(FContent, System.Length(FContent) + FBufferSize); @@ -14597,7 +14397,7 @@ procedure TFslBytesBuilder.WriteWord(index: cardinal; val: word); Inc(FLength); End; -Procedure TFslBytesBuilder.Append(b : Byte); +procedure TFslBytesBuilder.Append(b: Byte); Begin If FLength + 1 > System.Length(FContent) Then SetLength(FContent, System.Length(FContent) + FBufferSize); @@ -14708,7 +14508,7 @@ procedure TFslBytesBuilder.Append(mem: Pointer; len: word); End; end; -Procedure TFslBytesBuilder.Append(Const bytes : TBytes); +procedure TFslBytesBuilder.Append(const bytes: TBytes); Begin If System.Length(bytes) > 0 Then Begin @@ -16916,11 +16716,11 @@ function removeAccentFromChar(ch : UnicodeChar) : String; #$2C6C : result := 'z'; #$A763 : result := 'z'; - #$0439 : result := UnicodeToUTF8($0438); + #$0439 : result := {$IFDEF FPC}UnicodeToUTF8{$ELSE}Chr{$ENDIF}($0438); else if ch < #$FE then result := ch else - result := UnicodeToUTF8(v); + result := {$IFDEF FPC}UnicodeToUTF8{$ELSE}Chr{$ENDIF}(v); end; end; @@ -17555,6 +17355,22 @@ function TCommaSeparatedStringBuilder.makeString: String; end; end; +// from https://www.appsloveworld.com/coding/delphi/2/in-delphi-how-do-i-round-a-tdatetime-to-closest-second-minute-five-minute-etc +function RoundDateTimeToNearestInterval(vTime : TDateTime; vInterval : TDateTime = 60/SecsPerDay) : TDateTime; +var + vTimeSec,vIntSec,vRoundedSec : int64; +begin + //Rounds to nearest minute by default + vTimeSec := round(vTime * SecsPerDay); + vIntSec := round(vInterval * SecsPerDay); + + if vIntSec = 0 then exit(vTimeSec / SecsPerDay); + + vRoundedSec := round(vTimeSec / vIntSec) * vIntSec; + + Result := vRoundedSec / SecsPerDay; +end; + function ProcessCpuUsage : UInt64; // actual value is not accurate but is consistent {$IFDEF LINUX} begin diff --git a/library/fsl/fsl_xml.pas b/library/fsl/fsl_xml.pas index db2c37403..70059a4bd 100644 --- a/library/fsl/fsl_xml.pas +++ b/library/fsl/fsl_xml.pas @@ -169,7 +169,7 @@ TMXmlElement = class (TMXmlNamedNode) procedure SetAttribute(name: String; const Value: String); function getAbbreviation(ns : String) : String; function getAbbreviationPriv(ns : String; var abbrev : String): boolean; - procedure writeToXml(b : TStringBuilder; pretty : boolean; indent : integer); + procedure writeToXml(b : TFslStringBuilder; pretty : boolean; indent : integer); function GetAttributeNS(ns, name: String): String; procedure SetAttributeNS(ns, name: String; const Value: String); function GetAllText: String; @@ -359,7 +359,7 @@ TMXmlParser = class (TFslObject) private reader : TFslTextReader; options : TMXmlParserOptions; - b : TStringBuilder; + b : TFslStringBuilder; FHtmlEntities : TDictionary; FLocation, FStartLocation : TSourceLocation; @@ -1178,7 +1178,7 @@ function TMXmlElement.findLocation(loc : TSourceLocation; path : TFslList ntComment then @@ -1434,9 +1434,9 @@ function TMXmlElement.ToString: String; function TMXmlElement.ToXml(pretty : boolean = false): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try writeToXml(b, pretty, 0); result := b.toString(); @@ -1445,7 +1445,7 @@ function TMXmlElement.ToXml(pretty : boolean = false): String; end; end; -procedure TMXmlElement.writeToXml(b: TStringBuilder; pretty : boolean; indent : integer); +procedure TMXmlElement.writeToXml(b: TFslStringBuilder; pretty : boolean; indent : integer); var a : TMXmlAttribute; c : TMXmlElement; @@ -1643,7 +1643,7 @@ function TMXmlParser.parseXPath: TMXPathExpressionNode; FLocation := TSourceLocation.Create; FStartLocation := FLocation; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try result := TMXPathExpressionNode.Create; try @@ -1970,7 +1970,7 @@ function TMXmlParser.parse : TMXmlDocument; FLocation := TSourceLocation.Create; FStartLocation := FLocation; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try s := ReadToken(true); rule(s[1] = '<', 'Unable to read Document - starts with "'+s+'"'); @@ -2066,13 +2066,13 @@ procedure TMXmlParser.ReadInstruction(parent: TMXmlElement); Var s : String; done : boolean; - c : TStringBuilder; + c : TFslStringBuilder; res : TMXmlElement; begin res := TMXmlElement.Create(ntProcessingInstruction); try res.Start := FStartLocation; - c := TStringBuilder.Create; + c := TFslStringBuilder.Create; try done := false; repeat @@ -2123,13 +2123,13 @@ procedure TMXmlParser.ReadComment(parent: TMXmlElement); Var s : String; done : boolean; - c : TStringBuilder; + c : TFslStringBuilder; res : TMXmlElement; begin res := TMXmlElement.Create(ntComment); try res.Start := FStartLocation; - c := TStringBuilder.Create; + c := TFslStringBuilder.Create; try rule(read = '-', 'Syntax Error reading comment'); rule(read = '-', 'Syntax Error reading comment'); @@ -2582,11 +2582,11 @@ procedure TMXPathExpressionNode.SetNextOp(const Value: TMXPathExpressionNode); function TMXPathExpressionNode.ToString: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; p : TMXPathExpressionNode; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if (FAxis <> axisChild) and (FNodeType <> xentGroup) then begin @@ -3034,7 +3034,7 @@ procedure TMXmlDocument.funcName(focus: TMXmlNode; work: TFslList); function TMXmlDocument.funcNormalizeSpace(expr : TMXPathExpressionNode; atEntry : boolean; variables : TXPathVariables; position : integer; focus : TMXmlNode) : TMXmlNode; var - b : TStringBuilder; + b : TFslStringBuilder; n : TMXmlNode; ch : char; ws : boolean; @@ -3042,7 +3042,7 @@ function TMXmlDocument.funcNormalizeSpace(expr : TMXPathExpressionNode; atEntry begin if expr.Params.Count <> 1 then raise EXmlException.Create('Wrong number of parameters for normalize-space: expected at least 1 but found '+inttostr(expr.Params.Count)); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try work := evaluate(expr.Params[0], atEntry, variables, position, focus); try @@ -3092,13 +3092,13 @@ function TMXmlDocument.funcNot(expr: TMXPathExpressionNode; atEntry : boolean; v function TMXmlDocument.funcNumber(expr: TMXPathExpressionNode; atEntry: boolean; variables: TXPathVariables; position : integer; focus: TMXmlNode): TMXmlNode; var - b : TStringBuilder; + b : TFslStringBuilder; work: TFslList; n : TMXmlNode; begin if expr.Params.Count <> 1 then raise EXmlException.Create('Wrong number of parameters for number: expected 1 but found 0'); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try work := evaluate(expr.Params[0], atEntry, variables, position, focus); try @@ -3145,13 +3145,13 @@ procedure TMXmlDocument.funcStartsWith(expr : TMXPathExpressionNode; atEntry : b function TMXmlDocument.funcString(expr: TMXPathExpressionNode; atEntry: boolean; variables: TXPathVariables; position : integer; focus: TMXmlNode): TMXmlNode; var - b : TStringBuilder; + b : TFslStringBuilder; work: TFslList; n : TMXmlNode; begin if expr.Params.Count <> 1 then raise EXmlException.Create('Wrong number of parameters for string: expected 1 but found 0'); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try work := evaluate(expr.Params[0], atEntry, variables, position, focus); try @@ -3208,10 +3208,10 @@ function TMXmlDocument.funcTextTest(Context: TObject; node: TMXmlNamedNode): boo function StringTranslate(s1,s2,s3 : string) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if (s3.Length > 1) then raise EXmlException.Create('3rd parameter to translate has more than a single character'); @@ -3274,14 +3274,14 @@ procedure TMXmlDocument.funcComment(focus: TMXmlNode; work: TFslList) function TMXmlDocument.funcConcat(expr: TMXPathExpressionNode; atEntry: boolean; variables: TXPathVariables; position : integer; focus : TMXmlNode) : TMXmlNode; var - b : TStringBuilder; + b : TFslStringBuilder; p : TMXPathExpressionNode; work: TFslList; n : TMXmlNode; begin if expr.Params.Count = 0 then raise EXmlException.Create('Wrong number of parameters for concat: expected at least 1 but found 0'); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for p in expr.Params do begin @@ -3880,7 +3880,7 @@ procedure TMXmlDocument.ToXml(stream: TFslStream; pretty, xmlHeader: boolean); begin s := ToXml(pretty, xmlheader); b := TEncoding.UTF8.GetBytes(s); - stream.Write(b, length(b)); + stream.Write(b[0], length(b)); end; procedure TMXmlDocument.ToXml(stream: TStream; pretty, xmlHeader: boolean); @@ -3890,14 +3890,14 @@ procedure TMXmlDocument.ToXml(stream: TStream; pretty, xmlHeader: boolean); begin s := ToXml(pretty, xmlheader); b := TEncoding.UTF8.GetBytes(s); - stream.Write(b, length(b)); + stream.Write(b[0], length(b)); end; function TMXmlDocument.ToXml(pretty, xmlHeader: boolean): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if xmlHeader then begin diff --git a/library/fsl/tests/fsl_testing.pas b/library/fsl/tests/fsl_testing.pas index 7a6a09663..14c2ff9dd 100644 --- a/library/fsl/tests/fsl_testing.pas +++ b/library/fsl/tests/fsl_testing.pas @@ -293,7 +293,7 @@ procedure TFslTestCase.assertEqual(const left, right: TBytes; message: String); if length(left) <> length(right) then raise EFslException.create('Byte Arrays differ in length: '+inttostr(length(left))+'/'+inttostr(length(right))); {$ELSE} - todo + raise EFslException.Create('Not Implemented Yet'); {$ENDIF} end; @@ -308,7 +308,7 @@ procedure TFslTestCase.assertEqual(const left, right: TBytes); if length(left) <> length(right) then raise EFslException.create('Byte Arrays differ in length: '+inttostr(length(left))+'/'+inttostr(length(right))); {$ELSE} - todo + raise EFslException.Create('Not Implemented Yet'); {$ENDIF} end; diff --git a/library/fsl/tests/fsl_tests.pas b/library/fsl/tests/fsl_tests.pas index 730932188..639013196 100644 --- a/library/fsl/tests/fsl_tests.pas +++ b/library/fsl/tests/fsl_tests.pas @@ -1,4 +1,4 @@ -unit fsl_tests; +unit fsl_tests; { Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) @@ -34,7 +34,7 @@ interface Uses {$IFDEF WINDOWS} Windows, {$ENDIF} SysUtils, Classes, {$IFNDEF FPC}Soap.EncdDecd, System.NetEncoding, {$ENDIF} SyncObjs, - zlib, zstream, + zlib, {$IFDEF FPC} zstream, {$ENDIF} {$IFDEF FPC} FPCUnit, TestRegistry, RegExpr, {$ELSE} TestFramework, {$ENDIF} fsl_testing, IdGlobalProtocols, fsl_base, fsl_utilities, fsl_stream, fsl_threads, fsl_collections, fsl_fpc, fsl_versions, fsl_gzip, @@ -720,7 +720,7 @@ procedure TCSVParserTests.testCSV; csv : TFslCSVExtractor; items : TFslStringList; begin - csv := TFslCSVExtractor.create(TFslFile.create(TestSettings.serverTestFile(['testcases', 'csv', 'test.csv']), fmOpenRead)); + csv := TFslCSVExtractor.create(TFslFile.create(TestSettings.serverTestFile(['testcases', 'csv', 'test.csv']), fmOpenRead + fmShareDenyWrite)); try csv.IgnoreWhitespace := true; items := TFslStringList.Create; @@ -751,6 +751,7 @@ procedure TFslUtilitiesTestCases.TestObjectTracking; var a, b, c, d : TFslTestObject; begin + {$IFDEF OBJECT_TRACKING} // --------------------- a := TFslTestObject.Create; b := TFslTestObject.Create; @@ -1091,6 +1092,7 @@ procedure TFslUtilitiesTestCases.TestObjectTracking; a.free; AssertEqual(1, classCount('TFslTestObject')); d.free; + {$ENDIF} AssertEqual(0, classCount('TFslTestObject')); end; @@ -1610,11 +1612,11 @@ function TXPathTests.findTest(name: String): TMXmlElement; function XpathForPath(path : string):string; var p : TArray; - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin p := path.Split(['.']); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for s in p do begin @@ -4384,7 +4386,7 @@ procedure TXPlatformTests.TestFslFile; end; assertTrue(FileExists(filename), 'FileExists(filename) #2'); assertTrue(FileSize(filename) = 27, 'FileSize(filename) = 27'); - f := TFslFile.Create(filename, fmOpenRead); + f := TFslFile.Create(filename, fmOpenRead + fmShareDenyWrite); try SetLength(s, f.Size); f.Read(s[1], f.Size); @@ -4951,7 +4953,7 @@ procedure TDigitalSignatureTests.testFile(filename : String); f : TFileStream; sig : TDigitalSigner; begin - f := TFileStream.Create(filename, fmOpenRead); + f := TFileStream.Create(filename, fmOpenRead + fmShareDenyWrite); try setLength(bytes, f.Size); f.Read(bytes[0], length(bytes)); @@ -5137,8 +5139,11 @@ procedure TFslCollectionsTests.testAdd; end; procedure TFslCollectionsTests.executeFail(context : TObject); +var + o : TFslTestObjectList; begin - list.Add(TFslTestObjectList.create); + o:= TFslTestObjectList.create; + list.Add(o); end; procedure TFslCollectionsTests.testAddFail; @@ -5278,7 +5283,7 @@ function TTarGZParserTests.load(filename : String) : TFslList; begin result := TFslList.Create; try - bs := TBytesStream.create(ungzip(fileToBytes(filename))); + bs := TBytesStream.create(ungzip(fileToBytes(filename), filename)); try tar := TTarArchive.Create(bs); try diff --git a/library/ftx/fhir_codesystem_service.pas b/library/ftx/fhir_codesystem_service.pas index 2b1b8d088..73be55b7c 100644 --- a/library/ftx/fhir_codesystem_service.pas +++ b/library/ftx/fhir_codesystem_service.pas @@ -34,18 +34,11 @@ interface uses SysUtils, Classes, Generics.Defaults, Generics.Collections, - fsl_base, fsl_utilities, fsl_collections, fsl_http, fsl_lang, fsl_versions, fsl_fpc, fsl_logging, fsl_regex, + fsl_base, fsl_utilities, fsl_collections, fsl_http, fsl_lang, fsl_versions, fsl_fpc, fsl_logging, fsl_regex, fsl_i18n, fhir_objects, fhir_factory, fhir_common, fhir_cdshooks, fhir_utilities, fhir_features, fhir_uris, ftx_service; type - TConceptAdornment = class (TFslStringList) - private - FParent: TFHIRCodeSystemConceptW; - public - property parent : TFHIRCodeSystemConceptW read FParent write FParent; // not owned, can't be - end; - TFhirCodeSystemProviderContext = class (TCodeSystemProviderContext) private concept : TFhirCodeSystemConceptW; @@ -67,30 +60,43 @@ TFhirCodeSystemConceptMatch = class (TFslObject) destructor Destroy; override; end; - TCodeSystemAdornment = class (TFslObject) + { TFHIRCodeSystemCodeEntry } + + TFHIRCodeSystemCodeEntry = class (TFslObject) private - FCodeMap : TFhirCodeSystemConceptMapW; - protected - function sizeInBytesV(magic : integer) : cardinal; override; + FConcept: TFhirCodeSystemConceptW; + FParents: TFslList; + procedure addParent(p : TFHIRCodeSystemCodeEntry); public - constructor Create(map : TFhirCodeSystemConceptMapW); + constructor Create(Concept : TFhirCodeSystemConceptW); destructor Destroy; override; - property codeMap1 : TFhirCodeSystemConceptMapW read FCodeMap; + function link: TFHIRCodeSystemCodeEntry; overload; + + property Concept : TFhirCodeSystemConceptW read FConcept; + function hasParents : boolean; + property parents : TFslList read FParents; end; { TFHIRCodeSystemEntry } + TFHIRCodeSystemEntryLoadingState = (cseNotLoaded, cseLoading, cseLoaded, cseLoadingFailed); + TFHIRCodeSystemEntry = class (TFslObject) private + FLoadingFailMessage: String; // we get the proxy, and maybe we load this into the loaded one when we need to // makes start up very very much faster - FLoaded : boolean; + FLoadingState : TFHIRCodeSystemEntryLoadingState; FCodeSystemProxy : TFHIRResourceProxyV; FSupplementProxies : TFslList; FCodeSystem : TFHIRCodeSystemW; FSupplements : TFslList; + FCodeMap : TFslMap; + procedure loadCodeSystem; + function uc(code : String) : String; + function GetHasSupplements: boolean; function GetSupplementProxies: TFslList; function GetSupplements: TFslList; @@ -107,7 +113,8 @@ TFHIRCodeSystemEntry = class (TFslObject) constructor Create(res : TFHIRCodeSystemW); overload; destructor Destroy; override; - property Loaded : boolean read FLoaded write FLoaded; + property LoadingState : TFHIRCodeSystemEntryLoadingState read FLoadingState write FLoadingState; + property LoadingFailMessage : String read FLoadingFailMessage write FLoadingFailMessage; function Link : TFHIRCodeSystemEntry; overload; property id : String read GetId write SetId; property url : String read GetUrl; @@ -163,6 +170,7 @@ TFhirCodeSystemProviderFilterSorter = class (TFslComparer; procedure Add(item : TFhirCodeSystemConceptW; rating : double); @@ -187,7 +195,6 @@ function nonLeafCodes(context : pointer; concept : TFhirCodeSystemConceptW) : bo TFhirCodeSystemProvider = class (TCodeSystemProvider) private FCs : TFhirCodeSystemEntry; - FCodeMap : TFhirCodeSystemConceptMapW; FFactory : TFHIRFactory; function LocateCode(code : String; altOpt : TAlternateCodeOptions) : TFhirCodeSystemConceptW; @@ -199,25 +206,28 @@ TFhirCodeSystemProvider = class (TCodeSystemProvider) function locateParent(ctxt: TFHIRCodeSystemConceptW; code: String): String; function locCode(list: TFhirCodeSystemConceptListW; code, synonym: String; altOpt : TAlternateCodeOptions): TFhirCodeSystemConceptW; function getProperty(code : String) : TFhirCodeSystemPropertyW; + function hasPropForCode(code : String) : boolean; function conceptHasProperty(concept : TFhirCodeSystemConceptW; url : String; value : string) : boolean; - procedure iterateConceptsByProperty(src : TFhirCodeSystemConceptListW; pp : TFhirCodeSystemPropertyW; value : String; list: TFhirCodeSystemProviderFilterContext); + procedure iterateConceptsByProperty(src : TFhirCodeSystemConceptListW; pp : TFhirCodeSystemPropertyW; values: TStringArray; list: TFhirCodeSystemProviderFilterContext; include : boolean); + procedure iterateConceptsByKnownProperty(src : TFhirCodeSystemConceptListW; code : String; values: TStringArray; List: TFhirCodeSystemProviderFilterContext; include : boolean); procedure iterateConceptsByRegex(src : TFhirCodeSystemConceptListW; regex: string; list: TFhirCodeSystemProviderFilterContext); procedure listChildrenByProperty(code : String; list, children : TFhirCodeSystemConceptListW); protected function sizeInBytesV(magic : integer) : cardinal; override; public - constructor Create(languages : TIETFLanguageDefinitions; factory : TFHIRFactory; cs : TFhirCodeSystemEntry); overload; + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; factory : TFHIRFactory; cs : TFhirCodeSystemEntry); overload; destructor Destroy; override; function contentMode : TFhirCodeSystemContentMode; override; + function sourcePackage : String; override; function description : String; override; function name(context: TCodeSystemProviderContext): String; override; - function version(context: TCodeSystemProviderContext): String; override; + function version(): String; override; function TotalCount : integer; override; function getPropertyDefinitions : TFslList; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri() : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; overload; override; function IsAbstract(context : TCodeSystemProviderContext) : boolean; override; @@ -235,14 +245,16 @@ TFhirCodeSystemProvider = class (TCodeSystemProvider) function parent(context : TCodeSystemProviderContext) : String; override; function listCodes(ctxt : TCodeSystemProviderContext; altOpt : TAlternateCodeOptions) : TStringArray; override; function canParent : boolean; override; + function hasAnyDisplays(langs : THTTPLanguageList) : boolean; override; function hasSupplement(url : String) : boolean; override; procedure listSupplements(ts : TStringList); override; function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; - function locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; override; + function locateIsA(code, parent : String; disallowSelf : boolean = false) : TCodeSystemProviderContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function searchFilter(filter : TSearchFilterText; prep : TCodeSystemProviderFilterPreparationContext; sort : boolean) : TCodeSystemProviderFilterContext; overload; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -304,17 +316,20 @@ constructor TFHIRCodeSystemEntry.Create(res : TFHIRResourceProxyV); begin inherited Create; FCodeSystemProxy := res; + FLoadingState := cseNotLoaded; end; constructor TFHIRCodeSystemEntry.Create(res: TFHIRCodeSystemW); begin inherited Create; FCodeSystem := res; - FLoaded := true; + LoadCodeSystem; + FLoadingState := cseLoaded; end; destructor TFHIRCodeSystemEntry.Destroy; begin + FCodeMap.Free; FCodeSystemProxy.Free; FSupplementProxies.Free; FCodeSystem.free; @@ -322,6 +337,69 @@ destructor TFHIRCodeSystemEntry.Destroy; inherited; end; +procedure TFHIRCodeSystemEntry.loadCodeSystem; + procedure registerCodes(list : TFhirCodeSystemConceptListW; parent : TFHIRCodeSystemCodeEntry); + var + item : TFhirCodeSystemConceptW; + entry : TFHIRCodeSystemCodeEntry; + begin + for item in list do + begin + if not FCodeMap.ContainsKey(uc(item.code)) then + begin + entry := TFHIRCodeSystemCodeEntry.create(item.link); + try + FCodeMap.AddOrSetValue(uc(item.code), entry.link); + item.TagNoLink := entry; + if (parent <> nil) then + entry.addParent(parent.link); + if (item.HasConcepts) then + registerCodes(item.conceptList, entry); + finally + entry.free; + end; + end; + end; + end; +var + prop : TFHIRCodeSystemPropertyW; + entry : TFHIRCodeSystemCodeEntry; + p : TFhirCodeSystemConceptPropertyW; + c : TFHIRCodeSystemCodeEntry; +begin + Assert(FCodeMap = nil); + + FCodeMap := TFslMap.create; + FCodeMap.defaultValue := nil; + registerCodes(FCodeSystem.conceptList, nil); + for prop in FCodeSystem.properties.forEnum do + begin + if (prop.code = 'parent') or (prop.uri = 'http://hl7.org/fhir/concept-properties#parent') then + begin + for entry in FCodeMap.Values do + begin + for p in entry.Concept.properties.forEnum do + begin + if (p.code = prop.code) and (p.value <> nil) and (p.value.isPrimitive) then + begin + c := FCodeMap[p.value.primitiveValue]; + if (c <> nil) then + entry.addParent(c.link); + end; + end; + end; + end; + end; +end; + +function TFHIRCodeSystemEntry.uc(code: String): String; +begin + if FCodeSystem.caseSensitive then + result := code + else + result := code.toUpper; +end; + function TFHIRCodeSystemEntry.GetHasSupplements: boolean; begin result := ((FSupplements <> nil) and (FSupplements.Count > 0)) or ((FSupplementProxies <> nil) and (FSupplementProxies.Count > 0)); @@ -361,6 +439,8 @@ procedure TFHIRCodeSystemEntry.SetCodeSystem(const Value: TFHIRCodeSystemW); begin FCodeSystem.free; FCodeSystem := value; + if FCodeSystem <> nil then + LoadCodeSystem; end; function TFHIRCodeSystemEntry.GetUrl: String; @@ -390,6 +470,7 @@ function TFHIRCodeSystemEntry.sizeInBytesV(magic : integer) : cardinal; inc(result, FCodeSystem.sizeInBytes(magic)); inc(result, FSupplements.sizeInBytes(magic)); inc(result, FCodeSystemProxy.sizeInBytes(magic)); + inc(result, FCodeMap.sizeInBytes(magic)); inc(result, FSupplementProxies.sizeInBytes(magic)); end; @@ -436,44 +517,56 @@ function TFhirCodeSystemProviderFilterContext.sizeInBytesV(magic : integer) : ca inc(result, concepts.sizeInBytes(magic)); end; -{ TCodeSystemAdornment } +{ TFHIRCodeSystemCodeEntry } + +procedure TFHIRCodeSystemCodeEntry.addParent(p: TFHIRCodeSystemCodeEntry); +begin + if FParents = nil then + FParents := TFslList.create; + FParents.add(p); +end; -constructor TCodeSystemAdornment.Create(map: TFhirCodeSystemConceptMapW); +constructor TFHIRCodeSystemCodeEntry.Create(Concept: TFhirCodeSystemConceptW); begin inherited Create; - FCodeMap := map; + FConcept := Concept; + FParents := nil; end; -destructor TCodeSystemAdornment.Destroy; +destructor TFHIRCodeSystemCodeEntry.Destroy; begin - FCodeMap.free; - inherited; + FConcept.free; + FParents.Free; + inherited Destroy; end; -function TCodeSystemAdornment.sizeInBytesV(magic : integer) : cardinal; +function TFHIRCodeSystemCodeEntry.link: TFHIRCodeSystemCodeEntry; begin - result := inherited sizeInBytesV(magic); - inc(result, FCodeMap.sizeInBytes(magic)); + result := TFHIRCodeSystemCodeEntry(inherited Link); +end; + +function TFHIRCodeSystemCodeEntry.hasParents: boolean; +begin + result := FParents <> nil; end; { TFhirCodeSystemProvider } -constructor TFhirCodeSystemProvider.Create(languages: TIETFLanguageDefinitions; - factory: TFHIRFactory; cs: TFhirCodeSystemEntry); +constructor TFhirCodeSystemProvider.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport; factory: TFHIRFactory; cs: TFhirCodeSystemEntry); begin - Create(languages); + Create(languages, i18n); FCs := cs; FFactory := factory; - if (FCs.CodeSystem.tag <> nil) then - FCodeMap := TCodeSystemAdornment(FCs.CodeSystem.Tag).FCodeMap; + if FCs.CodeSystem.language <> '' then + setDefLang(FLanguages.parse(FCs.CodeSystem.language)); end; procedure TFhirCodeSystemProvider.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:is-a')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:is-not-a')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:in')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'child:exists')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:is-a')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:is-not-a')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:in')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'child:exists')); end; procedure TFhirCodeSystemProvider.getStatus(out status: TPublicationStatus; out standardsStatus: String; out experimental : boolean); @@ -623,6 +716,11 @@ function TFhirCodeSystemProvider.canParent: boolean; Result := true; end; +function TFhirCodeSystemProvider.hasAnyDisplays(langs: THTTPLanguageList): boolean; +begin + result := fcs.CodeSystem.hasAnyDisplays(langs); +end; + function TFhirCodeSystemProvider.description: String; begin result := fcs.CodeSystem.name; @@ -668,13 +766,13 @@ function spacer(s : String) : String; procedure TFhirCodeSystemProvider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); var - b : TStringBuilder; + b : TFslStringBuilder; ctxt : TFhirCodeSystemProviderContext; concept, c : TFhirCodeSystemConceptW; d : TFhirCodeSystemConceptDesignationW; codes : TFhirCodeSystemConceptListW; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ctxt := TFhirCodeSystemProviderContext(locate(code)); if ctxt = nil Then @@ -773,20 +871,25 @@ function TFhirCodeSystemProvider.Display(context: TCodeSystemProviderContext; la ccd : TFhirCodeSystemConceptDesignationW; css : TFHIRCodeSystemW; cc : TFhirCodeSystemConceptW; + lm, um : Boolean; begin result := TFhirCodeSystemProviderContext(context).concept.display; for ccd in TFhirCodeSystemProviderContext(context).concept.designations.forEnum do - if (langList = nil) or langList.matches(FLanguages, ccd.language) then + begin + lm := (langList <> nil) and not (langList.matches(FCs.CodeSystem.language, false)) and langList.matches(ccd.language, false); + um := (ccd.use = nil); // or isDisplayUsage(ccd.use); + if (lm and um) then result := ccd.value.Trim; + end; for css in FCs.Supplements do begin cc := locCode(css.conceptList, TFhirCodeSystemProviderContext(context).concept.code, css.propertyCode('http://hl7.org/fhir/concept-properties#alternateCode'), nil); if (cc <> nil) then begin - if (langList <> nil) and langList.matches(FLanguages, css.language) then + if (langList <> nil) and langList.matches(css.language, false) then result := cc.display.Trim; for ccd in cc.designations.forEnum do - if (langList <> nil) and langList.matches(FLanguages, ccd.language) then + if (langList <> nil) and langList.matches(ccd.language, false) then result := ccd.value.Trim; end; end; @@ -881,6 +984,14 @@ function TFhirCodeSystemProvider.contentMode: TFhirCodeSystemContentMode; result := FCs.CodeSystem.content; end; +function TFhirCodeSystemProvider.sourcePackage: String; +begin + if (FCs.CodeSystemProxy <> nil) and (FCs.CodeSystemProxy.packageId <> '') then + result := FCs.CodeSystemProxy.packageId + else + result := ''; +end; + function TFhirCodeSystemProvider.isNotClosed(textFilter: TSearchFilterText; propFilter: TCodeSystemProviderFilterContext): boolean; begin result := false; @@ -893,7 +1004,7 @@ function TFhirCodeSystemProvider.getDefinition(code: String): String; ctxt := locate(code); try if (ctxt = nil) then - raise ETerminologyError.create('Unable to find '+code+' in '+systemUri(nil), itUnknown) + raise ETerminologyError.create('Unable to find '+code+' in '+systemUri, itUnknown) else result := Definition(ctxt); finally @@ -908,7 +1019,7 @@ function TFhirCodeSystemProvider.getDisplay(code: String; langList : THTTPLangua ctxt := locate(code); try if (ctxt = nil) then - raise ETerminologyError.create('Unable to find '+code+' in '+systemUri(nil), itUnknown) + raise ETerminologyError.create('Unable to find '+code+' in '+systemUri, itUnknown) else result := Display(ctxt, langList); finally @@ -917,42 +1028,80 @@ function TFhirCodeSystemProvider.getDisplay(code: String; langList : THTTPLangua end; function TFhirCodeSystemProvider.getParent(ctxt: TFhirCodeSystemConceptW): TFhirCodeSystemConceptW; - function getMyParent(list: TFhirCodeSystemConceptListW): TFhirCodeSystemConceptW; - var - c, TFHIRCodeSystemEntry : TFhirCodeSystemConceptW; - begin - for c in list do - begin - if c.hasConcept(ctxt) then - exit(c); - TFHIRCodeSystemEntry := getMyParent(c.conceptList); - if (TFHIRCodeSystemEntry <> nil) then - exit(TFHIRCodeSystemEntry); - end; - exit(nil); - end; + //function getMyParent(list: TFhirCodeSystemConceptListW): TFhirCodeSystemConceptW; + //var + // c, TFHIRCodeSystemEntry : TFhirCodeSystemConceptW; + //begin + // for c in list do + // begin + // if c.hasConcept(ctxt) then + // exit(c); + // TFHIRCodeSystemEntry := getMyParent(c.conceptList); + // if (TFHIRCodeSystemEntry <> nil) then + // exit(TFHIRCodeSystemEntry); + // end; + // exit(nil); + //end; +var + entry : TFHIRCodeSystemCodeEntry; begin - if (FCodeMap <> nil) then - result := TConceptAdornment(ctxt.Tag).FParent + entry := ctxt.TagNoLink as TFHIRCodeSystemCodeEntry; + if (entry <> nil) and (entry.parents <> nil) and (entry.parents.Count > 0) then + result := entry.parents[0].Concept else - result := getMyParent(FCs.CodeSystem.conceptList) + result := nil; + //if (FCodeMap <> nil) then + // result := TConceptAdornment(ctxt.TagNoLink).FParent + //else + // result := getMyParent(FCs.CodeSystem.conceptList) end; function TFhirCodeSystemProvider.getProperty(code: String): TFhirCodeSystemPropertyW; var p : TFhirCodeSystemPropertyW; cs : TFhirCodeSystemW; + uri : String; begin result := nil; + uri := csUriForProperty(code); + if (uri <> '') then + begin + for p in FCs.CodeSystem.properties.forEnum do + if (p.uri = uri) then + exit(p.link); + for cs in FCs.Supplements do + for p in cs.properties.forEnum do + if (p.uri = uri) then + exit(p.link); + end; + for p in FCs.CodeSystem.properties.forEnum do - if (p.code = code) then + if (p.code = code) and ((uri = '') or (p.uri = '')) then exit(p.link); + for cs in FCs.Supplements do for p in cs.properties.forEnum do - if (p.code = code) then + if (p.code = code) and ((uri = '') or (p.uri = '')) then exit(p.link); end; +function TFhirCodeSystemProvider.hasPropForCode(code: String): boolean; +var + p : TFhirCodeSystemPropertyW; + cs : TFhirCodeSystemW; + uri : String; +begin + result := false; + for p in FCs.CodeSystem.properties.forEnum do + if (p.code = code) then + exit(true); + + for cs in FCs.Supplements do + for p in cs.properties.forEnum do + if (p.code = code) then + exit(true); +end; + function TFhirCodeSystemProvider.hasSupplement(url: String): boolean; var @@ -960,7 +1109,7 @@ function TFhirCodeSystemProvider.hasSupplement(url: String): boolean; begin result := false; for cs in FCs.Supplements do - if cs.vurl = url then + if (cs.vurl = url) or (cs.url = url) then exit(true); end; @@ -985,7 +1134,7 @@ function TFhirCodeSystemProvider.locCode(list : TFhirCodeSystemConceptListW; cod for c in list do begin - if (c.code = code) then + if (FCs.uc(c.code) = FCs.uc(code)) then exit(c); // legacy if (altOpt <> nil) then @@ -995,7 +1144,7 @@ function TFhirCodeSystemProvider.locCode(list : TFhirCodeSystemConceptListW; cod for ext in c.getExtensionsW('http://hl7.org/fhir/StructureDefinition/codesystem-alternate').forEnum do begin s := ext.getExtensionString('code'); - if (s = code) then + if (FCs.uc(s) = FCs.uc(code)) then exit(c); end; end; @@ -1012,8 +1161,8 @@ function TFhirCodeSystemProvider.locCode(list : TFhirCodeSystemConceptListW; cod function TFhirCodeSystemProvider.LocateCode(code : String; altOpt : TAlternateCodeOptions) : TFhirCodeSystemConceptW; begin - if (FCodeMap <> nil) and FCodeMap.ContainsKey(code) then - result := FCodeMap[code] + if (FCs.FCodeMap.ContainsKey(FCs.uc(code))) then + result := FCs.FCodeMap[FCs.uc(code)].Concept else result := locCode(FCs.CodeSystem.conceptList, code, FCs.CodeSystem.propertyCode('http://hl7.org/fhir/concept-properties#alternateCode'), altOpt); end; @@ -1049,7 +1198,7 @@ function hasProp(props : TArray; name : String; def : boolean) : boolean if (props = nil) or (length(props) = 0) then result := def else - result := StringArrayExistsSensitive(props, name); + result := StringArrayExistsSensitive(props, name) or StringArrayExistsSensitive(props, '*'); end; procedure TFhirCodeSystemProvider.extendLookup(factory : TFHIRFactory; ctxt: TCodeSystemProviderContext; langList : THTTPLanguageList; props: TArray; resp: TFHIRLookupOpResponseW); @@ -1111,7 +1260,7 @@ procedure TFhirCodeSystemProvider.extendLookup(factory : TFHIRFactory; ctxt: TCo for ccd in cc.designations.forEnum do Begin d := resp.addDesignation(ccd.language, ccd.value); - d.use := ccd.use; + d.use := ccd.use.Element; End; end; @@ -1153,7 +1302,7 @@ procedure TFhirCodeSystemProvider.listChildrenByProperty(code: String; list, chi begin if conceptHasProperty(item, 'http://hl7.org/fhir/concept-properties#parent', code) then children.Add(item.link) - else if item.conceptCount > 0 then + else if item.HasConcepts then listChildrenByProperty(code, item.conceptList, children); end; end; @@ -1206,7 +1355,7 @@ function TFhirCodeSystemProvider.subsumesTest(codeA, codeB: String): String; exit('not-subsumed'); end; -function TFhirCodeSystemProvider.systemUri(context : TCodeSystemProviderContext): String; +function TFhirCodeSystemProvider.systemUri(): String; begin result := FCs.CodeSystem.url; end; @@ -1233,7 +1382,7 @@ function TFhirCodeSystemProvider.getPropertyDefinitions: TFslList include) and (cp.code = pp.code) then begin val := true; case pp.type_ of cptCode, cptString, cptInteger, cptBoolean, cptDateTime, cptDecimal: begin - s1 := cp.value.primitiveValue; - s2 := value; - ok := s1 = s2; + ok := StringArrayExistsSensitive(values, cp.value.primitiveValue) = include; end; cptCoding: begin coding := FFactory.wrapCoding(cp.value.Link); try - ok := coding.code = value; + ok := StringArrayExistsSensitive(values, coding.code) = include; finally coding.free; end; @@ -1343,12 +1489,70 @@ procedure TFhirCodeSystemProvider.iterateConceptsByProperty(src : TFhirCodeSyste end; end; end; - //if (not ok) and (not val and (pp.type_ = cptBoolean) and (value = 'false')) then - // ok := true; if ok then list.Add(c.Link, 0); end; - iterateConceptsByProperty(c.conceptList, pp, value, list); + if (c.hasConcepts) then + iterateConceptsByProperty(c.conceptList, pp, values, list, include); + end; + finally + concepts.free; + end; +end; + +procedure TFhirCodeSystemProvider.iterateConceptsByKnownProperty( + src: TFhirCodeSystemConceptListW; code: String; values: TStringArray; + List: TFhirCodeSystemProviderFilterContext; include: boolean); +var + c, cc : TFhirCodeSystemConceptW; + concepts : TFhirCodeSystemConceptListW; + css : TFhirCodeSystemW; + cp : TFhirCodeSystemConceptPropertyW; + ok, val : boolean; + coding : TFHIRCodingW; + s1, s2 : String; +begin + concepts := TFhirCodeSystemConceptListW.Create; + try + for c in src do + begin + concepts.Clear; + concepts.Add(c.Link); + for css in FCs.Supplements do + begin + cc := locCode(css.conceptList, c.code, css.propertyCode('http://hl7.org/fhir/concept-properties#alternateCode'), nil); + if (cc <> nil) then + concepts.Add(cc.Link); + end; + for cc in concepts do + begin + ok := not include; + val := false; + for cp in cc.properties.forEnum do + begin + if (ok <> include) and (cp.code = code) then + begin + val := true; + if (cp.value.isPrimitive) then + begin + ok := StringArrayExistsSensitive(values, cp.value.primitiveValue) = include; + end + else // Coding: + begin + coding := FFactory.wrapCoding(cp.value.Link); + try + ok := StringArrayExistsSensitive(values, coding.code) = include; + finally + coding.free; + end; + end; + end; + end; + if ok then + list.Add(c.Link, 0); + end; + if (c.hasConcepts) then + iterateConceptsByKnownProperty(c.conceptList, code, values, list, include); end; finally concepts.free; @@ -1376,6 +1580,21 @@ procedure TFhirCodeSystemProvider.iterateConceptsByRegex(src: TFhirCodeSystemCon end; end; +function toStringArray(value : String) : TStringArray; overload; +begin + setLength(result, 1); + result[0] := value; +end; + +function toStringArray(value : String; ch : Char) : TStringArray; overload; +var + i : integer; +begin + result := value.split([',']); + for i := 0 to length(value) - 1 do + result[i] := result[i].trim(); +end; + function TFhirCodeSystemProvider.filter(forIteration : boolean; prop: String; op: TFhirFilterOperator; value: String; prep : TCodeSystemProviderFilterPreparationContext): TCodeSystemProviderFilterContext; var code : TFhirCodeSystemProviderContext; @@ -1485,11 +1704,61 @@ function TFhirCodeSystemProvider.filter(forIteration : boolean; prop: String; op begin pp := getProperty(prop); try - if (pp <> nil) and (op = foEqual) then + if (pp <> nil) and (op = foEqual) then begin result := TFhirCodeSystemProviderFilterContext.Create; try - iterateConceptsByProperty(FCs.CodeSystem.conceptList, pp, value, result as TFhirCodeSystemProviderFilterContext); + iterateConceptsByProperty(FCs.CodeSystem.conceptList, pp, toStringArray(value), result as TFhirCodeSystemProviderFilterContext, true); + result.link; + finally + result.free; + end; + end + else if (pp <> nil) and (op = foIn) then + begin + result := TFhirCodeSystemProviderFilterContext.Create; + try + iterateConceptsByProperty(FCs.CodeSystem.conceptList, pp, toStringArray(value, ','), result as TFhirCodeSystemProviderFilterContext, true); + result.link; + finally + result.free; + end; + end + else if (pp <> nil) and (op = foNotIn) then + begin + result := TFhirCodeSystemProviderFilterContext.Create; + try + iterateConceptsByProperty(FCs.CodeSystem.conceptList, pp, toStringArray(value, ','), result as TFhirCodeSystemProviderFilterContext, false); + result.link; + finally + result.free; + end; + end + else if StringArrayExists(['notSelectable'], prop) and (op = foEqual) then // special known properties + begin + result := TFhirCodeSystemProviderFilterContext.Create; + try + iterateConceptsByKnownProperty(FCs.CodeSystem.conceptList, prop, toStringArray(value), result as TFhirCodeSystemProviderFilterContext, true); + result.link; + finally + result.free; + end; + end + else if StringArrayExists(['notSelectable'], prop) and (op = foIn) then // special known properties + begin + result := TFhirCodeSystemProviderFilterContext.Create; + try + iterateConceptsByKnownProperty(FCs.CodeSystem.conceptList, prop, toStringArray(value, ','), result as TFhirCodeSystemProviderFilterContext, true); + result.link; + finally + result.free; + end; + end + else if StringArrayExists(['notSelectable'], prop) and (op = foNotIn) then // special known properties + begin + result := TFhirCodeSystemProviderFilterContext.Create; + try + iterateConceptsByKnownProperty(FCs.CodeSystem.conceptList, prop, toStringArray(value, ','), result as TFhirCodeSystemProviderFilterContext, false); result.link; finally result.free; @@ -1524,6 +1793,11 @@ function TFhirCodeSystemProvider.FilterMore(ctxt: TCodeSystemProviderFilterConte result := TFhirCodeSystemProviderFilterContext(ctxt).ndx < TFhirCodeSystemProviderFilterContext(ctxt).concepts.Count; end; +function TFhirCodeSystemProvider.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := TFhirCodeSystemProviderFilterContext(ctxt).concepts.Count; +end; + function TFhirCodeSystemProvider.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TCodeSystemProviderContext; var context : TFhirCodeSystemProviderFilterContext; @@ -1547,22 +1821,38 @@ function TFhirCodeSystemProvider.filterLocate(ctxt: TCodeSystemProviderFilterCon end; end; +function hasParent(c, p : TFHIRCodeSystemCodeEntry) : boolean; +var + e : TFHIRCodeSystemCodeEntry; +begin + result := false; + if (c.hasParents) then + for e in c.parents do + if (e = p) or hasParent(e, p) then + exit(true); +end; -function TFhirCodeSystemProvider.locateIsA(code, parent: String; disallowParent : boolean = false): TCodeSystemProviderContext; +function TFhirCodeSystemProvider.locateIsA(code, parent: String; disallowSelf: boolean = false): TCodeSystemProviderContext; var - p : TFhirCodeSystemProviderContext; + c, p : TFHIRCodeSystemCodeEntry; begin - result := nil; - p := Locate(parent) as TFhirCodeSystemProviderContext; - if (p <> nil) then - try - if (p.concept.code <> code) then - result := doLocate(p.concept.conceptList, code, nil) - else if not disallowParent then - result := p.Link - finally - p.free; - end; + c := FCs.FCodeMap[FCs.uc(code)]; + p := FCs.FCodeMap[FCs.uc(parent)]; + if (c <> nil) and (p <> nil) and ((c <> p) or not disallowSelf) and hasParent(c, p) then + result := TFhirCodeSystemProviderContext.create(c.Concept.link) + else + result := nil; + //result := nil; + //p := Locate(parent) as TFhirCodeSystemProviderContext; + //if (p <> nil) then + // try + // if (p.concept.code <> code) then + // result := doLocate(p.concept.conceptList, code, nil) + // else if not disallowParent then + // result := p.Link + // finally + // p.free; + // end; end; function TFhirCodeSystemProvider.name(context: TCodeSystemProviderContext): String; @@ -1575,7 +1865,6 @@ function TFhirCodeSystemProvider.sizeInBytesV(magic : integer) : cardinal; begin result := inherited sizeInBytesV(magic); inc(result, FCs.sizeInBytes(magic)); - inc(result, FCodeMap.sizeInBytes(magic)); inc(result, FFactory.sizeInBytes(magic)); end; @@ -1618,7 +1907,14 @@ function TFHIRCodeSystemManager.link: TFHIRCodeSystemManager; result := TFHIRCodeSystemManager(inherited link); end; +function escapeUrl(url : String) : String; +begin + result := url.replace('|', '%7C'); +end; + procedure TFHIRCodeSystemManager.see(r : TFHIRCodeSystemEntry); +var + eurl : String; begin if r.url = URI_CVX then r.id := r.id; @@ -1631,13 +1927,14 @@ procedure TFHIRCodeSystemManager.see(r : TFHIRCodeSystemEntry); FList.add(r.link); FMap.add(r.id, r.link); // we do this so we can drop by id + eurl := escapeUrl(r.url); if (r.url <> '') then begin if (r.version <> '') then begin - FMap.addorSetValue(r.url+'|'+r.version, r.link); + FMap.addorSetValue((eurl)+'|'+r.version, r.link); end; - updateList(r.url, r.version); + updateList(eurl, r.version); end; end; @@ -1865,7 +2162,7 @@ procedure TFHIRCodeSystemManager.drop(id : String); if (mm <> '') then FMap.remove(res.url+'|'+mm); end; - updateList(res.url, res.version); + updateList(escapeUrl(res.url), res.version); finally res.free; end; diff --git a/library/ftx/fhir_valuesets.pas b/library/ftx/fhir_valuesets.pas index f1e8726e5..5cbb5c3fb 100644 --- a/library/ftx/fhir_valuesets.pas +++ b/library/ftx/fhir_valuesets.pas @@ -29,162 +29,29 @@ } {$I fhir.inc} +{.$.DEFINE DUMP_DEAD_VS} interface -{ -todo: - include designations - include Inactive - -} uses SysUtils, Classes, - fsl_base, fsl_collections, fsl_utilities, fsl_http, fsl_lang, fsl_logging, fsl_i18n, fsl_versions, + fsl_base, fsl_collections, fsl_utilities, fsl_http, fsl_lang, fsl_logging, fsl_i18n, fsl_versions, fsl_threads, fhir_objects, fhir_common, ftx_service, fhir_factory, fhir_xhtml, fhir_extensions, fhir_uris, fhir_parser, - fhir_codesystem_service; + fhir_codesystem_service, fhir_tx; const UPPER_LIMIT_NO_TEXT = 1000; UPPER_LIMIT_TEXT = 1000;// won't expand a value set bigger than this - just takes too long, and no one's going to do anything with it anyway + INTERNAL_LIMIT = 10000; // won't make an internal buffer bigger than this. This might need to be expanded if there's a big exclusion? FHIR_VERSION_CANONICAL_SPLIT_2 = '?version='; FHIR_VERSION_CANONICAL_SPLIT_3p = '|'; EXPANSION_DEAD_TIME_SECS = 30; + VALIDATION_DEAD_TIME_SECS = 30; Type - TTrueFalseUnknown = (bTrue, bFalse, bUnknown); - - TFhirExpansionParamsVersionRuleMode = (fvmDefault, fvmCheck, fvmOverride); - - { TFhirExpansionParamsVersionRule } - - TFhirExpansionParamsVersionRule = class (TFslObject) - private - Fsystem : String; - Fversion : String; - FMode : TFhirExpansionParamsVersionRuleMode; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - public - constructor Create(system, version : String); overload; - constructor Create(system, version : String; mode : TFhirExpansionParamsVersionRuleMode); overload; - - property system : String read FSystem write FSystem; - property version : String read FVersion write FVersion; - property mode : TFhirExpansionParamsVersionRuleMode read FMode write FMode; - - function asString : String; - end; - - { TFHIRExpansionParams } - - TFHIRExpansionParams = class (TFslObject) - private - FVersionRules : TFslList; - FactiveOnly: boolean; - FexcludeNested: boolean; - FGenerateNarrative: boolean; - FlimitedExpansion: boolean; - FexcludeNotForUI: boolean; - FexcludePostCoordinated: boolean; - FincludeDesignations: boolean; - FincludeDefinition: boolean; - FUid: String; - FMembershipOnly : boolean; - FDefaultToLatestVersion : boolean; - FIncompleteOK: boolean; - FProperties : TStringList; - FDisplayWarning : boolean; - FLanguages : THTTPLanguageList; - FDesignations : TStringList; - - FHasactiveOnly : boolean; - FHasExcludeNested : boolean; - FHasGenerateNarrative : boolean; - FHasLimitedExpansion : boolean; - - FHesExcludeNotForUI : boolean; - FHasExcludePostCoordinated : boolean; - FHasIncludeDesignations : boolean; - FHasIncludeDefinition : boolean; - FHasDefaultToLatestVersion : boolean; - FHasIncompleteOK : boolean; - FHasexcludeNotForUI : boolean; - FHasMembershipOnly : boolean; - FHasDisplayWarning : boolean; - FAltCodeRules : TAlternateCodeOptions; - - function GetHasDesignations: boolean; - function GetHasLanguages: boolean; - procedure SetLanguages(value : THTTPLanguageList); - procedure SetActiveOnly(value : boolean); - procedure SetExcludeNested(value : boolean); - procedure SetGenerateNarrative(value : boolean); - procedure SetLimitedExpansion(value : boolean); - procedure SetExcludeNotForUI(value : boolean); - procedure SetExcludePostCoordinated(value : boolean); - procedure SetIncludeDesignations(value : boolean); - procedure SetIncludeDefinition(value : boolean); - procedure SetDefaultToLatestVersion(value : boolean); - procedure SetIncompleteOK(value : boolean); - procedure SetDisplayWarning(value : boolean); - procedure SetMembershipOnly(value : boolean); - protected - function sizeInBytesV(magic : integer) : cardinal; override; - public - constructor Create; override; - destructor Destroy; override; - function link : TFHIRExpansionParams; - - class function defaultProfile : TFHIRExpansionParams; - - procedure seeParameter(name : String; value : TFHIRObject; isValidation, overwrite : boolean); - - property versionRules : TFslList read FVersionRules; - - function getVersionForRule(systemURI : String; mode : TFhirExpansionParamsVersionRuleMode) : String; - procedure seeVersionRule(url : String; mode : TFhirExpansionParamsVersionRuleMode); - - property activeOnly : boolean read FactiveOnly write SetActiveOnly; - property languages : THTTPLanguageList read FLanguages write SetLanguages; - function langSummary : String; - property includeDefinition : boolean read FincludeDefinition write SetincludeDefinition; - property generateNarrative : boolean read FGenerateNarrative write SetGenerateNarrative; - property limitedExpansion : boolean read FlimitedExpansion write SetlimitedExpansion; // deprecated - property includeDesignations : boolean read FincludeDesignations write SetincludeDesignations; - property excludeNested : boolean read FexcludeNested write SetexcludeNested; - property excludeNotForUI : boolean read FexcludeNotForUI write SetexcludeNotForUI; - property excludePostCoordinated : boolean read FexcludePostCoordinated write SetexcludePostCoordinated; - property membershipOnly : boolean read FMembershipOnly write SetMembershipOnly; - property uid : String read FUid write FUid; - property defaultToLatestVersion : boolean read FDefaultToLatestVersion write SetDefaultToLatestVersion; - property incompleteOK : boolean read FIncompleteOK write SetIncompleteOK; - property displayWarning : boolean read FDisplayWarning write SetDisplayWarning; - property properties : TStringList read FProperties; - property altCodeRules : TAlternateCodeOptions read FAltCodeRules; - property designations : TStringList read FDesignations; - - - property hasActiveOnly : boolean read FHasactiveOnly; - property hasIncludeDefinition : boolean read FHasincludeDefinition; - property hasGenerateNarrative : boolean read FHasGenerateNarrative; - property hasLimitedExpansion : boolean read FHaslimitedExpansion; - property hasIncludeDesignations : boolean read FHasincludeDesignations; - property hasExcludeNested : boolean read FHasexcludeNested; - property hasExcludeNotForUI : boolean read FHasexcludeNotForUI; - property hasExcludePostCoordinated : boolean read FHasexcludePostCoordinated; - property hasMembershipOnly : boolean read FHasMembershipOnly; - property hasDefaultToLatestVersion : boolean read FHasDefaultToLatestVersion; - property hasIncompleteOK : boolean read FHasIncompleteOK; - property hasDisplayWarning : boolean read FHasDisplayWarning; - property hasLanguages : boolean read GetHasLanguages; - property hasDesignations : boolean read GetHasDesignations; - - function hash : String; - end; TSpecialProviderFilterContextNothing = class (TCodeSystemProviderFilterContext); TSpecialProviderFilterContextConcepts = class (TCodeSystemProviderFilterContext) @@ -216,72 +83,38 @@ TFHIRImportedValueSet = class (TFslObject) property valueSet : TFHIRValueSetW read FValueSet write SetValueSet; end; - // this is denial of service protection. A terminology operation is not allowed to take too long, and - // it's not allowed to recurse - - { TTerminologyOperationContext } - - TTerminologyOperationContext = class (TFslObject) - private - FDeadTime : UInt64; - FContexts : TStringList; - FLangList : THTTPLanguageList; - FI18n : TI18nSupport; - public - constructor Create(i18n : TI18nSupport; langList : THTTPLanguageList); - destructor Destroy; override; - - function copy : TTerminologyOperationContext; - function deadCheck : boolean; - procedure seeContext(vurl : String); - end; TGetValueSetEvent = function (sender : TObject; url, version : String) : TFHIRValueSetW of object; - TGetProviderEvent = function (sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider of object; - TGetExpansionEvent = function (sender : TObject; opContext: TTerminologyOperationContext; url, version, filter : String; params : TFHIRExpansionParams; dependencies : TStringList; additionalResources : TFslMetadataResourceList; limit : integer) : TFHIRValueSetW of object; - TGetSystemVersionsEvent = procedure (sender : TObject; url : String; list : TStringlist) of object; + TGetExpansionEvent = function (sender : TObject; opContext: TTerminologyOperationContext; url, version, filter : String; params : TFHIRTxOperationParams; dependencies : TStringList; additionalResources : TFslMetadataResourceList; limit : integer; noCacheThisOne : boolean) : TFHIRValueSetW of object; { TValueSetWorker } - TValueSetWorker = class (TFslObject) + TValueSetWorker = class (TTerminologyWorker) private - FFactory : TFHIRFactory; FOnGetValueSet : TGetValueSetEvent; - FOnGetCSProvider : TGetProviderEvent; - FOnListCodeSystemVersions : TGetSystemVersionsEvent; FOnGetExpansion : TGetExpansionEvent; - FParams : TFHIRExpansionParams; - FAdditionalResources : TFslMetadataResourceList; - FLanguages : TIETFLanguageDefinitions; - FRequiredSupplements : TStringList; - FI18n : TI18nSupport; FValueSet : TFHIRValueSetW; - FLangList : THTTPLanguageList; - function findInAdditionalResources(url, version, resourceType : String; error : boolean) : TFHIRMetadataResourceW; function findValueSet(url, version : String) : TFHIRValueSetW; - function findCodeSystem(url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; - function listVersions(url : String) : String; - procedure loadSupplements(cse: TFHIRCodeSystemEntry; url: String); - procedure checkSupplements(cs: TCodeSystemProvider; src: TFHIRXVersionElementWrapper); protected FAllAltCodes : TAlternateCodeOptions; - FOpContext : TTerminologyOperationContext; procedure seeValueSet(vs : TFHIRValueSetW); + function vsHandle : TFHIRValueSetW; override; function sizeInBytesV(magic : integer) : cardinal; override; procedure listDisplays(displays : TConceptDesignations; cs : TCodeSystemProvider; c: TCodeSystemProviderContext); overload; procedure listDisplays(displays : TConceptDesignations; c: TFhirCodeSystemConceptW); overload; procedure listDisplays(displays: TConceptDesignations; c: TFhirValueSetComposeIncludeConceptW; vs : TFHIRValueSetW); overload; - procedure deadCheck(place : String); function isValidating : boolean; virtual; abstract; + procedure deadCheck(place : String); override; public constructor Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getVS: TGetValueSetEvent; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; getExpansion : TGetExpansionEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); overload; destructor Destroy; override; end; { TValueSetChecker } + TValidationCheckMode = (vcmCode, vcmCoding, vcmCodeableConcept); TValueSetChecker = class (TValueSetWorker) @@ -293,18 +126,18 @@ TValueSetChecker = class (TValueSetWorker) procedure checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; resource, source : TFHIRMetadataResourceW); overload; procedure checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; cs : TCodeSystemProvider; source : TFHIRMetadataResourceW); overload; - procedure checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; rtype, vurl : String; status: TPublicationStatus; standardsStatus: String; experimental : boolean; source : TFHIRMetadataResourceW); overload; + procedure checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; rtype, vurl, pid : String; status: TPublicationStatus; standardsStatus: String; experimental : boolean; source : TFHIRMetadataResourceW); overload; function dispWarning : TIssueSeverity; function determineSystemFromExpansion(code: String): String; function determineSystem(code : String) : String; function determineVersion(path, systemURI, versionVS, versionCoding : String; op : TFhirOperationOutcomeW; var message : String) : string; - function check(path, system, version, code : String; abstractOk, inferSystem : boolean; displays : TConceptDesignations; unknownSystems : TStringList; var message, ver : String; var inactive : boolean; var vstatus : String; var cause : TFhirIssueType; op : TFhirOperationOutcomeW; vcc : TFHIRCodeableConceptW; params: TFHIRParametersW; var contentMode : TFhirCodeSystemContentMode; var impliedSystem : string; unkCodes, messages : TStringList) : TTrueFalseUnknown; overload; + function check(path, system, version, code : String; abstractOk, inferSystem : boolean; displays : TConceptDesignations; unknownSystems : TStringList; var message, ver : String; var inactive : boolean; var normalForm : String; var vstatus : String; var cause : TFhirIssueType; op : TFhirOperationOutcomeW; vcc : TFHIRCodeableConceptW; params: TFHIRParametersW; var contentMode : TFhirCodeSystemContentMode; var impliedSystem : string; unkCodes, messages : TStringList; out defLang : TIETFLang) : TTrueFalseUnknown; overload; function findCode(cs : TFhirCodeSystemW; code: String; list : TFhirCodeSystemConceptListW; displays : TConceptDesignations; out isabstract : boolean): boolean; - function checkConceptSet(path : String; cs: TCodeSystemProvider; cset : TFhirValueSetComposeIncludeW; code : String; abstractOk : boolean; displays : TConceptDesignations; vs : TFHIRValueSetW; var message : String; var inactive : boolean; var vstatus : String; op : TFHIROperationOutcomeW; vcc : TFHIRCodeableConceptW) : boolean; + function checkConceptSet(path : String; cs: TCodeSystemProvider; cset : TFhirValueSetComposeIncludeW; code : String; abstractOk : boolean; displays : TConceptDesignations; vs : TFHIRValueSetW; var message : String; var inactive : boolean; var normalForm : String; var vstatus : String; op : TFHIROperationOutcomeW; vcc : TFHIRCodeableConceptW) : boolean; function checkExpansion(path : String; cs: TCodeSystemProvider; cset : TFhirValueSetExpansionContainsW; code : String; abstractOk : boolean; displays : TConceptDesignations; vs : TFHIRValueSetW; var message : String; var inactive : boolean; var vstatus : String; op : TFHIROperationOutcomeW) : boolean; function fixedSystemFromValueSet: String; - procedure prepareConceptSet(desc: string; cc: TFhirValueSetComposeIncludeW); + procedure prepareConceptSet(desc: string; cc: TFhirValueSetComposeIncludeW; unknownValueSets : TStringList); function getName: String; function valueSetDependsOnCodeSystem(url, version: String): boolean; protected @@ -317,7 +150,7 @@ TValueSetChecker = class (TValueSetWorker) property id : String read FId; property name : String read getName; - function prepare(vs : TFHIRValueSetW; params : TFHIRExpansionParams) : TFhirParametersW; + procedure prepare(vs : TFHIRValueSetW; params : TFHIRTxOperationParams; unknownValueSets : TStringList); function check(issuePath, system, version, code : String; abstractOk, inferSystem : boolean; op : TFhirOperationOutcomeW) : TTrueFalseUnknown; overload; function check(issuePath, system, version, code : String; inferSystem : boolean) : TFhirParametersW; overload; @@ -337,39 +170,49 @@ TValueSetCounter = class (TFslObject) procedure increment; end; + TTotalStatus = (tsUninitialised, tsSet, tsOff); + { TFHIRValueSetExpander } TFHIRValueSetExpander = class (TValueSetWorker) private - FHasCount : boolean; - FCount : integer; - FHasOffset : boolean; FOffset : integer; + FCount : integer; FLimitCount : integer; FCanBeHierarchy : boolean; + FHasExclusions : boolean; + FExcluded : TFslStringSet; FRootList : TFslList; FFullList : TFslList; FMap : TFslMap; FCSCounter : TFslMap; + FTotalStatus : TTotalStatus; + FTotal : integer; + function isExcluded(system, version, code : String) : boolean; + procedure NoTotal; + procedure AddToTotal(t : Integer); procedure checkCanonicalStatus(expansion : TFhirValueSetExpansionW; resource : TFHIRMetadataResourceW; source : TFHIRValueSetW); overload; procedure checkCanonicalStatus(expansion : TFhirValueSetExpansionW; cs : TCodeSystemProvider; source : TFHIRValueSetW); overload; procedure checkCanonicalStatus(expansion: TFhirValueSetExpansionW; vurl : String; status: TPublicationStatus; standardsStatus: String; experimental : boolean; source : TFHIRValueSetW); overload; procedure importValueSetItem(p, c: TFhirValueSetExpansionContainsW; imports: TFslList; offset: integer); function makeFilterForValueSet(cs : TCodeSystemProvider; vs : TFHIRValueSetW) : TCodeSystemProviderFilterContext; - procedure processCodeAndDescendants(doDelete : boolean; cs : TCodeSystemProvider; context : TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; parent : TFhirValueSetExpansionContainsW; excludeInactive : boolean; srcUrl : String); + function includeCodeAndDescendants(cs : TCodeSystemProvider; context : TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; parent : TFhirValueSetExpansionContainsW; excludeInactive : boolean; srcUrl : String) : integer; + procedure excludeCodeAndDescendants(cs : TCodeSystemProvider; context : TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; excludeInactive : boolean; srcUrl : String); procedure handleDefine(cs : TFhirCodeSystemW; source : TFhirValueSetCodeSystemW; defines : TFhirCodeSystemConceptListW; filter : TSearchFilterText; expansion : TFhirValueSetExpansionW; imports : TFslList; excludeInactive : boolean; srcURL : String); procedure importValueSet(vs : TFHIRValueSetW; expansion : TFhirValueSetExpansionW; imports : TFslList; offset : integer); procedure excludeValueSet(vs : TFHIRValueSetW; expansion : TFhirValueSetExpansionW; imports : TFslList; offset : integer); - procedure processCodes(doDelete : boolean; cset : TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); + procedure includeCodes(cset : TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); + procedure excludeCodes(cset : TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); procedure handleCompose(source : TFhirValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; var notClosed : boolean); function passesImports(imports : TFslList; system, code : String; offset : integer) : boolean; function passesImport(import : TFHIRImportedValueSet; system, code : String) : boolean; - function processCode(cs : TCodeSystemProvider; parent : TFhirValueSetExpansionContainsW; doDelete : boolean; system, version, code : String; isAbstract, isInactive, deprecated : boolean; displays : TConceptDesignations; definition, itemWeight: string; expansion : TFhirValueSetExpansionW; + function includeCode(cs : TCodeSystemProvider; parent : TFhirValueSetExpansionContainsW; system, version, code : String; isAbstract, isInactive, deprecated : boolean; displays : TConceptDesignations; definition, itemWeight: string; expansion : TFhirValueSetExpansionW; imports : TFslList; csExtList, vsExtList : TFslList; csProps : TFslList; expProps : TFslList; excludeInactive : boolean; srcURL : string) : TFhirValueSetExpansionContainsW; + procedure excludeCode(cs : TCodeSystemProvider; system, version, code : String; expansion : TFhirValueSetExpansionW; imports : TFslList; srcURL : string); procedure addDefinedCode(cs : TFhirCodeSystemW; system : string; c : TFhirCodeSystemConceptW; imports : TFslList; parent : TFhirValueSetExpansionContainsW; excludeInactive : boolean; srcURL : String); function key(system, code : String): string; overload; function key(c : TFhirValueSetExpansionContainsW) : string; overload; @@ -384,62 +227,30 @@ TFHIRValueSetExpander = class (TValueSetWorker) constructor Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getVS: TGetValueSetEvent; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; getExpansion : TGetExpansionEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); overload; destructor Destroy; override; - function expand(source : TFHIRValueSetW; params : TFHIRExpansionParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer) : TFHIRValueSetW; + function expand(source : TFHIRValueSetW; params : TFHIRTxOperationParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer; noCacheThisOne : boolean) : TFHIRValueSetW; end; -const - CODES_TFhirExpansionParamsVersionRuleMode : array [TFhirExpansionParamsVersionRuleMode] of String = ('Default', 'Check', 'Override'); - -implementation - -{ TTerminologyOperationContext } - -constructor TTerminologyOperationContext.Create(i18n: TI18nSupport; langList : THTTPLanguageList); -begin - inherited create; - FI18n := i18n; - FLangList := langList; - FContexts := TStringList.create; - if (EXPANSION_DEAD_TIME_SECS = 0) or (UnderDebugger) then - FDeadTime := 0 - else - FDeadTime := GetTickCount64 + (EXPANSION_DEAD_TIME_SECS * 1000); -end; -destructor TTerminologyOperationContext.Destroy; -begin - FLangList.free; - FI18n.free; - FContexts.free; - inherited Destroy; -end; + { TFHIRConceptMapTranslator } -function TTerminologyOperationContext.copy: TTerminologyOperationContext; -begin - result := TTerminologyOperationContext.create(FI18n.link, FLangList.link); - result.FContexts.assign(FContexts); - result.FDeadTime := FDeadTime; -end; + TFHIRConceptMapTranslator = class (TValueSetWorker) + private + function checkCode(op : TFhirOperationOutcomeW; langList : THTTPLanguageList; path : string; code : string; system, version : string; display : string) : boolean; + function isOkTarget(cm: TFhirConceptMapW; vs: TFhirValueSetW): boolean; + function isOkSource(cm: TFhirConceptMapW; vs: TFhirValueSetW; coding: TFHIRCodingW; out group : TFhirConceptMapGroupW; out match : TFhirConceptMapGroupElementW): boolean; overload; + function isOkSource(cm: TFhirConceptMapW; coding: TFHIRCodingW; out group : TFhirConceptMapGroupW; out match : TFhirConceptMapGroupElementW): boolean; overload; + function findConceptMap(var cm: TFhirConceptMapW; var msg : String): boolean; + public + constructor Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getVS: TGetValueSetEvent; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; getExpansion : TGetExpansionEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); overload; + destructor Destroy; override; -function TTerminologyOperationContext.deadCheck: boolean; -begin - result := (FDeadTime > 0) and (GetTickCount64 > FDeadTime); -end; + function translate(langList : THTTPLanguageList; reqId : String; cml : TFslList; coding: TFHIRCodingW; params : TFhirParametersW; profile : TFhirTxOperationParams) : TFhirParametersW; + //function translate(langList : THTTPLanguageList; reqId : String; cm : TLoadedConceptMap; coding : TFHIRCodingW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams): TFhirParametersW; overload; + //function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; overload; + //function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; overload; + end; -procedure TTerminologyOperationContext.seeContext(vurl: String); -var - r, s : String; -begin - if FContexts.IndexOf(vurl) > -1 then - begin - r := ''; - for s in FContexts do - CommaAdd(r, s); - raise ETerminologyError.create(FI18n.translate('VALUESET_CIRCULAR_REFERENCE', FLangList, [vurl, '['+r+']']), itBusinessRule); - end - else - FContexts.add(vurl); -end; +implementation { TValueSetCounter } @@ -471,49 +282,20 @@ procedure TSpecialProviderFilterContextConcepts.add(c: TCodeSystemProviderContex constructor TValueSetWorker.Create(factory : TFHIRFactory; opContext : TTerminologyOperationContext; getVS: TGetValueSetEvent; getCS : TGetProviderEvent; getVersions : TGetSystemVersionsEvent; getExpansion : TGetExpansionEvent; txResources : TFslMetadataResourceList; languages : TIETFLanguageDefinitions; i18n : TI18nSupport); begin - Create; - FFactory := factory; - FOpContext := opContext; + inherited Create(factory, opContext, getCS, getVersions, txResources, languages, i18n); FOnGetValueSet := getVS; - FOnGetCSProvider := getCS; - FOnListCodeSystemVersions := getVersions; FOnGetExpansion := getExpansion; - FAdditionalResources := txResources; - FLanguages := languages; - FRequiredSupplements := TStringList.create; - FI18n := i18n; FAllAltCodes := TAlternateCodeOptions.create; FAllAltCodes.all := true; end; destructor TValueSetWorker.Destroy; begin - FLangList.free; FValueSet.free; FAllAltCodes.free; - FRequiredSupplements.free; - FLanguages.free; - FAdditionalResources.free; - FFactory.free; - FParams.free; - FI18n.free; - FOpContext.free; inherited; end; -procedure TValueSetWorker.checkSupplements(cs : TCodeSystemProvider; src : TFHIRXVersionElementWrapper); -var - ext : TFHIRExtensionW; - i : integer; -begin - for ext in src.getExtensionsW(EXT_VSSUPPLEMENT).forEnum do - if not cs.hasSupplement(ext.valueAsString) then - raise ETerminologyError.create('ValueSet depends on supplement '''+ext.valueAsString+''' on '+cs.systemUri(nil)+' that is not known', itBusinessRule); - for i := FRequiredSupplements.count - 1 downto 0 do - if cs.hasSupplement(FRequiredSupplements[i]) then - FRequiredSupplements.delete(i); -end; - procedure TValueSetWorker.seeValueSet(vs: TFHIRValueSetW); var ext : TFHIRExtensionW; @@ -530,131 +312,13 @@ procedure TValueSetWorker.seeValueSet(vs: TFHIRValueSetW); FParams.seeParameter(n, v, isValidating, false); end; end; - if not FParams.hasLanguages and (vs.language <> '') then - FParams.languages := THTTPLanguageList.create(vs.language, not isValidating); -end; - -procedure TValueSetWorker.loadSupplements(cse : TFHIRCodeSystemEntry; url : String); -var - r : TFHIRMetadataResourceW; - cs : TFhirCodeSystemW; -begin - for r in FAdditionalResources do - begin - if r is TFHIRCodeSystemW then - begin - cs := r as TFHIRCodeSystemW; - if (cs.supplements = url) then - cse.Supplements.add(cs.link); - end; - end; -end; - -function isLaterVersion(test, base : String) : boolean; -begin - if TSemanticVersion.isValid(test) and TSemanticVersion.isValid(base) then - result := TSemanticVersion.isMoreRecent(test, base) - else - result := StringCompare(test, base) > 0; -end; - -function TValueSetWorker.findInAdditionalResources(url, version, resourceType : String; error : boolean) : TFHIRMetadataResourceW; -var - r : TFHIRMetadataResourceW; - matches : TFslMetadataResourceList; - i, t : integer; -begin - if FAdditionalResources = nil then - exit(nil); - - matches := TFslMetadataResourceList.create; - try - for r in FAdditionalResources do - begin - if (url <> '') and ((r.url = url) or (r.vurl = url)) and ((version = '') or (version = r.version)) then - begin - if r.fhirType <> resourceType then - if error then - raise EFHIRException.Create('Attempt to reference '+url+' as a '+resourceType+' when it''s a '+r.fhirType) - else - exit(nil); - matches.add(r.link); - end; - end; - if matches.Count = 0 then - exit(nil) - else - begin - t := 0; - for i := 1 to matches.count - 1 do - if isLaterVersion(matches[i].version, matches[t].version) then - t := i; - exit(matches[t]); - end; - finally - matches.free; - end; + if not FParams.hasHTTPLanguages and (vs.language <> '') then + FParams.HTTPLanguages := THTTPLanguageList.create(vs.language, not isValidating); end; -function TValueSetWorker.findCodeSystem(url, version: String; params: TFHIRExpansionParams; nullOk: boolean): TCodeSystemProvider; -var - r, r2 : TFHIRMetadataResourceW; - cs, cs2 : TFhirCodeSystemW; - ts : TStringlist; - cse : TFHIRCodeSystemEntry; +function TValueSetWorker.vsHandle: TFHIRValueSetW; begin - if (url = '') then - exit(nil); - if (url = URI_NDC) then - begin - result := nil; - end; - - cs := findInAdditionalResources(url, version, 'CodeSystem', not nullOk) as TFhirCodeSystemW; - if (cs <> nil) and (cs.content = cscmComplete) then - begin - cse := TFHIRCodeSystemEntry.Create(cs.link); - try - loadSupplements(cse, url); - exit(TFhirCodeSystemProvider.Create(FLanguages.link, FFactory.link, cse.link)); - finally - cse.free; - end; - end; - - result := FOnGetCSProvider(self, url, version, FParams, true); - - if (result <> nil) then - exit(result); - - if (cs <> nil) and (cs.content = cscmFragment) then - begin - cse := TFHIRCodeSystemEntry.Create(cs.link); - try - loadSupplements(cse, url); - exit(TFhirCodeSystemProvider.Create(FLanguages.link, FFactory.link, cse.link)); - finally - cse.free; - end; - end; - - if not nullok then - if version = '' then - raise ETerminologySetup.create('Unable to provide support for code system '+url) - else - begin - ts := TStringList.Create; - try - FOnListCodeSystemVersions(self, url, ts); - if (ts.Count = 0) then - raise ETerminologySetup.create('Unable to provide support for code system '+url+' version '+version) - else - raise ETerminologySetup.create('Unable to provide support for code system '+url+' version '+version+' (known versions = '+ts.CommaText+')'); - finally - ts.free; - end; - - end; + result := FValueSet; end; function TValueSetWorker.findValueSet(url, version: String): TFHIRValueSetW; @@ -674,9 +338,6 @@ function TValueSetWorker.findValueSet(url, version: String): TFHIRValueSetW; function TValueSetWorker.sizeInBytesV(magic : integer) : cardinal; begin result := inherited sizeInBytesV(magic); - inc(result, FFactory.sizeInBytes(magic)); - inc(result, FParams.sizeInBytes(magic)); - inc(result, FAdditionalResources.sizeInBytes(magic)); end; { TValueSetChecker } @@ -701,10 +362,9 @@ destructor TValueSetChecker.Destroy; inherited; end; -procedure TValueSetChecker.checkCanonicalStatus(path: string; - op: TFhirOperationOutcomeW; resource, source: TFHIRMetadataResourceW); +procedure TValueSetChecker.checkCanonicalStatus(path: string; op: TFhirOperationOutcomeW; resource, source: TFHIRMetadataResourceW); begin - checkCanonicalStatus(path, op, resource.fhirType, resource.vurl, resource.status, resource.getExtensionString('http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status'), resource.experimental, source); + checkCanonicalStatus(path, op, resource.fhirType, resource.vurl, resource.SourcePackage, resource.status, resource.getExtensionString('http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status'), resource.experimental, source); end; procedure TValueSetChecker.checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; cs: TCodeSystemProvider; source : TFHIRMetadataResourceW); @@ -714,29 +374,32 @@ procedure TValueSetChecker.checkCanonicalStatus(path : string; op : TFhirOperati experimental : boolean; begin cs.getStatus(status, standardsStatus, experimental); - if (cs.version(nil) <> '') then - checkCanonicalStatus(path, op, 'CodeSystem', cs.systemUri(nil)+'|'+cs.version(nil), status, standardsStatus, experimental, source) + if (cs.version <> '') then + checkCanonicalStatus(path, op, 'CodeSystem', cs.systemUri+'|'+cs.version, cs.sourcePackage, status, standardsStatus, experimental, source) else - checkCanonicalStatus(path, op, 'CodeSystem', cs.systemUri(nil), status, standardsStatus, experimental, source); + checkCanonicalStatus(path, op, 'CodeSystem', cs.systemUri, cs.sourcePackage, status, standardsStatus, experimental, source); end; -procedure TValueSetChecker.checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; rtype, vurl: String; status: TPublicationStatus; standardsStatus: String; experimental : boolean; source : TFHIRMetadataResourceW); +procedure TValueSetChecker.checkCanonicalStatus(path : string; op : TFhirOperationOutcomeW; rtype, vurl, pid: String; status: TPublicationStatus; standardsStatus: String; experimental : boolean; source : TFHIRMetadataResourceW); begin if op <> nil then begin if standardsStatus = 'deprecated' then - op.addIssue(isInformation, itBusinessRule, '', FI18n.translate('MSG_DEPRECATED', FParams.languages, [vurl, '', rtype]), oicStatusCheck, false) + op.addIssue(isInformation, itBusinessRule, '', 'MSG_DEPRECATED', FI18n.translate('MSG_DEPRECATED', FParams.HTTPLanguages, [vurl, '', rtype]), oicStatusCheck, false) else if standardsStatus = 'withdrawn' then - op.addIssue(isInformation, itBusinessRule, '', FI18n.translate('MSG_WITHDRAWN', FParams.languages, [vurl, '', rtype]), oicStatusCheck, false) + op.addIssue(isInformation, itBusinessRule, '', 'MSG_WITHDRAWN', FI18n.translate('MSG_WITHDRAWN', FParams.HTTPLanguages, [vurl, '', rtype]), oicStatusCheck, false) else if status = psRetired then - op.addIssue(isInformation, itBusinessRule, '', FI18n.translate('MSG_RETIRED', FParams.languages, [vurl, '', rtype]), oicStatusCheck, false) + op.addIssue(isInformation, itBusinessRule, '', 'MSG_RETIRED', FI18n.translate('MSG_RETIRED', FParams.HTTPLanguages, [vurl, '', rtype]), oicStatusCheck, false) else if (source <> nil) then begin if experimental and not source.experimental then - op.addIssue(isInformation, itBusinessRule, '', FI18n.translate('MSG_EXPERIMENTAL', FParams.languages, [vurl, '', rtype]), oicStatusCheck, false) + op.addIssue(isInformation, itBusinessRule, '', 'MSG_EXPERIMENTAL', FI18n.translate('MSG_EXPERIMENTAL', FParams.HTTPLanguages, [vurl, '', rtype]), oicStatusCheck, false) else if ((status = psDraft) or (standardsStatus = 'draft')) and not ((source.status = psDraft) or (source.getExtensionString('http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status') = 'draft')) then - op.addIssue(isInformation, itBusinessRule, '', FI18n.translate('MSG_DRAFT', FParams.languages, [vurl, '', rtype]), oicStatusCheck, false) + if (pid <> '') then + op.addIssue(isInformation, itBusinessRule, '', 'MSG_DRAFT', FI18n.translate('MSG_DRAFT_SRC', FParams.HTTPLanguages, [vurl, pid, rtype]), oicStatusCheck, false) + else + op.addIssue(isInformation, itBusinessRule, '', 'MSG_DRAFT', FI18n.translate('MSG_DRAFT', FParams.HTTPLanguages, [vurl, '', rtype]), oicStatusCheck, false) end; end; end; @@ -763,15 +426,18 @@ function TValueSetChecker.determineSystemFromExpansion(code: String): String; try dep := TStringList.Create; try - vse := exp.expand(FValueSet, FParams, '', dep, 10000, 10000, 0); + vse := exp.expand(FValueSet, FParams, '', dep, 10000, 10000, 0, FNoCacheThisOne); try result := ''; for c in vse.expansion.contains.forEnum do + begin + deadCheck('determineSystemFromExpansion'); if (c.code = code) then if result = '' then result := c.systemUri else exit(''); + end; finally vse.free; end; @@ -797,6 +463,7 @@ function TValueSetChecker.fixedSystemFromValueSet : String; result := ''; for c in FValueSet.includes.forEnum do begin + deadCheck('fixedSystemFromValueSet'); if (c.hasValueSets or (c.systemUri = '')) then exit(''); if (result = '') then @@ -812,17 +479,13 @@ function TValueSetChecker.determineSystem(code: String): String; cs : TCodeSystemProvider; cc : TFhirValueSetComposeIncludeConceptW; match : boolean; - s, msg : String; + msg : String; loc : TCodeSystemProviderContext; needDoExpansion : boolean; begin result := ''; needDoExpansion := false; - s := fixedSystemFromValueSet(); - if (s > '') then - exit(s); - for vsi in FValueSet.excludes.forEnum do needDoExpansion := true; for vsi in FValueSet.includes do @@ -839,7 +502,8 @@ function TValueSetChecker.determineSystem(code: String): String; begin for vsi in FValueSet.includes do begin - cs := findCodeSystem(vsi.systemUri, '', nil, true); + deadCheck('determineSystem'); + cs := findCodeSystem(vsi.systemUri, '', nil, [cscmComplete, cscmFragment], true); if (cs = nil) then exit(''); try @@ -847,6 +511,7 @@ function TValueSetChecker.determineSystem(code: String): String; begin for cc in vsi.concepts.forEnum do begin + deadCheck('determineSystem#2'); // if cs.casesensitive then match := cc.code = code; if (match) then @@ -912,7 +577,7 @@ function TValueSetChecker.determineVersion(path, systemURI, versionVS, versionCo result := FParams.getVersionForRule(systemURI, fvmDefault); end; -function TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRExpansionParams) : TFhirParametersW; +procedure TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRTxOperationParams; unknownValueSets : TStringList); var cc : TFhirValueSetComposeIncludeW; other : TFHIRValueSetW; @@ -922,14 +587,19 @@ function TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRExpansionPar cs : TFhirCodeSystemProvider; op : TFhirOperationOutcomeW; ext : TFHIRExtensionW; + vrs : String; begin - result := nil; FParams := params.Link; if (vs = nil) then - raise EFslException.Create('Error Error: vs = nil') + raise EFHIROperationException.Create(isError, itNotFound, oicNotFound, '', 'Error Error: vs = nil') else begin seeValueSet(vs); + FOpContext.addNote(vs, 'Analysing'); + FOpContext.addNote(vs, 'Parameters: '+params.summary); + vrs := params.verSummary; + if (vrs <> '') then + FOpContext.addNote(vs, 'Version Rules: '+vrs); FRequiredSupplements.clear; for ext in vs.getExtensionsW(EXT_VSSUPPLEMENT).forEnum do FRequiredSupplements.add(ext.valueAsString); @@ -946,7 +616,7 @@ function TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRExpansionPar begin try FFactory.checkNoModifiers(ics, 'ValueSetChecker.prepare', 'CodeSystem'); - cs := TFhirCodeSystemProvider.create(FLanguages.link, ffactory.link, TFHIRCodeSystemEntry.Create(FFactory.wrapCodeSystem(FValueSet.Resource.Link))); + cs := TFhirCodeSystemProvider.create(FLanguages.link, FI18n.link, ffactory.link, TFHIRCodeSystemEntry.Create(FFactory.wrapCodeSystem(FValueSet.Resource.Link))); FOthers.Add(ics.systemUri, cs); if (FValueSet.version <> '') then FOthers.Add(ics.systemUri+'|'+FValueSet.version, cs.link); @@ -960,13 +630,14 @@ function TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRExpansionPar // not r2: for s in FValueSet.imports do begin + deadCheck('prepare'); other := findValueSet(s, ''); try if other = nil then - raise ETerminologyError.create('Unable to find value set '+s, itUnknown); + raise EFHIROperationException.CreateMsg(isError, itNotFound, oicNotFound, '', 'Unable_to_resolve_value_Set_', [s]); checker := TValueSetChecker.create(FFactory.link, FopContext.copy, FOnGetValueSet, FOnGetCSProvider, FOnListCodeSystemVersions, FOnGetExpansion, FAdditionalResources.link, FLanguages.link, other.url, FI18n.link); try - checker.prepare(other, params); + checker.prepare(other, params, unknownValueSets); FOthers.Add(s, checker.Link); finally checker.free; @@ -977,16 +648,16 @@ function TValueSetChecker.prepare(vs: TFHIRValueSetW; params : TFHIRExpansionPar end; for cc in FValueSet.includes.forEnum do - prepareConceptSet('include', cc); + prepareConceptSet('include', cc, unknownValueSets); for cc in FValueSet.excludes.forEnum do - prepareConceptSet('exclude', cc); + prepareConceptSet('exclude', cc, unknownValueSets); end; end; if (FRequiredSupplements.count > 0) then - raise ETerminologyError.create(FI18n.translatePlural(FRequiredSupplements.Count, 'VALUESET_SUPPLEMENT_MISSING', FParams.languages, [FRequiredSupplements.commaText]), itNotFound); + raise ETerminologyError.create(FI18n.translatePlural(FRequiredSupplements.Count, 'VALUESET_SUPPLEMENT_MISSING', FParams.HTTPLanguages, [FRequiredSupplements.commaText]), itNotFound); end; -procedure TValueSetChecker.prepareConceptSet(desc: string; cc: TFhirValueSetComposeIncludeW); +procedure TValueSetChecker.prepareConceptSet(desc: string; cc: TFhirValueSetComposeIncludeW; unknownValueSets : TStringList); var other: TFhirValueSetW; checker: TValueSetChecker; @@ -994,19 +665,26 @@ procedure TValueSetChecker.prepareConceptSet(desc: string; cc: TFhirValueSetComp ccf: TFhirValueSetComposeIncludeFilterW; cs: TCodeSystemProvider; i : integer; + unknownSystems : TStringList; begin + deadCheck('prepareConceptSet'); FFactory.checkNoModifiers(cc, 'ValueSetChecker.prepare', desc); for s in cc.valueSets do begin + deadCheck('prepareConceptSet'); if not FOthers.ExistsByKey(s) then begin other := findValueSet(s, ''); try if other = nil then - raise ETerminologyError.create('Unable to find value set ' + s, itUnknown); + begin + if unknownValueSets <> nil then + unknownValueSets.add(s); + raise EFHIROperationException.CreateMsg(isError, itNotFound, oicNotFound, '', 'Unable_to_resolve_value_Set_', [s]); + end; checker := TValueSetChecker.create(FFactory.link, FOpContext.copy, FOnGetValueSet, FOnGetCSProvider, FOnListCodeSystemVersions, FOnGetExpansion, FAdditionalResources.link, FLanguages.link, other.url, FI18n.link); try - checker.prepare(other, FParams); + checker.prepare(other, FParams, nil); FOthers.Add(s, checker.Link); finally checker.free; @@ -1017,24 +695,28 @@ procedure TValueSetChecker.prepareConceptSet(desc: string; cc: TFhirValueSetComp end; end; if not FOthers.ExistsByKey(cc.systemUri) then - FOthers.Add(cc.systemUri, findCodeSystem(cc.systemUri, cc.version, FParams, true)); + FOthers.Add(cc.systemUri, findCodeSystem(cc.systemUri, cc.version, FParams, [cscmComplete, cscmFragment], true)); if cc.version = '' then cs := FOthers.matches[cc.systemUri] as TCodeSystemProvider else cs := FOthers.matches[cc.systemUri+'|'+cc.version] as TCodeSystemProvider; if cs <> nil then begin + FOpContext.addNote(FValueSet, 'CodeSystem found: "'+TTerminologyOperationContext.renderCoded(cs)+'"'); for i := FRequiredSupplements.count - 1 downto 0 do if cs.hasSupplement(FRequiredSupplements[i]) then FRequiredSupplements.delete(i); for ccf in cc.filters.forEnum do begin + deadCheck('prepareConceptSet#2'); FFactory.checkNoModifiers(ccf, 'ValueSetChecker.prepare', desc + '.filter'); if not (('concept' = ccf.prop) and (ccf.Op in [foIsA, foDescendentOf])) then if not cs.doesFilter(ccf.prop, ccf.Op, ccf.value) then - raise ETerminologyError.create('The filter "' + ccf.prop + ' ' + CODES_TFhirFilterOperator[ccf.Op] + ' ' + ccf.value + '" from the value set '+FValueSet.url+' was not understood in the context of ' + cs.systemUri(nil), itNotSupported); + raise ETerminologyError.create('The filter "' + ccf.prop + ' ' + CODES_TFhirFilterOperator[ccf.Op] + ' ' + ccf.value + '" from the value set '+FValueSet.url+' was not understood in the context of ' + cs.systemUri, itNotSupported); end; - end; + end + else if cc.systemUri <> '' then + FOpContext.addNote(FValueSet, 'CodeSystem not found: "'+ TTerminologyOperationContext.renderCoded(cc.systemUri, cc.version)+'"'); end; function TValueSetChecker.findCode(cs : TFhirCodeSystemW; code: String; list : TFhirCodeSystemConceptListW; displays : TConceptDesignations; out isabstract : boolean): boolean; @@ -1045,6 +727,7 @@ function TValueSetChecker.findCode(cs : TFhirCodeSystemW; code: String; list : T result := false; for i := 0 to list.count - 1 do begin + deadCheck('findCode'); if (code = list[i].code) then begin result := true; @@ -1076,18 +759,25 @@ function TValueSetChecker.getName: String; function TValueSetChecker.check(issuePath, system, version, code: String; abstractOk, inferSystem : boolean; op : TFhirOperationOutcomeW): TTrueFalseUnknown; var msg, ver, impliedSystem, vstatus : string; + defLang : TIETFLang; it : TFhirIssueType; contentMode : TFhirCodeSystemContentMode; unknownSystems, ts, msgs : TStringList; inactive : boolean; + normalForm : String; begin + FOpContext.clearContexts; + if (inferSystem) then + FOpContext.addNote(FValueSet, 'Validate "'+code+'" and infer system') + else + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(system, version, code)+'"'); unknownSystems := TStringList.create; ts := TStringList.create; msgs := TStringList.create; try unknownSystems.duplicates := dupIgnore; unknownSystems.sorted := true; - result := check(issuePath, system, version, code, abstractOk, inferSystem, nil, unknownSystems, msg, ver, inactive, vstatus, it, op, nil, nil, contentMode, impliedSystem, ts, msgs); + result := check(issuePath, system, version, code, abstractOk, inferSystem, nil, unknownSystems, msg, ver, inactive, normalForm, vstatus, it, op, nil, nil, contentMode, impliedSystem, ts, msgs, defLang); finally unknownSystems.free; ts.free; @@ -1105,8 +795,8 @@ function vurl(system, version : String) : String; function TValueSetChecker.check(path, system, version, code: String; abstractOk, inferSystem: boolean; displays: TConceptDesignations; unknownSystems : TStringList; - var message, ver: String; var inactive : boolean; var vstatus : String; var cause: TFhirIssueType; op: TFhirOperationOutcomeW; - vcc : TFHIRCodeableConceptW; params: TFHIRParametersW; var contentMode: TFhirCodeSystemContentMode; var impliedSystem: string; unkCodes, messages : TStringList): TTrueFalseUnknown; + var message, ver: String; var inactive : boolean; var normalForm : String; var vstatus : String; var cause: TFhirIssueType; op: TFhirOperationOutcomeW; + vcc : TFHIRCodeableConceptW; params: TFHIRParametersW; var contentMode: TFhirCodeSystemContentMode; var impliedSystem: string; unkCodes, messages : TStringList; out defLang : TIETFLang): TTrueFalseUnknown; var cs : TCodeSystemProvider; ctxt : TCodeSystemProviderContext; @@ -1121,9 +811,10 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, ts : TStringList; vss : TFHIRValueSetW; begin + FOpContext.addNote(FValueSet, 'Check "'+TTerminologyOperationContext.renderCoded(system, version, code)+'"'); if (system = '') and not inferSystem then begin - msg := FI18n.translate('Coding_has_no_system__cannot_validate', FParams.languages, []); + msg := FI18n.translate('Coding_has_no_system__cannot_validate', FParams.HTTPLanguages, []); messages.add(msg); op.addIssue(isWarning, itInvalid, path, msg, oicInvalidData); exit(bFalse); @@ -1137,10 +828,18 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, s := FValueSet.url; if (s = ANY_CODE_VS) then begin - cs := findCodeSystem(system, version, FParams, true); + if system = '' then + begin + msg := FI18n.translate('Coding_has_no_system__cannot_validate_NO_INFER', FParams.HTTPLanguages, []); + messages.add(msg); + op.addIssue(isWarning, itInvalid, path, msg, oicInvalidData); + exit(bFalse); + end; + cs := findCodeSystem(system, version, FParams, [cscmComplete, cscmFragment], true); try if cs = nil then begin + FOpContext.addNote(FValueSet, 'Didn''t find CodeSystem "'+TTerminologyOperationContext.renderCoded(system, version)+'"'); result := bUnknown; cause := itNotFound; FLog := 'Unknown code system'; @@ -1148,13 +847,20 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, if (vss <> nil) then begin vss.free; - msg := FI18n.translate('Terminology_TX_System_ValueSet2', FParams.languages, [system]); + msg := FI18n.translate('Terminology_TX_System_ValueSet2', FParams.HTTPLanguages, [system]); + messages.add(msg); + op.addIssue(isError, itInvalid, addToPath(path, 'system'), msg, oicInvalidData); + end + else if findCodeSystem(system, version, FParams, [cscmSupplement], true) <> nil then + begin + vss.free; + msg := FI18n.translate('CODESYSTEM_CS_NO_SUPPLEMENT', FParams.HTTPLanguages, [system]); messages.add(msg); op.addIssue(isError, itInvalid, addToPath(path, 'system'), msg, oicInvalidData); end else if (version <> '') then begin - msg := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.languages, [system, version, '['+listVersions(system)+']']); + msg := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.HTTPLanguages, [system, version, '['+listVersions(system)+']']); messages.add(msg); if (unknownSystems.IndexOf(system+'|'+version) = -1) then begin @@ -1164,7 +870,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, end else begin - msg := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.languages, [system]); + msg := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.HTTPLanguages, [system]); messages.add(msg); op.addIssue(isError, itNotFound, addToPath(path, 'system'), msg, oicNotFound); unknownSystems.add(system); @@ -1172,20 +878,22 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, end else begin + defLang := cs.defLang(); + FOpContext.addNote(FValueSet, 'Using CodeSystem "'+TTerminologyOperationContext.renderCoded(cs)+'" (content = '+CODES_TFhirCodeSystemContentMode[cs.contentMode]+')'); checkCanonicalStatus(path, op, cs, FValueSet); - ver := cs.version(nil); + ver := cs.version; contentMode := cs.contentMode; ctxt := cs.locate(code, nil, msg); if (ctxt = nil) then begin msg := ''; - unkCodes.add(cs.systemUri(nil)+'|'+cs.version(nil)+'#'+code); + unkCodes.add(cs.systemUri+'|'+cs.version+'#'+code); if cs.contentMode <> cscmComplete then begin result := bTrue; // we can't say it isn't valid. Need a third status? cause := itCodeInvalid; FLog := 'Not found in Incomplete Code System'; - msg := FI18n.translate('UNKNOWN_CODE_IN_FRAGMENT', FParams.languages, [code, cs.systemUri(nil), cs.version(nil)]); + msg := FI18n.translate('UNKNOWN_CODE_IN_FRAGMENT', FParams.HTTPLanguages, [code, cs.systemUri, cs.version]); messages.add(msg); op.addIssue(isWarning, itCodeInvalid, addToPath(path, 'code'), msg, oicInvalidCode); end @@ -1194,7 +902,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; cause := itCodeInvalid; FLog := 'Unknown code'; - msg := FI18n.translate('Unknown_Code_in_Version', FParams.languages, [code, cs.systemUri(nil), cs.version(nil)]); + msg := FI18n.translate('Unknown_Code_in_Version', FParams.HTTPLanguages, [code, cs.systemUri, cs.version]); messages.add(msg); op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), msg, oicInvalidCode); end; @@ -1203,14 +911,14 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, begin try if vcc <> nil then - vcc.addCoding(cs.systemUri(ctxt), cs.version(ctxt), cs.code(ctxt), cs.display(ctxt, FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(ctxt), cs.display(ctxt, FParams.Workinglanguages)); cause := itNull; if not (abstractOk or not cs.IsAbstract(ctxt)) then begin result := bFalse; FLog := 'Abstract code when not allowed'; cause := itBusinessRule; - msg := FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [system, code]); + msg := FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [system, code]); messages.add(msg); op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); end @@ -1219,7 +927,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; FLog := 'Inactive code when not allowed'; cause := itBusinessRule; - msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.languages, ['not active', code]); + msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.HTTPLanguages, ['not active', code]); messages.add(msg); op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); end @@ -1227,6 +935,15 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, begin FLog := 'found OK'; result := bTrue; + if (cs.Code(ctxt) <> code) then + begin + msg := FI18n.translate('CODE_CASE_DIFFERENCE', FParams.HTTPLanguages, [code, cs.Code(ctxt), cs.systemUri]); + messages.add(msg); + op.addIssue(isWarning, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); + end; + msg := cs.incompleteValidationMessage(ctxt, FParams.HTTPLanguages); + if (msg <> '') then + op.addIssue(isInformation, itInformational, addToPath(path, 'code'), msg, oicProcessingNote); inactive := cs.IsInactive(ctxt); if (inactive) then vstatus := cs.getCodeStatus(ctxt); @@ -1245,7 +962,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, else if (false) then begin // anyhow, we ignore the value set (at least for now) - cs := findCodeSystem(system, version, FParams, true); + cs := findCodeSystem(system, version, FParams, [cscmComplete, cscmFragment], true); try if cs = nil then begin @@ -1254,7 +971,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, FLog := 'Unknown code system'; if (version <> '') then begin - msg := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.languages, [system, version, '['+listVersions(system)+']']); + msg := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.HTTPLanguages, [system, version, '['+listVersions(system)+']']); messages.add(msg); if (unknownSystems.IndexOf(system+'|'+version) = -1) then begin @@ -1264,7 +981,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, end else begin - msg := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.languages, [system]); + msg := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.HTTPLanguages, [system]); messages.add(msg); op.addIssue(isError, itNotFound, addToPath(path, 'system'), msg, oicNotFound); unknownSystems.add(system); @@ -1272,8 +989,9 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, end else begin + defLang := cs.defLang(); checkCanonicalStatus(path, op, cs, FValueSet); - ver := cs.version(nil); + ver := cs.version; contentMode := cs.contentMode; ctxt := cs.locate(code); if (ctxt = nil) then @@ -1284,7 +1002,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bTrue; // we can't say it isn't valid. Need a third status? cause := itCodeInvalid; FLog := 'Not found in Incomplete Code System'; - msg := FI18n.translate('UNKNOWN_CODE_IN_FRAGMENT', FParams.languages, [code, system, version]); + msg := FI18n.translate('UNKNOWN_CODE_IN_FRAGMENT', FParams.HTTPLanguages, [code, system, version]); messages.add(msg); op.addIssue(isWarning, itCodeInvalid, addToPath(path, 'code'), msg, oicInvalidCode); end @@ -1293,7 +1011,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; cause := itCodeInvalid; FLog := 'Unknown code'; - msg := FI18n.translate('Unknown_Code_in_Version', FParams.languages, [code, system, version]); + msg := FI18n.translate('Unknown_Code_in_Version', FParams.HTTPLanguages, [code, system, version]); messages.add(msg); op.addIssue(isWarning, itCodeInvalid, addToPath(path, 'code'), msg, oicInvalidCode); end; @@ -1307,7 +1025,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; FLog := 'Abstract code when not allowed'; cause := itBusinessRule; - msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.languages, ['not active', code]); + msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.HTTPLanguages, ['not active', code]); messages.add(msg); op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); end @@ -1316,7 +1034,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; FLog := 'Inactive code when not allowed'; cause := itBusinessRule; - msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.languages, ['not active', code]); + msg := FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.HTTPLanguages, ['not active', code]); messages.add(msg); op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); end @@ -1343,13 +1061,16 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, system := determineSystem(code); if (system = '') then begin - message := FI18n.translate('UNABLE_TO_INFER_CODESYSTEM', FParams.languages, [code, FValueSet.url]); + message := FI18n.translate('UNABLE_TO_INFER_CODESYSTEM', FParams.HTTPLanguages, [code, FValueSet.vurl]); messages.add(message); - op.addIssue(isError, itNotFound, path, message, oicInferFailed); + op.addIssue(isError, itNotFound, 'code', message, oicInferFailed); exit(bFalse); end else + begin impliedSystem := system; + FOpContext.addNote(FValueSet, 'Inferred CodeSystem = "'+system+'"'); + end; end; ics := FValueSet.inlineCS; // r2 @@ -1384,17 +1105,19 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; for s in FValueSet.imports do begin + deadCheck('check#1'); if result = bFalse then begin checker := TValueSetChecker(FOthers.matches[s]); if (checker = nil) then raise ETerminologyError.Create('No Match for '+s+' in '+FOthers.AsText, itUnknown); checkCanonicalStatus(path, op, checker.FValueSet, FValueSet); - result := checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages); + result := checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages, defLang); end; end; for cc in FValueSet.includes.forEnum do begin + deadCheck('check#2'); if cc.systemUri = '' then result := bTrue // why? else if (cc.systemUri = system) or (system = SYSTEM_NOT_APPLICABLE) then @@ -1405,20 +1128,21 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, else cs := TCodeSystemProvider(FOthers.matches[cc.systemUri+'|'+v]).link; if (cs = nil) then - cs := findCodeSystem(system, v, FParams, true); + cs := findCodeSystem(system, v, FParams, [cscmComplete, cscmFragment], true); if (cs = nil) then begin + FOpContext.addNote(FValueSet, 'CodeSystem not found: '+TTerminologyOperationContext.renderCoded(cc.systemUri, v)); if (not FParams.membershipOnly) then begin bAdd := true; if (v = '') then begin - message := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.languages, [system]); + message := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.HTTPLanguages, [system]); unknownSystems.add(system); end else begin - message := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.languages, [system, v, '['+listVersions(system)+']']); + message := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.HTTPLanguages, [system, v, '['+listVersions(system)+']']); badd := unknownSystems.IndexOf(system+'|'+version) = -1; if (bAdd) then unknownSystems.add(system+'|'+v); @@ -1432,12 +1156,14 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, exit(bFalse); end; try + defLang := cs.defLang(); + FOpContext.addNote(FValueSet, 'CodeSystem found: '+TTerminologyOperationContext.renderCoded(cs)+' for '+TTerminologyOperationContext.renderCoded(cc.systemUri, v)); checkCanonicalStatus(path, op, cs, FValueSet); - ver := cs.version(nil); + ver := cs.version; checkSupplements(cs, cc); contentMode := cs.contentMode; - if ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri(nil) = system)) and checkConceptSet(path, cs, cc, code, abstractOk, displays, FValueSet, message, inactive, vstatus, op, vcc) then + if ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri = system)) and checkConceptSet(path, cs, cc, code, abstractOk, displays, FValueSet, message, inactive, normalForm, vstatus, op, vcc) then result := bTrue else result := bFalse; @@ -1449,12 +1175,14 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, result := bFalse; for s in cc.valueSets do begin + deadCheck('check#3'); + FOpContext.addNote(FValueSet, 'Check included value set '+s); checker := TValueSetChecker(FOthers.matches[s]); if checker = nil then raise ETerminologyError.Create('No Match for '+s+' in '+FOthers.AsText, itUnknown); checkCanonicalStatus(path, op, checker.FValueSet, FValueSet); if (result = bTrue) then - result := checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages); + result := checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages, defLang); end; if result = bTrue then break; @@ -1462,6 +1190,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, if result = bTrue then for cc in FValueSet.excludes.forEnum do begin + deadCheck('check#4'); if cc.systemUri = '' then excluded := true else @@ -1478,17 +1207,18 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, raise ETerminologyError.Create('No Match for '+cc.systemUri+'|'+cc.version+' in '+FOthers.AsText, itUnknown); checkCanonicalStatus(path, op, cs, FValueSet); checkSupplements(cs, cc); - ver := cs.version(nil); + ver := cs.version; contentMode := cs.contentMode; - excluded := ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri(nil) = system)) and checkConceptSet(path, cs, cc, code, abstractOk, displays, FValueSet, message, inactive, vstatus, op, vcc); + excluded := ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri = system)) and checkConceptSet(path, cs, cc, code, abstractOk, displays, FValueSet, message, inactive, normalForm, vstatus, op, vcc); end; for s in cc.valueSets do begin - checker := TValueSetChecker(FOthers.matches[s]); + deadCheck('check#5'); + checker := TValueSetChecker(FOthers.matches[s]); if (cs = nil) then raise ETerminologyError.Create('No Match for '+cc.systemUri+'|'+cc.version+' in '+FOthers.AsText, itUnknown); checkCanonicalStatus(path, op, checker.FValueSet, FValueSet); - excluded := excluded and (checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages) = bTrue); + excluded := excluded and (checker.check(path, system, version, code, abstractOk, inferSystem, displays, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, nil, params, contentMode, impliedSystem, unkCodes, messages, defLang) = bTrue); end; if excluded then exit(bFalse); @@ -1520,7 +1250,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, else cs := TCodeSystemProvider(FOthers.matches[ccc.systemUri+'|'+v]).link; if (cs = nil) then - cs := findCodeSystem(system, v, FParams, true); + cs := findCodeSystem(system, v, FParams, [cscmComplete, cscmFragment], true); if (cs = nil) then begin if (not FParams.membershipOnly) then @@ -1528,7 +1258,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, bAdd := true; if (v = '') then begin - message := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.languages, [system]) ; + message := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.HTTPLanguages, [system]) ; unknownSystems.add(system); end else @@ -1536,7 +1266,7 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, badd := unknownSystems.IndexOf(system+'|'+version) = -1; if (bAdd) then begin - message := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.languages, [system, v, '['+listVersions(system)+']']); + message := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.HTTPLanguages, [system, v, '['+listVersions(system)+']']); unknownSystems.add(system+'|'+v); end; end; @@ -1549,10 +1279,11 @@ function TValueSetChecker.check(path, system, version, code: String; abstractOk, exit(bfalse); end; try + defLang := cs.defLang(); checkCanonicalStatus(path, op, cs, FValueSet); - ver := cs.version(nil); + ver := cs.version; contentMode := cs.contentMode; - if ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri(nil) = system)) and checkExpansion(path, cs, ccc, code, abstractOk, displays, FValueSet, message, inactive, vstatus, op) then + if ((system = SYSTEM_NOT_APPLICABLE) or (cs.systemUri = system)) and checkExpansion(path, cs, ccc, code, abstractOk, displays, FValueSet, message, inactive, vstatus, op) then result := bTrue else result := bFalse; @@ -1577,6 +1308,7 @@ function TValueSetChecker.check(issuePath : String; coding: TFhirCodingW; abstra var list : TConceptDesignations; message, ver, pd, impliedSystem, path, us, baseMsg : String; + defLang : TIETFLang; cause : TFhirIssueType; op : TFhirOperationOutcomeW; contentMode : TFhirCodeSystemContentMode; @@ -1585,8 +1317,14 @@ function TValueSetChecker.check(issuePath : String; coding: TFhirCodingW; abstra unknownSystems, unkCodes, messages : TStringList; diff : TDisplayDifference; inactive : boolean; - vstatus : String; + vstatus, normalForm : String; begin + FOpContext.clearContexts; + if (inferSystem) then + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(coding)+'" and infer system') + else + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(coding)+'"'); + inactive := false; path := issuePath; unknownSystems := TStringList.create; @@ -1601,28 +1339,28 @@ function TValueSetChecker.check(issuePath : String; coding: TFhirCodingW; abstra checkCanonicalStatus(path, op, FValueSet, FValueSet); list := TConceptDesignations.Create(FFactory.link, FLanguages.link); try - ok := check(path, coding.systemUri, coding.version, coding.code, abstractOk, inferSystem, list, unknownSystems, message, ver, inactive, vstatus, cause, op, nil, result, contentMode, impliedSystem, unkCodes, messages); + ok := check(path, coding.systemUri, coding.version, coding.code, abstractOk, inferSystem, list, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, nil, result, contentMode, impliedSystem, unkCodes, messages, defLang); if ok = bTrue then begin result.AddParamBool('result', true); if ((cause = itNotFound) and (contentMode <> cscmComplete)) or (contentMode = cscmExample) then result.AddParamStr('message', 'The system "'+coding.systemUri+' was found but did not contain enough information to properly validate the code (mode = '+CODES_TFhirCodeSystemContentMode[contentMode]+')'); - if (coding.display <> '') and (not list.hasDisplay(FParams.languages, coding.display, dcsCaseInsensitive, diff)) then + if (coding.display <> '') and (not list.hasDisplay(FParams.workingLanguages, defLang, coding.display, dcsCaseInsensitive, diff)) then begin baseMsg := 'Display_Name_for__should_be_one_of__instead_of'; - dc := list.displayCount(FParams.languages, true); + dc := list.displayCount(FParams.workingLanguages, nil, true); if dc > 0 then begin if (diff = ddNormalised) then baseMsg := 'Display_Name_WS_for__should_be_one_of__instead_of'; if dc = 1 then - result.AddParamStr('message', FI18n.translate(baseMsg+'_one', FParams.languages, - ['', coding.systemUri, coding.code, list.present(FParams.languages, true), coding.display, FParams.langSummary])) + result.AddParamStr('message', FI18n.translate(baseMsg+'_one', FParams.HTTPLanguages, + ['', coding.systemUri, coding.code, list.present(FParams.workingLanguages, defLang, true), coding.display, FParams.langSummary])) else - result.AddParamStr('message', FI18n.translate(baseMsg+'_other', FParams.languages, [inttostr(dc), coding.systemUri, coding.code, list.present(FParams.languages, true), coding.display, FParams.langSummary])); + result.AddParamStr('message', FI18n.translate(baseMsg+'_other', FParams.HTTPLanguages, [inttostr(dc), coding.systemUri, coding.code, list.present(FParams.workingLanguages, defLang, true), coding.display, FParams.langSummary])); end; end; - pd := list.preferredDisplay(FParams.languages); + pd := list.preferredDisplay(FParams.workingLanguages); if (pd <> '') then result.AddParamStr('display', pd); result.addParamUri('system', coding.systemUri); @@ -1679,6 +1417,7 @@ function TValueSetChecker.valueSetDependsOnCodeSystem(url, version : String) : b begin for inc in FValueSet.includes.forEnum do begin + deadCheck('valueSetDependsOnCodeSystem'); if (inc.systemUri = url) and ((version = '') or (version = inc.version) or (inc.version = '')) then exit(true) end; @@ -1723,7 +1462,8 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; ok, v : TTrueFalseUnknown; first : boolean; contentMode : TFhirCodeSystemContentMode; - cc, codelist, message, ver, pd, ws, impliedSystem, path, m, tsys, tcode, tver,vs, tdisp: String; + cc, codelist, message, ver, pd, ws, impliedSystem, path, m, tsys, tcode, tver,vs, tdisp, ds: String; + defLang : TIETFLang; prov, prov2 : TCodeSystemProvider; ctxt : TCodeSystemProviderContext; c : TFhirCodingW; @@ -1731,7 +1471,7 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; op : TFhirOperationOutcomeW; log : String; tl : TIETFLang; - psys, pver, pdisp, pcode, us, baseMsg, p : String; + psys, pver, pdisp, pcode, us, baseMsg, p, normalForm : String; dc, i : integer; a : TStringArray; unknownSystems : TStringList; @@ -1752,6 +1492,12 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; mt.add(s); end; begin + FOpContext.clearContexts; + if (inferSystem) then + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(code)+'" and infer system') + else + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(code)+'"'); + inactive := false; cause := itNull; if FValueSet = nil then @@ -1780,13 +1526,14 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; mt.clear; i := 0; for c in code.codings.forEnum do - begin + begin + deadCheck('check-b#1'); if (issuePath = 'CodeableConcept') then path := addToPath(issuePath, 'coding['+inttostr(i)+']') else path := issuePath; list.clear; - v := check(path, c.systemUri, c.version, c.code, abstractOk, inferSystem, list, unknownSystems, message, ver, inactive, vstatus, cause, op, vcc, result, contentMode, impliedSystem, ts, mt); + v := check(path, c.systemUri, c.version, c.code, abstractOk, inferSystem, list, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, vcc, result, contentMode, impliedSystem, ts, mt, defLang); if (v <> bTrue) and (message <> '') then msg(message); if (v = bFalse) then @@ -1812,7 +1559,7 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; if (v = bFalse) and not FAllValueSet and (mode = vcmCodeableConcept) then begin - m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_one', FParams.languages, ['', FValueSet.vurl, ''''+cc+'''']); + m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_one', FParams.HTTPLanguages, ['', FValueSet.vurl, ''''+cc+'''']); msg(m); p := issuePath + '.coding['+inttostr(i)+'].code'; op.addIssue(isInformation, itCodeInvalid, p, m, oicThisNotInVS); @@ -1825,42 +1572,68 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; message := ''; if (v = bTrue) then - begin + begin if ((cause = itNotFound) and (contentMode <> cscmComplete)) or (contentMode = cscmExample) then begin m := 'The system '+c.systemUri+' was found but did not contain enough information to properly validate the code "'+c.code+'" ("'+c.display+'") (mode = '+CODES_TFhirCodeSystemContentMode[contentMode]+')'; msg(m); op.addIssue(isWarning, itNotFound, path, m, oicVSProcessing); end - else - if (c.display <> '') and (not list.hasDisplay(FParams.languages, c.display, dcsCaseInsensitive, diff)) then + else if (c.display <> '') and (list.designations.count > 0) then begin - if (diff = ddNormalised) then - baseMsg := 'Display_Name_WS_for__should_be_one_of__instead_of' - else - baseMsg := 'Display_Name_for__should_be_one_of__instead_of'; - dc := list.displayCount(FParams.languages, true); - severity := dispWarning; - if dc = 0 then + if (not list.hasDisplay(FParams.workingLanguages, defLang, c.display, dcsCaseInsensitive, diff)) then begin - severity := isWarning; - m := FI18n.translate(baseMsg+'_one', FParams.languages, - ['', c.systemUri, c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]) + if (diff = ddNormalised) then + baseMsg := 'Display_Name_WS_for__should_be_one_of__instead_of' + else + baseMsg := 'Display_Name_for__should_be_one_of__instead_of'; + dc := list.displayCount(FParams.workingLanguages, nil, true); + severity := dispWarning; + if dc = 0 then + begin + severity := isWarning; + dc := list.displayCount(FParams.workingLanguages, nil, false); + end; + + if dc = 0 then + begin + ds := list.preferredDisplay(nil, defLang); + if (ds = '') then + m := FI18n.translate('NO_VALID_DISPLAY_AT_ALL', FParams.HTTPLanguages, [c.display, c.systemUri, c.code]) + else + begin + m := FI18n.translate('NO_VALID_DISPLAY_FOUND_NONE_FOR_LANG', FParams.HTTPLanguages, [c.display, c.systemUri, c.code, FParams.langSummary, ds]); + severity := isError; + end; + end + else if dc = 1 then + m := FI18n.translate(baseMsg+'_one', FParams.HTTPLanguages, + ['', c.systemUri, c.code, list.present(FParams.workingLanguages, defLang, dc > 0), c.display, FParams.langSummary]) + else + m := FI18n.translate(baseMsg+'_other', FParams.HTTPLanguages, + [inttostr(dc), c.systemUri, c.code, list.present(FParams.workingLanguages, defLang, dc > 0), c.display, FParams.langSummary]); + msg(m); + op.addIssue(severity, itInvalid, addToPath(path, 'display'), m, oicDisplay); end - else if dc = 1 then - m := FI18n.translate(baseMsg+'_one', FParams.languages, - ['', c.systemUri, c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]) else - m := FI18n.translate(baseMsg+'_other', FParams.languages, - [inttostr(dc), c.systemUri, c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]); - msg(m); - op.addIssue(severity, itInvalid, addToPath(path, 'display'), m, oicDisplay); + begin + if (not list.hasDisplay(FParams.workingLanguages, nil, c.display, dcsCaseInsensitive, diff)) then + begin + if (list.source <> nil) and (list.source.hasAnyDisplays(FParams.workingLanguages)) then + m := FI18n.translatePlural(FParams.workingLanguages.count, 'NO_VALID_DISPLAY_FOUND_LANG_SOME', FParams.HTTPLanguages, + [c.systemUri, c.code, c.display, FParams.workingLanguages.source, c.display]) + else + m := FI18n.translatePlural(FParams.workingLanguages.count, 'NO_VALID_DISPLAY_FOUND_LANG_NONE', FParams.HTTPLanguages, + [c.systemUri, c.code, c.display, FParams.workingLanguages.source, c.display]); + op.addIssue(isInformation, itInvalid, addToPath(path, 'display'), m, oicDisplayComment); + end; + end; end; psys := c.systemUri; pcode := c.code; if (ver <> '') then pver := ver; - pd := list.preferredDisplay(FParams.languages); + pd := list.preferredDisplay(FParams.workingLanguages); if pd <> '' then pdisp := pd; if (pdisp = '') then @@ -1870,7 +1643,7 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; begin if not isAbsoluteUrl(ws) then begin - m := FI18n.translate('Terminology_TX_System_Relative', FParams.languages, []); + m := FI18n.translate('Terminology_TX_System_Relative', FParams.HTTPLanguages, []); if mode = vcmCoding then p := issuePath + '.system' else if mode = vcmCodeableConcept then @@ -1879,7 +1652,7 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; p := issuePath; op.addIssue(isError, itInvalid, p, m, oicInvalidData); end; - prov := findCodeSystem(ws, c.version, FParams, true); + prov := findCodeSystem(ws, c.version, FParams, [cscmComplete, cscmFragment], true); try if (prov = nil) then begin @@ -1887,25 +1660,34 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; if (vss <> nil) then begin vss.free; - m := FI18n.translate('Terminology_TX_System_ValueSet2', FParams.languages, [ws]); + m := FI18n.translate('Terminology_TX_System_ValueSet2', FParams.HTTPLanguages, [ws]); msg(m); op.addIssue(isError, itInvalid, addToPath(path, 'system'), m, oicInvalidData); - cause := itNotFound; + cause := itInvalid; + end + else if findCodeSystem(ws, c.version, FParams, [cscmSupplement], true) <> nil then + begin + vss.free; + m := FI18n.translate('CODESYSTEM_CS_NO_SUPPLEMENT', FParams.HTTPLanguages, [ws]); + msg(m); + op.addIssue(isError, itInvalid, addToPath(path, 'system'), m, oicInvalidData); + cause := itInvalid; end else begin - prov2 := findCodeSystem(ws, '', FParams, true); + prov2 := findCodeSystem(ws, '', FParams, [cscmComplete, cscmFragment], true); try bAdd := true; - if (prov2 = nil) then + if (prov2 = nil) and (c.version = '') then begin - m := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.languages, [ws]); - //if (valueSetDependsOnCodeSystem(ws, '')) then + m := FI18n.translate('UNKNOWN_CODESYSTEM', FParams.HTTPLanguages, [ws]); + badd := unknownSystems.IndexOf(ws) = -1; + if (bAdd) then unknownSystems.add(ws); end else begin - m := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.languages, [ws, c.version, '['+listVersions(c.systemUri)+']']); + m := FI18n.translate('UNKNOWN_CODESYSTEM_VERSION', FParams.HTTPLanguages, [ws, c.version, '['+listVersions(c.systemUri)+']']); badd := unknownSystems.IndexOf(ws+'|'+c.version) = -1; if (bAdd) then unknownSystems.add(ws+'|'+c.version); @@ -1914,9 +1696,9 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; op.addIssue(isError, itNotFound, addToPath(path, 'system'), m, oicNotFound); if (valueSetDependsOnCodeSystem(ws, c.version)) then begin - m := 'Unable to check whether the code is in the value set '+FValueSet.vurl+' because the code system '+ws+'|'+c.version+' was not found'; + m := FI18n.translate('UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_CS', FParams.HTTPLanguages, [FValueSet.vurl, ws+'|'+c.version]); msg(m); - op.addIssue(isWarning, itNotFound, issuepath, m, oicVSProcessing); + op.addIssue(isWarning, itNotFound, '', m, oicVSProcessing); end else msg(m); @@ -1941,12 +1723,12 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; op.addIssue(isInformation, cause, p, message, oicInvalidCode); message := ''; end; - vcc.removeCoding(prov.systemUri(nil), prov.version(nil), c.code); - vs := ws+'|'+prov.version(nil)+'#'+c.code; + vcc.removeCoding(prov.systemUri, prov.version, c.code); + vs := ws+'|'+prov.version+'#'+c.code; if ts.indexOf(vs) = -1 then begin ts.add(vs); - m := FI18N.translate('Unknown_Code_in_Version', FParams.languages, [c.code, ws, prov.version(nil)]); + m := FI18N.translate('Unknown_Code_in_Version', FParams.HTTPLanguages, [c.code, ws, prov.version]); cause := itCodeInvalid; msg(m); op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), m, oicInvalidCode); @@ -1955,37 +1737,37 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; else begin listDisplays(list, prov, ctxt); - pd := list.preferredDisplay(FParams.languages); + pd := list.preferredDisplay(FParams.workingLanguages); if pd <> '' then pdisp := pd; if (pdisp = '') then pdisp := list.preferredDisplay; severity := dispWarning(); - if (c.display <> '') and (not list.hasDisplay(FParams.languages, c.display, dcsCaseInsensitive, diff)) then + if (c.display <> '') and (list.designations.Count > 0) and (not list.hasDisplay(FParams.workingLanguages, defLang, c.display, dcsCaseInsensitive, diff)) then begin if (diff = ddNormalised) then baseMsg := 'Display_Name_WS_for__should_be_one_of__instead_of' else baseMsg := 'Display_Name_for__should_be_one_of__instead_of'; - dc := list.displayCount(FParams.languages, true); + dc := list.displayCount(FParams.workingLanguages, nil, true); if dc = 0 then begin severity := isWarning; - m := FI18n.translate(baseMsg+'_other', FParams.languages, - ['', prov.systemUri(ctxt), c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]) + m := FI18n.translate(baseMsg+'_other', FParams.HTTPLanguages, + ['', prov.systemUri, c.code, list.present(FParams.workingLanguages, defLang, true), c.display, FParams.langSummary]) end else if dc = 1 then - m := FI18n.translate(baseMsg+'_one', FParams.languages, - ['', prov.systemUri(ctxt), c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]) + m := FI18n.translate(baseMsg+'_one', FParams.HTTPLanguages, + ['', prov.systemUri, c.code, list.present(FParams.workingLanguages, defLang, true), c.display, FParams.langSummary]) else - m := FI18n.translate(baseMsg+'_other', FParams.languages, - [inttostr(dc), prov.systemUri(ctxt), c.code, list.present(FParams.languages, true), c.display, FParams.langSummary]); + m := FI18n.translate(baseMsg+'_other', FParams.HTTPLanguages, + [inttostr(dc), prov.systemUri, c.code, list.present(FParams.workingLanguages, defLang, true), c.display, FParams.langSummary]); msg(m); op.addIssue(severity, itInvalid, addToPath(path, 'display'), m, oicDisplay); end; - if (prov.version(nil) <> '') then - result.addParamStr('version', prov.version(nil)); + if (prov.version <> '') then + result.addParamStr('version', prov.version); end; finally ctxt.free; @@ -2000,15 +1782,17 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; if (ok = bFalse) and not FAllValueSet then begin if mode = vcmCodeableConcept then - m := FI18n.translate('TX_GENERAL_CC_ERROR_MESSAGE', FParams.languages, [FValueSet.vurl]) + m := FI18n.translate('TX_GENERAL_CC_ERROR_MESSAGE', FParams.HTTPLanguages, [FValueSet.vurl]) else // true... if code.codingCount = 1 then - m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_one', FParams.languages, ['', FValueSet.vurl, codelist]); + m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_one', FParams.HTTPLanguages, ['', FValueSet.vurl, codelist]); //else - // m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_other', FParams.languages, ['', FValueSet.vurl, codelist]); + // m := FI18n.translate('None_of_the_provided_codes_are_in_the_value_set_other', FParams.HTTPLanguages, ['', FValueSet.vurl, codelist]); msg(m); if mode = vcmCodeableConcept then p := '' + else if (issuePath = '') then + p := 'code' else if (issuePath <> 'CodeableConcept') then p := issuePath + '.code' else if code.codingCount = 1 then @@ -2034,7 +1818,13 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; if (ok <> bTrue) and (unknownSystems.count > 0) then for us in unknownSystems do - result.addParamCanonical('x-caused-by-unknown-system', us); + if (ok = bFalse) then + result.addParamCanonical('x-unknown-system', us) + else + result.addParamCanonical('x-caused-by-unknown-system', us); + if normalForm <> '' then + result.addParamCode('normalized-code', normalForm); + if (pcode <>'') then result.addParamCode('code', pcode) else if (tcode <> '') and (mode <> vcmCodeableConcept) then @@ -2044,7 +1834,7 @@ function TValueSetChecker.check(issuePath : String; code: TFhirCodeableConceptW; else if (tver <> '') and (mode <> vcmCodeableConcept) then result.addParamStr('version', tver); - if pdisp <> '' then + if (pdisp <> '') and ((pcode <>'') or ((tcode <> '') and (mode <> vcmCodeableConcept))) then result.AddParamStr('display', pdisp); //else if tdisp <> '' then // result.AddParamStr('display', tdisp); @@ -2085,14 +1875,20 @@ function TValueSetChecker.check(issuePath, system, version, code: String; inferS var list : TConceptDesignations; message, ver, pd, impliedSystem, us : String; + defLang : TIETFLang; cause : TFhirIssueType; op : TFhirOperationOutcomeW; contentMode : TFhirCodeSystemContentMode; ok : TTrueFalseUnknown; unknownSystems, unkCodes, messages : TStringList; inactive : boolean; - vstatus : String; + vstatus, normalForm : String; begin + FOpContext.clearContexts; + if (inferSystem) then + FOpContext.addNote(FValueSet, 'Validate "'+code+'" and infer system') + else + FOpContext.addNote(FValueSet, 'Validate "'+TTerminologyOperationContext.renderCoded(system, version, code)+'"'); unknownSystems := TStringList.create; unkCodes := TStringList.create; messages := TStringList.create; @@ -2106,11 +1902,11 @@ function TValueSetChecker.check(issuePath, system, version, code: String; inferS checkCanonicalStatus(issuePath, op, FValueSet, FValueSet); list := TConceptDesignations.Create(FFactory.link, FLanguages.link); try - ok := check(issuePath, system, version, code, true, inferSystem, list, unknownSystems, message, ver, inactive, vstatus, cause, op, nil, result, contentMode, impliedSystem, unkCodes, messages); + ok := check(issuePath, system, version, code, true, inferSystem, list, unknownSystems, message, ver, inactive, normalForm, vstatus, cause, op, nil, result, contentMode, impliedSystem, unkCodes, messages, defLang); if ok = bTrue then begin result.AddParamBool('result', true); - pd := list.preferredDisplay(FParams.languages); + pd := list.preferredDisplay(FParams.workingLanguages); if pd <> ''then result.AddParamStr('display', pd); result.addParamUri('system', system); @@ -2177,7 +1973,7 @@ function TValueSetChecker.check(issuePath, system, version, code: String; inferS ctxt.free; end; -function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider; cset : TFhirValueSetComposeIncludeW; code: String; abstractOk : boolean; displays : TConceptDesignations; vs : TFHIRValueSetW; var message : String; var inactive : boolean; var vstatus : String; op : TFHIROperationOutcomeW; vcc : TFHIRCodeableConceptW): boolean; +function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider; cset : TFhirValueSetComposeIncludeW; code: String; abstractOk : boolean; displays : TConceptDesignations; vs : TFHIRValueSetW; var message : String; var inactive : boolean; var normalForm : String; var vstatus : String; op : TFHIROperationOutcomeW; vcc : TFHIRCodeableConceptW): boolean; var i : integer; fc : TFhirValueSetComposeIncludeFilterW; @@ -2198,17 +1994,20 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider result := false; if loc = nil then begin + FOpContext.addNote(FValueSet, 'Code "'+code+'" not found in '+ TTerminologyOperationContext.renderCoded(cs)); if (not FParams.membershipOnly) then - op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), FI18n.translate('Unknown_Code_in_Version', FParams.languages, [code, cs.systemUri(nil), cs.version(nil)]), oicInvalidCode) + op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), FI18n.translate('Unknown_Code_in_Version', FParams.HTTPLanguages, [code, cs.systemUri, cs.version]), oicInvalidCode) end else if not (abstractOk or not cs.IsAbstract(loc)) then begin + FOpContext.addNote(FValueSet, 'Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is abstract'); if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else if FValueSet.excludeInactives and cs.IsInactive(loc) then begin - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.languages, ['not active', code]), oicCodeRule); + FOpContext.addNote(FValueSet, 'Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is inactive'); + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.HTTPLanguages, ['not active', code]), oicCodeRule); result := false; if (not FParams.membershipOnly) then begin @@ -2219,23 +2018,35 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider end else if FParams.activeOnly and cs.IsInactive(loc) then begin + FOpContext.addNote(FValueSet, 'Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is inactive'); result := false; inactive := true; vstatus := cs.getCodeStatus(loc); - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.languages, ['not active', code]), oicCodeRule); + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('STATUS_CODE_WARNING_CODE', FParams.HTTPLanguages, ['not active', code]), oicCodeRule); end else begin + FOpContext.addNote(FValueSet, 'Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); result := true; + if (cs.Code(loc) <> code) then + begin + if (cs.version <> '') then + msg := FI18n.translate('CODE_CASE_DIFFERENCE', FParams.HTTPLanguages, [code, cs.Code(loc), cs.systemUri+'|'+cs.version]) + else + msg := FI18n.translate('CODE_CASE_DIFFERENCE', FParams.HTTPLanguages, [code, cs.Code(loc), cs.systemUri]); + op.addIssue(isInformation, itBusinessRule, addToPath(path, 'code'), msg, oicCodeRule); + normalForm := cs.Code(loc); + end; + msg := cs.incompleteValidationMessage(loc, FParams.HTTPLanguages); + if (msg <> '') then + op.addIssue(isInformation, itInformational, addToPath(path, 'code'), msg, oicProcessingNote); listDisplays(displays, cs, loc); inactive := cs.IsInactive(loc); - - if (inactive) then vstatus := cs.getCodeStatus(loc); if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); exit; end; finally @@ -2245,6 +2056,7 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider for cc in cset.concepts.forEnum do begin + deadCheck('checkConceptSet#1'); c := cc.code; if (code = c) then begin @@ -2252,12 +2064,13 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider try if Loc <> nil then begin + FOpContext.addNote(FValueSet, 'Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); listDisplays(displays, cs, loc); listDisplays(displays, cc, vs); if not (abstractOk or not cs.IsAbstract(loc)) then begin if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else if FValueSet.excludeInactives and cs.IsInactive(loc) then begin @@ -2271,11 +2084,13 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider else begin if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); result := true; exit; end; - end; + end + else + FOpContext.addNote(FValueSet, 'Code "'+code+'" in concept list, but not found in '+ TTerminologyOperationContext.renderCoded(cs)); finally loc.free; end; @@ -2292,10 +2107,12 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider i := 0; for fc in cfl do begin + deadCheck('checkConceptSet#2'); // gg - why? if ('concept' = fc.property_) and (fc.Op = FilterOperatorIsA) then f := cs.filter(false, fc.prop, fc.Op, fc.value, prep); if f = nil then - raise ETerminologyError.create('The filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'" from the value set '+vs.vurl+' was not understood in the context of '+cs.systemUri(nil), itNotSupported); + raise ETerminologyError.create('The filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'" from the value set '+vs.vurl+' was not understood in the context of '+cs.systemUri, itNotSupported); + f.summary := '"'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'"'; filters[i] := f; inc(i); end; @@ -2309,12 +2126,14 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider listDisplays(displays, cs, loc); if not (abstractOk or not cs.IsAbstract(loc)) then begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is abstract'); if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else if FValueSet.excludeInactives and cs.IsInactive(loc) then begin result := false; + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is inactive'); if (not FParams.membershipOnly) then begin inactive := true; @@ -2323,12 +2142,15 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider end else begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); result := true; exit; end; - end; + end + else + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" not found in '+ TTerminologyOperationContext.renderCoded(cs)); finally loc.free; end; @@ -2339,6 +2161,7 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider i := 0; for fc in cfl do begin + deadCheck('checkConceptSet#3'); if ('concept' = fc.prop) and (fc.Op in [foIsA, foDescendentOf]) then begin loc := cs.locateIsA(code, fc.value, fc.Op = foDescendentOf); @@ -2348,19 +2171,24 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider listDisplays(displays, cs, loc); if not (abstractOk or not cs.IsAbstract(loc)) then begin + OpContext.addNote(FValueSet, 'Filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'": Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is abstract'); if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else begin + OpContext.addNote(FValueSet, 'Filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'": Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); result := true; exit; end; end else + begin result := false; + OpContext.addNote(FValueSet, 'Filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'": Code "'+code+'" not found in '+ TTerminologyOperationContext.renderCoded(cs)); + end; finally loc.free; end; @@ -2378,11 +2206,13 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider listDisplays(displays, cs, loc); if not (abstractOk or not cs.IsAbstract(loc)) then begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is abstract'); if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else if FValueSet.excludeInactives and cs.IsInactive(loc) then begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is inactive'); result := false; if (not FParams.membershipOnly) then begin @@ -2392,13 +2222,16 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider end else begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); result := true; exit; end; end; - end; + end + else + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" not found in '+ TTerminologyOperationContext.renderCoded(cs)); finally loc.free; end; @@ -2416,11 +2249,13 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider listDisplays(displays, cs, loc); if not (abstractOk or not cs.IsAbstract(loc)) then begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is abstract'); if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else if FValueSet.excludeInactives and cs.IsInactive(loc) then begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)+' but is inactive'); result := false; if (not FParams.membershipOnly) then begin @@ -2430,12 +2265,15 @@ function TValueSetChecker.checkConceptSet(path : String; cs: TCodeSystemProvider end else begin + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" found in '+ TTerminologyOperationContext.renderCoded(cs)); if vcc <> nil then - vcc.addCoding(cs.systemUri(loc), cs.version(loc), cs.code(loc), displays.preferredDisplay(FParams.languages)); + vcc.addCoding(cs.systemUri, cs.version, cs.code(loc), displays.preferredDisplay(FParams.workingLanguages)); result := true; exit; end; - end; + end + else + OpContext.addNote(FValueSet, 'Filter '+ctxt.summary+': Code "'+code+'" not found in '+ TTerminologyOperationContext.renderCoded(cs)); finally loc.free; end; @@ -2468,12 +2306,12 @@ function TValueSetChecker.checkExpansion(path: String; cs: TCodeSystemProvider; if loc = nil then begin if (not FParams.membershipOnly) then - op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), FI18n.translate('Unknown_Code_in_Version', FParams.languages, [code, cs.systemUri(nil), cs.version(nil)]), oicInvalidCode) + op.addIssue(isError, itCodeInvalid, addToPath(path, 'code'), FI18n.translate('Unknown_Code_in_Version', FParams.HTTPLanguages, [code, cs.systemUri, cs.version]), oicInvalidCode) end else if not (abstractOk or not cs.IsAbstract(loc)) then begin if (not FParams.membershipOnly) then - op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.languages, [cs.systemUri(nil), code]), oicCodeRule) + op.addIssue(isError, itBusinessRule, addToPath(path, 'code'), FI18n.translate('ABSTRACT_CODE_NOT_ALLOWED', FParams.HTTPLanguages, [cs.systemUri, code]), oicCodeRule) end else begin @@ -2506,8 +2344,8 @@ function TValueSetChecker.isValidating: boolean; function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; - params: TFHIRExpansionParams; textFilter: String; dependencies: TStringList; - limit, count, offset: integer): TFHIRValueSetW; + params: TFHIRTxOperationParams; textFilter: String; dependencies: TStringList; + limit, count, offset: integer; noCacheThisOne : boolean): TFHIRValueSetW; var i, t, o : integer; c : TFhirValueSetExpansionContainsW; @@ -2523,10 +2361,12 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; lang : TIETFLang; list : TFslList; ext : TFHIRExtensionW; - noTotal : boolean; s : String; begin - noTotal := false; + FNoCacheThisOne := noCacheThisOne; + + FTotalStatus := tsUninitialised; + FTotal := 0; source.checkNoImplicitRules('ValueSetExpander.Expand', 'ValueSet'); FFactory.checkNoModifiers(source, 'ValueSetExpander.Expand', 'ValueSet'); @@ -2573,16 +2413,18 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; FCanBeHierarchy := not FParams.excludeNested; try - if limit > 0 then - FLimitCount := limit - else if not filter.null then - FLimitCount := UPPER_LIMIT_TEXT - else - FLimitCount := UPPER_LIMIT_NO_TEXT; - - FCount := count; + FLimitCount := INTERNAL_LIMIT; + if limit <= 0 then + begin + if not filter.null then + limit := UPPER_LIMIT_TEXT + else + limit := UPPER_LIMIT_NO_TEXT; + end; FOffset := offset; - if (FOffset > 0) or (FCount > 0) then + FCount := count; + + if (offset > 0) then FCanBeHierarchy := false; exp := result.forceExpansion; @@ -2596,8 +2438,10 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; if FParams.hasLimitedExpansion then exp.addParamBool('limitedExpansion', FParams.limitedExpansion); - if (FParams.hasLanguages) then - exp.addParamCode('displayLanguage', FParams.languages.asString(false)); + if (FParams.hasDisplayLanguages) then + exp.addParamCode('displayLanguage', FParams.DisplayLanguages.asString(false)) + else if (FParams.hasHTTPLanguages) then + exp.addParamCode('displayLanguage', FParams.HTTPLanguages.asString(false)); if (FParams.hasDesignations) then for s in FParams.Designations do exp.addParamStr('designation', s); @@ -2612,17 +2456,21 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; if FParams.hasExcludePostCoordinated then exp.addParamBool('excludePostCoordinated', FParams.excludePostCoordinated); checkCanonicalStatus(exp, source, source); - if FOffset > -1 then + if offset > -1 then + begin + exp.addParamInt('offset', offset); + exp.offset := offset; + end; + if count > -1 then begin - exp.addParamInt('offset', FOffset); - exp.offset := FOffset; + exp.addParamInt('count', count); end; - if FCount > -1 then - exp.addParamInt('count', FCount); + if (count > 0) and (offset = -1) then + offset := 0; DeadCheck('expand'); try -; ics := source.inlineCS; + ics := source.inlineCS; try if (ics <> nil) then begin @@ -2647,12 +2495,14 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; handleCompose(source, filter, dependencies, exp, notClosed); if (FRequiredSupplements.count > 0) then - raise ETerminologyError.create('Required supplements not found: ['+FRequiredSupplements.commaText+']', itBusinessRule); + raise ETerminologyError.create(FI18n.translatePlural(FRequiredSupplements.Count, 'VALUESET_SUPPLEMENT_MISSING', FParams.HTTPLanguages, [FRequiredSupplements.commaText]), itBusinessRule); + except on e : EFinished do begin // nothing - we're just trapping this - noTotal := true; + if FTotalStatus = tsUninitialised then + FTotalStatus := tsOff; // ? end; on e : ETooCostly do begin @@ -2686,9 +2536,13 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; end else begin - if not noTotal then + if (FTotalStatus = tsOff) or (FTotal = -1) then + FCanBeHierarchy := false + else if (FTotal > 0) then + exp.Total := FTotal + else exp.Total := FFullList.count; - if (FCanBeHierarchy) then + if (FCanBeHierarchy) and ((count <= 0) or (count > FFullList.count)) then // no need to consider offset - it must be 0 if FCanBeHierarchy list := FRootList else begin @@ -2698,24 +2552,32 @@ function TFHIRValueSetExpander.expand(source: TFHIRValueSetW; end; end; - t := 0; - o := 0; - for i := 0 to list.count - 1 do + if (offset + count < 0) and (FFullList.count > limit) then + begin + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY_COUNT', FParams.HTTPLanguages, [source.vurl, '>'+inttostr(limit), inttostr(FFullList.count)]))); + end + else begin - c := list[i]; - if FMap.containsKey(key(c)) then + t := 0; + o := 0; + for i := 0 to list.count - 1 do begin - inc(o); - if FCanBeHierarchy or (o > offset) and ((count <= 0) or (t < count)) then + deadCheck('expand#1'); + c := list[i]; + if FMap.containsKey(key(c)) then begin - inc(t); - exp.addContains(c); - if (table <> nil) then + inc(o); + if (o > offset) and ((count <= 0) or (t < count)) then begin - tr := table.AddChild('tr'); - tr.AddChild('td').AddText(c.systemUri); - tr.AddChild('td').AddText(c.code); - tr.AddChild('td').AddText(c.display); + inc(t); + exp.addContains(c); + if (table <> nil) then + begin + tr := table.AddChild('tr'); + tr.AddChild('td').AddText(c.systemUri); + tr.AddChild('td').AddText(c.code); + tr.AddChild('td').AddText(c.display); + end; end; end; end; @@ -2756,6 +2618,25 @@ procedure TFHIRValueSetExpander.checkCanonicalStatus(expansion: TFhirValueSetExp expansion.addParamUri('warning-draft', vurl) end; +function TFHIRValueSetExpander.isExcluded(system, version, code: String): boolean; +begin + result := FExcluded.contains(system+'|'+version+'#'+code); +end; + +procedure TFHIRValueSetExpander.NoTotal; +begin + FTotal := -1; + FTotalStatus := tsOff; +end; + +procedure TFHIRValueSetExpander.AddToTotal(t: Integer); +begin + if (FTotal > -1) and (FTotalStatus <> tsOff) then + begin + inc(FTotal, t); + FTotalStatus := tsSet; + end; +end; procedure TFHIRValueSetExpander.checkCanonicalStatus(expansion: TFhirValueSetExpansionW; resource: TFHIRMetadataResourceW; source : TFHIRValueSetW); begin @@ -2769,10 +2650,10 @@ procedure TFHIRValueSetExpander.checkCanonicalStatus(expansion: TFhirValueSetExp experimental : boolean; begin cs.getStatus(status, standardsStatus, experimental); - if (cs.version(nil) <> '') then - checkCanonicalStatus(expansion, cs.systemUri(nil)+'|'+cs.version(nil), status, standardsStatus, experimental, source) + if (cs.version <> '') then + checkCanonicalStatus(expansion, cs.systemUri+'|'+cs.version, status, standardsStatus, experimental, source) else - checkCanonicalStatus(expansion, cs.systemUri(nil), status, standardsStatus, experimental, source); + checkCanonicalStatus(expansion, cs.systemUri, status, standardsStatus, experimental, source); end; function TFHIRValueSetExpander.makeFilterForValueSet(cs: TCodeSystemProvider; vs: TFHIRValueSetW): TCodeSystemProviderFilterContext; @@ -2787,9 +2668,10 @@ function TFHIRValueSetExpander.makeFilterForValueSet(cs: TCodeSystemProvider; vs exit; for inc in vs.includes.forEnum do begin + deadCheck('makeFilterForValueSet'); if inc.systemUri = '' then exit; // no short cuts if there's further value set references - if inc.systemUri = cs.systemUri(nil) then + if inc.systemUri = cs.systemUri then begin // ok we have a match. Check we can simplify it if inc.hasValueSets then @@ -2809,7 +2691,10 @@ function TFHIRValueSetExpander.makeFilterForValueSet(cs: TCodeSystemProvider; vs begin result := TSpecialProviderFilterContextConcepts.create; for cc in inc.concepts.forEnum do + begin + deadCheck('makeFilterForValueSet#2'); TSpecialProviderFilterContextConcepts(result).add(cs.locate(cc.code, nil, message)); + end; exit; end; end; @@ -2826,6 +2711,7 @@ procedure TFHIRValueSetExpander.handleCompose(source: TFhirValueSetW; filter : T begin for s in source.imports do begin + deadCheck('handleCompose#1'); vs := expandValueSet(s, '', filter.filter, dependencies, notClosed); try checkCanonicalStatus(expansion, vs, FValueSet); @@ -2836,14 +2722,27 @@ procedure TFHIRValueSetExpander.handleCompose(source: TFhirValueSetW; filter : T end; for c in source.includes.forEnum do + begin + deadCheck('handleCompose#2'); checkSource(c, expansion, filter, source.url); + end; for c in source.excludes.forEnum do + begin + deadCheck('handleCompose#3'); + FHasExclusions := true; checkSource(c, expansion, filter, source.url); + end; - for c in source.includes.forEnum do - processCodes(false, c, source, filter, dependencies, expansion, source.excludeInactives, notClosed); for c in source.excludes.forEnum do - processCodes(true, c, source, filter, dependencies, expansion, source.excludeInactives,notClosed); + begin + deadCheck('handleCompose#4'); + excludeCodes(c, source, filter, dependencies, expansion, source.excludeInactives,notClosed); + end; + for c in source.includes.forEnum do + begin + deadCheck('handleCompose#5'); + includeCodes(c, source, filter, dependencies, expansion, source.excludeInactives, notClosed); + end; end; procedure TFHIRValueSetExpander.handleDefine(cs : TFhirCodeSystemW; source : TFhirValueSetCodeSystemW; defines : TFhirCodeSystemConceptListW; filter : TSearchFilterText; expansion : TFhirValueSetExpansionW; imports : TFslList; excludeInactive : boolean; srcURL : String); @@ -2865,6 +2764,7 @@ procedure TFHIRValueSetExpander.handleDefine(cs : TFhirCodeSystemW; source : TFh end; for cm in defines do begin + deadCheck('handleDefine'); FFactory.checkNoModifiers(cm, 'ValueSetExpander.handleDefine', 'concept'); if filter.passes(cm.display) or filter.passes(cm.code) then addDefinedCode(cs, source.systemUri, cm, imports, nil, excludeInactive, srcUrl); @@ -2876,6 +2776,7 @@ procedure TValueSetWorker.listDisplays(displays : TConceptDesignations; cs : TCo begin // list all known language displays cs.Designations(c, displays); + displays.source := cs.link; end; procedure TValueSetWorker.listDisplays(displays : TConceptDesignations; c: TFhirCodeSystemConceptW); // todo: supplements @@ -2890,12 +2791,11 @@ procedure TValueSetWorker.listDisplays(displays : TConceptDesignations; c: TFhir procedure TValueSetWorker.listDisplays(displays : TConceptDesignations; c: TFhirValueSetComposeIncludeConceptW; vs : TFHIRValueSetW); var cd : TFhirValueSetComposeIncludeConceptDesignationW; - list : TFslList; - i : integer; begin - if c.display <> '' then + if (c.display <> '') then begin - displays.Clear; + if (FFactory.version in [fhirVersionRelease2, fhirVersionRelease3]) then // this policy changed in R4 + displays.Clear; displays.baseLang := FLanguages.parse(vs.language); displays.addDesignation(true, true, '', c.displayElement); {no .link} end; @@ -2906,53 +2806,41 @@ procedure TValueSetWorker.listDisplays(displays : TConceptDesignations; c: TFhir procedure TValueSetWorker.deadCheck(place: String); var + id : String; fn : String; comp : TFHIRComposer; - i : integer; m : TFHIRMetadataResourceW; + b : TFslBytesBuilder; + time : integer; begin - if FOpContext.deadCheck then + SetThreadStatus(ClassName+'.'+place); + if FOpContext.deadCheck(time) then begin - fn := FilePath(['[tmp]', 'vs-dead-'+inttostr(FOpContext.FDeadTime)]); - comp := FFactory.makeComposer(nil, ffJson, FLangList, OutputStylePretty); + {$IFDEF DUMP_DEAD_VS} + id := FOpContext.FId; + if (id = '') then + id := 'internal'; + + fn := FilePath(['[tmp]', 'vs-dead-'+id+'.json']); + b := TFslbytesBuilder.create; try - BytesToFile(comp.ComposeBytes(FValueSet.Resource), fn+'.json'); - i := 0; - for m in FAdditionalResources do - begin - BytesToFile(comp.ComposeBytes(m.Resource), fn+'-'+inttostr(i)+'.json'); - inc(i); + comp := FFactory.makeComposer(nil, ffJson, FLangList, OutputStylePretty); + try + b.append(comp.ComposeBytes(FValueSet.Resource)); + for m in FAdditionalResources do + b.append(comp.ComposeBytes(m.Resource)); + finally + comp.free; end; + BytesToFile(b.AsBytes, fn); finally - comp.free; + b.free; end; logging.log('Expansion took too long @ '+place+': value set '+FValueSet.vurl+' stored at '+fn+'.json'); - raise ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.languages, [FValueSet.vurl, inttostr(EXPANSION_DEAD_TIME_SECS)])); - end; -end; - -function TValueSetWorker.listVersions(url: String): String; -var - ts : TStringList; - matches : TFslMetadataResourceList; - r : TFHIRMetadataResourceW; -begin - ts := TStringList.Create; - try - ts.Sorted := true; - ts.Duplicates := Classes.dupIgnore; - if FAdditionalResources <> nil then - begin - for r in FAdditionalResources do - begin - if (r.url = url) then - ts.Add(r.version); - end; - end; - FOnListCodeSystemVersions(self, url, ts); - result := ts.CommaText; - finally - ts.free; + {$ELSE} + logging.log('Expansion took too long'); + {$ENDIF} + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY_TIME', FParams.HTTPLanguages, [FValueSet.vurl, inttostr(time)]))); end; end; @@ -2961,10 +2849,12 @@ constructor TFHIRValueSetExpander.Create(factory: TFHIRFactory; opContext: TTerm inherited create(factory, opContext, getVS, getCS, getVersions, getExpansion, txResources, languages, i18n); FCSCounter := TFslMap.create; FCSCounter.defaultValue := nil; + FExcluded := TFslStringSet.create; end; destructor TFHIRValueSetExpander.Destroy; begin + FExcluded.free; FCSCounter.free; inherited Destroy; end; @@ -2981,14 +2871,17 @@ procedure TFHIRValueSetExpander.addDefinedCode(cs : TFhirCodeSystemW; system: st cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); try listDisplays(cds, c); - n := processCode(nil, parent, false, system, '', c.Code, cs.isAbstract(c), cs.isInactive(c), cs.isDeprecated(c), cds, c.definition, c.itemWeight, + n := includeCode(nil, parent, system, '', c.Code, cs.isAbstract(c), cs.isInactive(c), cs.isDeprecated(c), cds, c.definition, c.itemWeight, nil, imports, c.getAllExtensionsW, nil, c.properties, nil, excludeInactive, srcUrl); finally cds.free; end; end; for i := 0 to c.conceptList.count - 1 do + begin + deadCheck('addDefinedCode'); addDefinedCode(cs, system, c.conceptList[i], imports, n, excludeInactive, srcUrl); + end; end; function TFHIRValueSetExpander.canonical(system, version : String) : String; @@ -3081,7 +2974,7 @@ function getPropUrl(cs : TCodeSystemProvider; pcode : String) : String; end; end; -function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TFhirValueSetExpansionContainsW; doDelete : boolean; system, version, code : String; +function TFHIRValueSetExpander.includeCode(cs : TCodeSystemProvider; parent : TFhirValueSetExpansionContainsW; system, version, code : String; isAbstract, isInactive, deprecated : boolean; displays : TConceptDesignations; definition, itemWeight: string; expansion : TFhirValueSetExpansionW; imports : TFslList; csExtList, vsExtList : TFslList; csProps : TFslList; expProps : TFslList; excludeInactive : boolean; srcURL : string) : TFhirValueSetExpansionContainsW; var @@ -3094,30 +2987,40 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF cnt : TValueSetCounter; vstr : TFHIRObject; begin + result := nil; deadCheck('processCode'); try if not passesImports(imports, system, code, 0) then exit; if isInactive and excludeInactive then exit; + if isExcluded(system, version, code) then + exit; + - cnt := FCSCounter[cs.systemUri(nil)]; - if (cnt = nil) then + if (cs <> nil) and (cs.expandLimitation > 0) then begin - cnt := TValueSetCounter.create; - FCSCounter.Add(cs.systemUri(nil), cnt); + cnt := FCSCounter[cs.systemUri]; + if (cnt = nil) then + begin + cnt := TValueSetCounter.create; + FCSCounter.Add(cs.systemUri, cnt); + end; + cnt.increment; + if (cnt.count > cs.expandLimitation) then + exit; end; - cnt.increment; - if (cs.expandLimitation > 0) and (cnt.count > cs.expandLimitation) then - exit; - - if (FLimitCount > 0) and (FFullList.Count >= FLimitCount) and not doDelete then + if (FLimitCount > 0) and (FFullList.Count >= FLimitCount) and not FHasExclusions then begin - if (FCount > -1) and (FOffset > -1) and (FCount + FOffset > 0) and (FFullList.count > FCount + FOffset) then + if (FCount > -1) and (FOffset > -1) and (FCount + FOffset > 0) and (FFullList.count >= FCount + FOffset) then raise EFinished.create('.') else - raise ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.languages, [srcUrl, '>'+inttostr(FLimitCount)])); + begin + if (srcUrl = '') then + srcUrl := '??'; + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.HTTPLanguages, [srcUrl, '>'+inttostr(FLimitCount)]))); + end; end; if (expansion <> nil) then @@ -3147,7 +3050,7 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF s := key(system, code); - if doDelete or not FMap.containsKey(s) then + if not FMap.containsKey(s) then begin n := FFactory.makeValueSetContains; try @@ -3155,8 +3058,8 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF n.Code := code; if isAbstract then n.abstract_ := isAbstract; - if isInactive then - n.inactive := isInactive; + if isInactive or deprecated then + n.inactive := true; if (deprecated) then expansion.defineProperty(n, 'http://hl7.org/fhir/concept-properties#status', 'status', FFactory.makeCode('deprecated')); @@ -3189,8 +3092,8 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF n.addExtensionV(ext.element.link); // display and designations - pref := displays.preferredDesignation(FParams.languages); - if (pref <> nil) then + pref := displays.preferredDesignation(FParams.workingLanguages); + if (pref <> nil) and (pref.value <> nil) then n.display := pref.value.AsString; if FParams.includeDesignations then @@ -3214,7 +3117,7 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF end; end; end - else if csProps <> nil then + else if (csProps <> nil) and (cs <> nil) then begin for cp in csprops do begin @@ -3261,26 +3164,14 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF // end; // end; - if (dodelete) then - begin - FCanBeHierarchy := false; - if FMap.ContainsKey(s) then - begin - FFullList.Remove(FMap[s]); - FMap.Remove(s); - end; - end - else if not FMap.ContainsKey(s) then + if not FMap.ContainsKey(s) then begin FFullList.add(n.link); FMap.add(s, n.link); - if (FCanBeHierarchy) then - begin - if (parent <> nil) then - parent.addContains(n) - else - FRootList.add(n.link); - end; + if (parent <> nil) then + parent.addContains(n) + else + FRootList.add(n.link); end else FCanBeHierarchy := false; @@ -3296,6 +3187,68 @@ function TFHIRValueSetExpander.processCode(cs : TCodeSystemProvider; parent : TF end; end; +procedure TFHIRValueSetExpander.excludeCode(cs : TCodeSystemProvider; system, version, code : String; expansion : TFhirValueSetExpansionW; imports : TFslList; srcURL : string); +var + s, vs : String; + ts : TStringList; +begin + deadCheck('excludeCode'); + if not passesImports(imports, system, code, 0) then + exit; + + //if (cs <> nil) and (cs.expandLimitation > 0) then + //begin + // cnt := FCSCounter[cs.systemUri]; + // if (cnt = nil) then + // begin + // cnt := TValueSetCounter.create; + // FCSCounter.Add(cs.systemUri, cnt); + // end; + // cnt.increment; + // if (cnt.count > cs.expandLimitation) then + // exit; + //end; + + if (FLimitCount > 0) and (FFullList.Count >= FLimitCount) and not FHasExclusions then + begin + if (FCount > -1) and (FOffset > -1) and (FCount + FOffset > 0) and (FFullList.count >= FCount + FOffset) then + raise EFinished.create('.') + else + begin + if (srcUrl = '') then + srcUrl := '??'; + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.HTTPLanguages, [srcUrl, '>'+inttostr(FLimitCount)]))); + end; + end; + + if (expansion <> nil) then + begin + s := canonical(system, version); + if not expansion.hasParam('used-codesystem', s) then + expansion.addParamUri('used-codesystem', s); + if not expansion.hasParam('version', s) then + expansion.addParamUri('version', s); + if (cs <> nil) then + begin + ts := TStringList.create; + try + cs.listSupplements(ts); + for vs in ts do + begin + if not expansion.hasParam('used-supplement', vs) then + expansion.addParamUri('used-supplement', vs); + if not expansion.hasParam('version', vs) then + expansion.addParamUri('version', vs); + end; + finally + ts.free; + end; + end; + end; + + FExcluded.add(system+'|'+version+'#'+code); +end; + procedure TFHIRValueSetExpander.checkCanExpandValueset(uri, version: String); var vs : TFHIRValueSetW; @@ -3309,15 +3262,14 @@ procedure TFHIRValueSetExpander.checkCanExpandValueset(uri, version: String); end; end; -function TFHIRValueSetExpander.expandValueSet(uri, version, filter: String; - dependencies: TStringList; var notClosed: boolean): TFHIRValueSetW; +function TFHIRValueSetExpander.expandValueSet(uri, version, filter: String; dependencies: TStringList; var notClosed: boolean): TFHIRValueSetW; var dep : TStringList; exp : TFhirValueSetExpansionW; begin dep := TStringList.Create; try - result := FOnGetExpansion(self, FOpContext, uri, version, filter, FParams, dep, FAdditionalResources , -1); + result := FOnGetExpansion(self, FOpContext, uri, version, filter, FParams, dep, FAdditionalResources , -1, FNoCacheThisOne); try dependencies.AddStrings(dep); if (result = nil) then @@ -3358,14 +3310,17 @@ procedure TFHIRValueSetExpander.importValueSetItem(p, c : TFhirValueSetExpansion if passesImports(imports, c.systemUri, c.code, offset) and not FMap.containsKey(s) then begin FFullList.add(c.link); - if FCanBeHierarchy and (p <> nil) then + if (p <> nil) then p.addContains(c) else FRootList.add(c.link); FMap.add(s, c.link); end; for cc in c.contains.forEnum do - importValueSetItem(c, cc, imports, offset); + begin + deadCheck('importValueSetItem'); + importValueSetItem(c, cc, imports, offset); + end; end; procedure TFHIRValueSetExpander.excludeValueSet(vs : TFHIRValueSetW; expansion : TFhirValueSetExpansionW; imports : TFslList; offset : integer); @@ -3392,17 +3347,18 @@ procedure TFHIRValueSetExpander.checkSource(cset: TFhirValueSetComposeIncludeW; imp : boolean; begin deadCheck('checkSource'); - FFactory.checkNoModifiers(cset,'ValueSetExpander.processCodes', 'set'); + FFactory.checkNoModifiers(cset,'ValueSetExpander.checkSource', 'set'); imp := false; for s in cset.valueSets do begin + deadCheck('checkSource'); checkCanExpandValueset(s, ''); imp := true; end; if cset.systemUri <> '' then begin - cs := findCodeSystem(cset.systemUri, cset.version, FParams, false); + cs := findCodeSystem(cset.systemUri, cset.version, FParams, [cscmComplete, cscmFragment], false); try if cs.contentMode <> cscmComplete then @@ -3412,7 +3368,7 @@ procedure TFHIRValueSetExpander.checkSource(cset: TFhirValueSetComposeIncludeW; else if cs.contentMode = cscmNotPresent then raise ETerminologyError.create('The code system definition for '+cset.systemUri+' defines a supplement, so this expansion cannot be performed', itInvalid) else if FParams.incompleteOK then - exp.addParamUri(CODES_TFhirCodeSystemContentMode[cs.contentMode], cs.systemUri(nil)+'|'+cs.version(nil)) + exp.addParamUri(CODES_TFhirCodeSystemContentMode[cs.contentMode], cs.systemUri+'|'+cs.version) else raise ETerminologyError.create('The code system definition for '+cset.systemUri+' is a '+CODES_TFhirCodeSystemContentMode[cs.contentMode]+', so this expansion is not permitted unless the expansion parameter "incomplete-ok" has a value of "true"', itInvalid); end; @@ -3427,14 +3383,12 @@ procedure TFHIRValueSetExpander.checkSource(cset: TFhirValueSetComposeIncludeW; begin if cs.isNotClosed(filter) then if cs.SpecialEnumeration <> '' then - raise ETooCostly.create('The code System "'+cs.systemUri(nil)+'" has a grammar, and cannot be enumerated directly. If an incomplete expansion is requested, a limited enumeration will be returned') - else if (cs.systemUri(nil) = ALL_CODE_CS) then - raise ETooCostly.create('Cannot filter across all code Systems known to the server') + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly. If an incomplete expansion is requested, a limited enumeration will be returned')) else - raise ETooCostly.create('The code System "'+cs.systemUri(nil)+'" has a grammar, and cannot be enumerated directly'); + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly')); - if not imp and (FLimitCount > 0) and (cs.TotalCount > FLimitCount) and not (FParams.limitedExpansion) and (FOffset+FCount <= 0) then - raise ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.languages, [srcUrl, '>'+inttostr(FLimitCount)])); + if not imp and (FLimitCount > 0) and (cs.TotalCount > FLimitCount) and not (FParams.limitedExpansion) then + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.HTTPLanguages, [srcUrl, '>'+inttostr(FLimitCount)]))); end end; @@ -3444,7 +3398,7 @@ procedure TFHIRValueSetExpander.checkSource(cset: TFhirValueSetComposeIncludeW; end; end; -procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); +procedure TFHIRValueSetExpander.includeCodes(cset: TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); var cs : TCodeSystemProvider; i, count, offset : integer; @@ -3457,7 +3411,7 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu ok : boolean; prep : TCodeSystemProviderFilterPreparationContext; inner : boolean; - s, display, ov, code, vsId : String; + s, display, ov, code, vsId, sv : String; valueSets : TFslList; base : TFHIRValueSetW; cc : TFhirValueSetComposeIncludeConceptW; @@ -3467,6 +3421,7 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu vs : TFHIRValueSetW; parent : TFhirValueSetExpansionContainsW; ivs : TFHIRImportedValueSet; + tcount : integer; function passesFilters(c : TCodeSystemProviderContext; offset : integer) : boolean; var j : integer; @@ -3520,20 +3475,23 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu ivs.free; end; end; - if doDelete then - excludeValueSet(valueSets[0].valueSet, expansion, valueSets, 1) - else - importValueSet(valueSets[0].valueSet, expansion, valueSets, 1); + importValueSet(valueSets[0].valueSet, expansion, valueSets, 1); end else begin filters := TFslList.create; try - cs := findCodeSystem(cset.systemUri, cset.version, FParams, false); + cs := findCodeSystem(cset.systemUri, cset.version, FParams, [cscmComplete, cscmFragment], false); try //Logging.log('Processing '+vsId+',code system "'+cset.systemUri+'|'+cset.version+'", '+inttostr(cset.filterCount)+' filters, '+inttostr(cset.conceptCount)+' concepts'); checkSupplements(cs, cset); checkCanonicalStatus(expansion, cs, FValueSet); + sv := canonical(cs.systemUri, cs.version); + if not expansion.hasParam('used-codesystem', sv) then + expansion.addParamUri('used-codesystem', sv); + if not expansion.hasParam('version', sv) then + expansion.addParamUri('version', sv); + for s in cset.valueSets do begin //Logging.log(' ...import value set '+s); @@ -3562,10 +3520,7 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu base := expandValueSet(cs.SpecialEnumeration, '', filter.filter, dependencies, notClosed); try expansion.addExtensionV('http://hl7.org/fhir/StructureDefinition/valueset-toocostly', FFactory.makeBoolean(true)); - if doDelete then - excludeValueSet(base, expansion, valueSets, 0) - else - importValueSet(base, expansion, valueSets, 0); + importValueSet(base, expansion, valueSets, 0); finally base.free; end; @@ -3575,23 +3530,22 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu begin if cs.isNotClosed(filter) then if cs.SpecialEnumeration <> '' then - raise ETooCostly.create('The code System "'+cs.systemUri(nil)+'" has a grammar, and cannot be enumerated directly. If an incomplete expansion is requested, a limited enumeration will be returned') - else if (cs.systemUri(nil) = ALL_CODE_CS) then - raise ETooCostly.create('Cannot filter across all code Systems known to the server') + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly. If an incomplete expansion is requested, a limited enumeration will be returned')) else - raise ETooCostly.create('The code System "'+cs.systemUri(nil)+'" has a grammar, and cannot be enumerated directly'); + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly')); iter := cs.getIterator(nil); try - if valueSets.Empty and (FLimitCount > 0) and (iter.count > FLimitCount) and not (FParams.limitedExpansion) and not doDelete and (FOffset + Fcount < 0) then - raise ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.languages, [vsSrc.url, '>'+inttostr(FLimitCount)])); + if valueSets.Empty and (FLimitCount > 0) and (iter.count > FLimitCount) and not (FParams.limitedExpansion) then + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.HTTPLanguages, [vsSrc.url, '>'+inttostr(FLimitCount)]))); + tcount := 0; while iter.more do begin deadCheck('processCodes#3a'); c := cs.getNextContext(iter); try if passesFilters(c, 0) then - processCodeAndDescendants(doDelete, cs, c, expansion, valueSets, nil, excludeInactive, vsSrc.url) + inc(tcount, includeCodeAndDescendants(cs, c, expansion, valueSets, nil, excludeInactive, vsSrc.url)); finally c.free; end; @@ -3599,9 +3553,11 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu finally iter.free; end; + AddToTotal(tcount); end else begin + NoTotal; if cs.isNotClosed(filter) then notClosed := true; prep := cs.getPrepContext; @@ -3619,7 +3575,7 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); try listDisplays(cds, cs, c); // cs.display(c, FParams.displayLanguage) - processCode(cs, nil, doDelete, cs.systemUri(c), cs.version(c), cs.code(c), cs.isAbstract(c), cs.isInactive(c), cs.deprecated(c), + includeCode(cs, nil, cs.systemUri, cs.version, cs.code(c), cs.isAbstract(c), cs.isInactive(c), cs.deprecated(c), cds, cs.definition(c), cs.itemWeight(c), expansion, valueSets, cs.getExtensions(c), nil, cs.getProperties(c), nil, excludeInactive, vsSrc.url); finally cds.free; @@ -3638,33 +3594,40 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu end; end; - cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); - try - for cc in cset.concepts.forEnum do - begin - cds.Clear; - FFactory.checkNoModifiers(cc, 'ValueSetExpander.processCodes', 'set concept reference'); - cctxt := cs.locate(cc.code, FAllAltCodes); - try - if (cctxt <> nil) and (not FParams.activeOnly or not cs.IsInactive(cctxt)) and passesFilters(cctxt, 0) then - begin - listDisplays(cds, cs, cctxt); - listDisplays(cds, cc, vsSrc); - if filter.passes(cds) or filter.passes(cc.code) then + if (cset.hasConcepts) then + begin + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + tcount := 0; + for cc in cset.concepts.forEnum do + begin + deadCheck('processCodes#3'); + cds.Clear; + FFactory.checkNoModifiers(cc, 'ValueSetExpander.processCodes', 'set concept reference'); + cctxt := cs.locate(cc.code, FAllAltCodes); + try + if (cctxt <> nil) and (not FParams.activeOnly or not cs.IsInactive(cctxt)) and passesFilters(cctxt, 0) then begin - ov := cc.itemWeight; - if ov = '' then - ov := cs.itemWeight(cctxt); - processCode(cs, nil, doDelete, cs.systemUri(nil), cs.version(nil), cc.code, cs.isAbstract(cctxt), cs.isInactive(cctxt), cs.deprecated(cctxt), cds, - cs.Definition(cctxt), ov, expansion, valueSets, cs.getExtensions(cctxt), cc.getAllExtensionsW, cs.getProperties(cctxt), nil, excludeInactive, vsSrc.url); + listDisplays(cds, cs, cctxt); + listDisplays(cds, cc, vsSrc); + if filter.passes(cds) or filter.passes(cc.code) then + begin + inc(tcount); + ov := cc.itemWeight; + if ov = '' then + ov := cs.itemWeight(cctxt); + includeCode(cs, nil, cs.systemUri, cs.version, cc.code, cs.isAbstract(cctxt), cs.isInactive(cctxt), cs.deprecated(cctxt), cds, + cs.Definition(cctxt), ov, expansion, valueSets, cs.getExtensions(cctxt), cc.getAllExtensionsW, cs.getProperties(cctxt), nil, excludeInactive, vsSrc.url); + end; end; + finally + cctxt.free; end; - finally - cctxt.free; end; + AddToTotal(tcount); + finally + cds.free; end; - finally - cds.free; end; if cset.hasFilters then @@ -3688,19 +3651,24 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu end; for i := 0 to fcl.count - 1 do begin + deadCheck('processCodes#4a'); fc := fcl[i]; ffactory.checkNoModifiers(fc, 'ValueSetExpander.processCodes', 'filter'); f := cs.filter(i = 0, fc.prop, fc.Op, fc.value, prep); if f = nil then - raise ETerminologyError.create('The filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'" from the value set '+vsSrc.url+' was not understood in the context of '+cs.systemUri(nil), itNotSupported); + raise ETerminologyError.create('The filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'" from the value set '+vsSrc.url+' was not understood in the context of '+cs.systemUri, itNotSupported); filters.Insert(offset, f); if cs.isNotClosed(filter, f) then notClosed := true; + if (cset.filterCount = 1) and (not excludeInactive) and not FParams.activeOnly then + AddToTotal(cs.filterSize(f)); + //else + //NoTotal; end; inner := cs.prepare(prep); count := 0; - While cs.FilterMore(filters[0]) and (((FOffset <= 0) and (FCount <= 0)) or (count < FOffset + FCount)) do + While cs.FilterMore(filters[0]) do begin deadCheck('processCodes#5'); c := cs.FilterConcept(filters[0]); @@ -3709,27 +3677,24 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu if ok then begin inc(count); - if count > FOffset then - begin - cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); - try - if passesImports(valueSets, cs.systemUri(nil), cs.code(c), 0) then + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + if passesImports(valueSets, cs.systemUri, cs.code(c), 0) then + begin + listDisplays(cds, cs, c); + if cs.canParent then + parent := FMap[key(cs.systemUri, cs.parent(c))] + else begin - listDisplays(cds, cs, c); - if cs.canParent then - parent := FMap[key(cs.systemUri(c), cs.parent(c))] - else - begin - FCanBeHierarchy := false; - parent := nil; - end; - for code in cs.listCodes(c, FParams.altCodeRules) do - processCode(cs, parent, doDelete, cs.systemUri(nil), cs.version(nil), code, cs.isAbstract(c), cs.IsInactive(c), - cs.deprecated(c), cds, cs.definition(c), cs.itemWeight(c), expansion, nil, cs.getExtensions(c), nil, cs.getProperties(c), nil, excludeInactive, vsSrc.url); + FCanBeHierarchy := false; + parent := nil; end; - finally - cds.free; + for code in cs.listCodes(c, FParams.altCodeRules) do + includeCode(cs, parent, cs.systemUri, cs.version, code, cs.isAbstract(c), cs.IsInactive(c), + cs.deprecated(c), cds, cs.definition(c), cs.itemWeight(c), expansion, nil, cs.getExtensions(c), nil, cs.getProperties(c), nil, excludeInactive, vsSrc.url); end; + finally + cds.free; end; end; finally @@ -3755,304 +3720,718 @@ procedure TFHIRValueSetExpander.processCodes(doDelete : boolean; cset: TFhirValu end; end; -procedure TFHIRValueSetExpander.processCodeAndDescendants(doDelete : boolean; cs: TCodeSystemProvider; context: TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; parent : TFhirValueSetExpansionContainsW; excludeInactive : boolean; srcUrl : String); +procedure TFHIRValueSetExpander.excludeCodes(cset: TFhirValueSetComposeIncludeW; vsSrc : TFHIRValueSetW; filter : TSearchFilterText; dependencies : TStringList; expansion : TFhirValueSetExpansionW; excludeInactive : boolean; var notClosed : boolean); var - i : integer; - vs, code : String; + cs : TCodeSystemProvider; + i, count, offset : integer; + fc : TFhirValueSetComposeIncludeFilterW; + fcl : TFslList; + c : TCodeSystemProviderContext; + filters : TFslList; + f : TCodeSystemProviderFilterContext; + ctxt : TCodeSystemProviderFilterContext; + ok : boolean; + prep : TCodeSystemProviderFilterPreparationContext; + inner : boolean; + s, display, ov, code, vsId, sv : String; + valueSets : TFslList; + base : TFHIRValueSetW; + cc : TFhirValueSetComposeIncludeConceptW; + cctxt : TCodeSystemProviderContext; cds : TConceptDesignations; iter : TCodeSystemIteratorContext; - n, t : TFhirValueSetExpansionContainsW; - ts : TStringList; - c : TCodeSystemProviderContext; -begin - deadCheck('processCodeAndDescendants'); - if (expansion <> nil) then + vs : TFHIRValueSetW; + parent : TFhirValueSetExpansionContainsW; + ivs : TFHIRImportedValueSet; + function passesFilters(c : TCodeSystemProviderContext; offset : integer) : boolean; + var + j : integer; + ok : boolean; + t : TCodeSystemProviderContext; begin - vs := canonical(cs.systemUri(nil), cs.version(nil)); - if not expansion.hasParam('used-codesystem', vs) then - expansion.addParamUri('used-codesystem', vs); - if not expansion.hasParam('version', vs) then - expansion.addParamUri('version', vs); - ts := TStringList.create; - try - cs.listSupplements(ts); - for vs in ts do + result := true; + for j := offset to filters.Count - 1 do + begin + f := filters[j]; + if f is TSpecialProviderFilterContextNothing then + result := false + else if f is TSpecialProviderFilterContextConcepts then begin - if not expansion.hasParam('used-supplement', vs) then - expansion.addParamUri('used-supplement', vs); - if not expansion.hasParam('version', vs) then - expansion.addParamUri('version', vs); - end; - finally - ts.free; + ok := false; + for t in (f as TSpecialProviderFilterContextConcepts).FList do + if cs.sameContext(t, c) then + ok := true; + result := result and ok; + end + else + result := result and cs.InFilter(f, c); end; end; - n := nil; - if (not FParams.excludeNotForUI or not cs.IsAbstract(context)) and (not FParams.activeOnly or not cs.isInActive(context)) then - begin - cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); - try - deadCheck('processCodeAndDescendants#2'); - listDisplays(cds, cs, context); - for code in cs.listCodes(context, FParams.altCodeRules) do +begin + vsId := FValueSet.vurl; + if (vsId = '') then + vsId := ''; + + deadCheck('processCodes#1'); + valueSets := TFslList.create; + try + FFactory.checkNoModifiers(cset,'ValueSetExpander.processCodes', 'set'); + + if (cset.hasValueSets or cset.hasConcepts or (cset.filterCount > 1)) then + FCanBeHierarchy := false; + + if cset.systemUri = '' then + begin + NoTotal; + for s in cset.valueSets do begin - t := processCode(cs, parent, doDelete, cs.systemUri(context), cs.version(context), code, cs.isAbstract(context), cs.IsInactive(context), cs.deprecated(context), cds, cs.definition(context), - cs.itemWeight(context), expansion, imports, cs.getExtensions(context), nil, cs.getProperties(context), nil, excludeInactive, srcUrl); - if (n = nil) then - n := t; + //Logging.log('Processing '+vsId+', import value set '+s); + deadCheck('processCodes#2'); + ivs := TFHIRImportedValueSet.create(expandValueset(s, '', filter.filter, dependencies, notClosed)); + try + checkCanonicalStatus(expansion, ivs.FValueSet, FValueSet); + expansion.addParamUri('used-valueset', ivs.FValueSet.vurl); + expansion.addParamUri('version', ivs.FValueSet.vurl); + valueSets.add(ivs.link); + finally + ivs.free; + end; end; - finally - cds.free; - end; - end - else - n := parent; - iter := cs.getIterator(context); - try - while iter.more do + excludeValueSet(valueSets[0].valueSet, expansion, valueSets, 1); + end + else begin - deadCheck('processCodeAndDescendants#3'); - c := cs.getNextContext(iter); + filters := TFslList.create; try - processCodeAndDescendants(doDelete, cs, c, expansion, imports, n, excludeInactive, srcUrl); - finally - c.free; - end; - end; - finally - iter.free; - end; -end; - -{ TFHIRExpansionParams } - -constructor TFHIRExpansionParams.Create; -begin - inherited; - FVersionRules := TFslList.create; - FProperties := TStringList.create; - FAltCodeRules := TAlternateCodeOptions.create; - FDesignations := TStringlist.create; - - FGenerateNarrative := true; -end; - -procedure TFHIRExpansionParams.SetLanguages(value: THTTPLanguageList); -begin - FLanguages.free; - FLanguages := value; -end; + cs := findCodeSystem(cset.systemUri, cset.version, FParams, [cscmComplete, cscmFragment], false); + try + //Logging.log('Processing '+vsId+',code system "'+cset.systemUri+'|'+cset.version+'", '+inttostr(cset.filterCount)+' filters, '+inttostr(cset.conceptCount)+' concepts'); + checkSupplements(cs, cset); + checkCanonicalStatus(expansion, cs, FValueSet); + sv := canonical(cs.systemUri, cs.version); + if not expansion.hasParam('used-codesystem', sv) then + expansion.addParamUri('used-codesystem', sv); + if not expansion.hasParam('version', sv) then + expansion.addParamUri('version', sv); -function TFHIRExpansionParams.GetHasLanguages: boolean; -begin - result := (FLanguages <> nil) and (FLanguages.source <> ''); -end; + for s in cset.valueSets do + begin + //Logging.log(' ...import value set '+s); + deadCheck('processCodes#3'); + f := nil; + // if we can, we can do a short cut evaluation that means we don't have to do a full expansion of the source value set. + // this saves lots of overhead we don't need. But it does require simple cases (though they are common). So we have a look + // at the value set, and see whether we can short cut it. If we can, it's just another filter (though we can't iterate on it) + vs := FOnGetValueSet(self, s, ''); + try + if (vs <> nil) then + f := makeFilterForValueSet(cs, vs); + if (f <> nil) then + filters.add(f) + else + valueSets.add(TFHIRImportedValueSet.create(expandValueset(s, '', filter.filter, dependencies, notClosed))); + finally + vs.free; + end; + end; -function TFHIRExpansionParams.GetHasDesignations: boolean; -begin - result := designations.Count > 0; -end; + if (not cset.hasConcepts) and (not cset.hasFilters) then + begin + if (cs.SpecialEnumeration <> '') and FParams.limitedExpansion and filters.Empty then + begin + base := expandValueSet(cs.SpecialEnumeration, '', filter.filter, dependencies, notClosed); + try + expansion.addExtensionV('http://hl7.org/fhir/StructureDefinition/valueset-toocostly', FFactory.makeBoolean(true)); + excludeValueSet(base, expansion, valueSets, 0); + finally + base.free; + end; + notClosed := true; + end + else if filter.Null then // special case - add all the code system + begin + if cs.isNotClosed(filter) then + if cs.SpecialEnumeration <> '' then + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly. If an incomplete expansion is requested, a limited enumeration will be returned')) + else + raise costDiags(ETooCostly.create('The code System "'+cs.systemUri+'" has a grammar, and cannot be enumerated directly')); -procedure TFHIRExpansionParams.SetActiveOnly(value : boolean); -begin - FActiveOnly := value; - FHasActiveOnly := true; -end; - -procedure TFHIRExpansionParams.SetExcludeNested(value : boolean); -begin - FExcludeNested := value; - FHasExcludeNested:= true; -end; + iter := cs.getIterator(nil); + try + if valueSets.Empty and (FLimitCount > 0) and (iter.count > FLimitCount) and not (FParams.limitedExpansion) then + raise costDiags(ETooCostly.create(FI18n.translate('VALUESET_TOO_COSTLY', FParams.HTTPLanguages, [vsSrc.url, '>'+inttostr(FLimitCount)]))); + while iter.more do + begin + deadCheck('processCodes#3a'); + c := cs.getNextContext(iter); + try + if passesFilters(c, 0) then + excludeCodeAndDescendants(cs, c, expansion, valueSets, excludeInactive, vsSrc.url); + finally + c.free; + end; + end; + finally + iter.free; + end; + end + else + begin + NoTotal; + if cs.isNotClosed(filter) then + notClosed := true; + prep := cs.getPrepContext; + try + ctxt := cs.searchFilter(filter, prep, false); + try + cs.prepare(prep); + while cs.FilterMore(ctxt) do + begin + deadCheck('processCodes#4'); + c := cs.FilterConcept(ctxt); + try + if passesFilters(c, 0) then + begin + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + excludeCode(cs, cs.systemUri, cs.version, cs.code(c), expansion, valueSets, vsSrc.url); + finally + cds.free; + end; + end; + finally + c.free; + end; + end; + finally + ctxt.free; + end; + finally + prep.free; + end; + end; + end; -procedure TFHIRExpansionParams.SetGenerateNarrative(value : boolean); -begin - FGenerateNarrative := value; - FHasGenerateNarrative := true; -end; + if (cset.hasConcepts) then + begin + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + for cc in cset.concepts.forEnum do + begin + deadCheck('processCodes#3'); + cds.Clear; + FFactory.checkNoModifiers(cc, 'ValueSetExpander.processCodes', 'set concept reference'); + cctxt := cs.locate(cc.code, FAllAltCodes); + try + if (cctxt <> nil) and (not FParams.activeOnly or not cs.IsInactive(cctxt)) and passesFilters(cctxt, 0) then + begin + if filter.passes(cds) or filter.passes(cc.code) then + begin + ov := cc.itemWeight; + if ov = '' then + ov := cs.itemWeight(cctxt); + excludeCode(cs, cs.systemUri, cs.version, cc.code, expansion, valueSets, vsSrc.url); + end; + end; + finally + cctxt.free; + end; + end; + finally + cds.free; + end; + end; -procedure TFHIRExpansionParams.SetLimitedExpansion(value : boolean); -begin - FLimitedExpansion := value; - FHasLimitedExpansion := true; -end; + if cset.hasFilters then + begin + fcl := cset.filters; + try + prep := cs.getPrepContext; + try + offset := 0; + if not filter.null then + begin + filters.Insert(0, cs.searchFilter(filter, prep, true)); // this comes first, because it imposes order + inc(offset); + end; -procedure TFHIRExpansionParams.SetExcludeNotForUI(value : boolean); -begin - FExcludeNotForUI := value; - FHasExcludeNotForUI := true; -end; + if cs.specialEnumeration <> '' then + begin + filters.Insert(offset, cs.specialFilter(prep, true)); + expansion.addExtensionV('http://hl7.org/fhir/StructureDefinition/valueset-toocostly', FFactory.makeBoolean(true)); + notClosed := true; + end; + for i := 0 to fcl.count - 1 do + begin + deadCheck('processCodes#4a'); + fc := fcl[i]; + ffactory.checkNoModifiers(fc, 'ValueSetExpander.processCodes', 'filter'); + f := cs.filter(i = 0, fc.prop, fc.Op, fc.value, prep); + if f = nil then + raise ETerminologyError.create('The filter "'+fc.prop +' '+ CODES_TFhirFilterOperator[fc.Op]+ ' '+fc.value+'" from the value set '+vsSrc.url+' was not understood in the context of '+cs.systemUri, itNotSupported); + filters.Insert(offset, f); + if cs.isNotClosed(filter, f) then + notClosed := true; + end; -procedure TFHIRExpansionParams.SetExcludePostCoordinated(value : boolean); -begin - FExcludePostCoordinated := value; - FHasExcludePostCoordinated := true; + inner := cs.prepare(prep); + count := 0; + While cs.FilterMore(filters[0]) do + begin + deadCheck('processCodes#5'); + c := cs.FilterConcept(filters[0]); + try + ok := (not FParams.activeOnly or not cs.IsInactive(c)) and (inner or passesFilters(c, 1)); + if ok then + begin + inc(count); + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + if passesImports(valueSets, cs.systemUri, cs.code(c), 0) then + begin + listDisplays(cds, cs, c); + if cs.canParent then + parent := FMap[key(cs.systemUri, cs.parent(c))] + else + begin + FCanBeHierarchy := false; + parent := nil; + end; + for code in cs.listCodes(c, FParams.altCodeRules) do + excludeCode(cs, cs.systemUri, cs.version, code, expansion, nil, vsSrc.url); + end; + finally + cds.free; + end; + end; + finally + c.free; + end; + end; + finally + prep.free; + end; + finally + fcl.free; + end; + end; + finally + cs.free; + end; + finally + filters.free; + end; + end; + finally + valueSets.free; + end; end; -procedure TFHIRExpansionParams.SetIncludeDesignations(value : boolean); +function TFHIRValueSetExpander.includeCodeAndDescendants(cs: TCodeSystemProvider; context: TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; parent : TFhirValueSetExpansionContainsW; excludeInactive : boolean; srcUrl : String) : integer; +var + i : integer; + vs, code : String; + cds : TConceptDesignations; + iter : TCodeSystemIteratorContext; + n, t : TFhirValueSetExpansionContainsW; + ts : TStringList; + c : TCodeSystemProviderContext; begin - FIncludeDesignations := value; - FHasIncludeDesignations := true; + result := 0; + deadCheck('processCodeAndDescendants'); + if (expansion <> nil) then + begin + vs := canonical(cs.systemUri, cs.version); + if not expansion.hasParam('used-codesystem', vs) then + expansion.addParamUri('used-codesystem', vs); + if not expansion.hasParam('version', vs) then + expansion.addParamUri('version', vs); + ts := TStringList.create; + try + cs.listSupplements(ts); + for vs in ts do + begin + deadCheck('processCodeAndDescendants'); + if not expansion.hasParam('used-supplement', vs) then + expansion.addParamUri('used-supplement', vs); + if not expansion.hasParam('version', vs) then + expansion.addParamUri('version', vs); + end; + finally + ts.free; + end; + end; + n := nil; + if (not FParams.excludeNotForUI or not cs.IsAbstract(context)) and (not FParams.activeOnly or not cs.isInActive(context)) then + begin + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + listDisplays(cds, cs, context); + for code in cs.listCodes(context, FParams.altCodeRules) do + begin + deadCheck('processCodeAndDescendants#2'); + t := includeCode(cs, parent, cs.systemUri, cs.version, code, cs.isAbstract(context), cs.IsInactive(context), cs.deprecated(context), cds, cs.definition(context), + cs.itemWeight(context), expansion, imports, cs.getExtensions(context), nil, cs.getProperties(context), nil, excludeInactive, srcUrl); + if (t <> nil) then + inc(result); + if (n = nil) then + n := t; + end; + finally + cds.free; + end; + end + else + n := parent; + iter := cs.getIterator(context); + try + while iter.more do + begin + deadCheck('processCodeAndDescendants#3'); + c := cs.getNextContext(iter); + try + inc(result, includeCodeAndDescendants(cs, c, expansion, imports, n, excludeInactive, srcUrl)); + finally + c.free; + end; + end; + finally + iter.free; + end; end; -procedure TFHIRExpansionParams.SetIncludeDefinition(value : boolean); +procedure TFHIRValueSetExpander.excludeCodeAndDescendants(cs: TCodeSystemProvider; context: TCodeSystemProviderContext; expansion : TFhirValueSetExpansionW; imports : TFslList; excludeInactive : boolean; srcUrl : String); +var + i : integer; + vs, code : String; + cds : TConceptDesignations; + iter : TCodeSystemIteratorContext; + ts : TStringList; + c : TCodeSystemProviderContext; begin - FIncludeDefinition := value; - FHasIncludeDefinition := true; + deadCheck('processCodeAndDescendants'); + if (expansion <> nil) then + begin + vs := canonical(cs.systemUri, cs.version); + if not expansion.hasParam('used-codesystem', vs) then + expansion.addParamUri('used-codesystem', vs); + if not expansion.hasParam('version', vs) then + expansion.addParamUri('version', vs); + ts := TStringList.create; + try + cs.listSupplements(ts); + for vs in ts do + begin + deadCheck('processCodeAndDescendants'); + if not expansion.hasParam('used-supplement', vs) then + expansion.addParamUri('used-supplement', vs); + if not expansion.hasParam('version', vs) then + expansion.addParamUri('version', vs); + end; + finally + ts.free; + end; + end; + if (not FParams.excludeNotForUI or not cs.IsAbstract(context)) and (not FParams.activeOnly or not cs.isInActive(context)) then + begin + cds := TConceptDesignations.Create(FFactory.link, FLanguages.link); + try + listDisplays(cds, cs, context); + for code in cs.listCodes(context, FParams.altCodeRules) do + begin + deadCheck('processCodeAndDescendants#2'); + excludeCode(cs, cs.systemUri, cs.version, code, expansion, imports, srcUrl); + end; + finally + cds.free; + end; + end; + iter := cs.getIterator(context); + try + while iter.more do + begin + deadCheck('processCodeAndDescendants#3'); + c := cs.getNextContext(iter); + try + excludeCodeAndDescendants(cs, c, expansion, imports, excludeInactive, srcUrl); + finally + c.free; + end; + end; + finally + iter.free; + end; end; -procedure TFHIRExpansionParams.SetDefaultToLatestVersion(value : boolean); -begin - FDefaultToLatestVersion := value; - FHasDefaultToLatestVersion := true; -end; +{ TFHIRConceptMapTranslator } -procedure TFHIRExpansionParams.SetIncompleteOK(value : boolean); +function TFHIRConceptMapTranslator.checkCode(op: TFhirOperationOutcomeW; langList: THTTPLanguageList; path: string; code: string; system, version: string; display: string): boolean; +var + cs : TFhirCodeSystemW; + cp : TCodeSystemProvider; + lct : TCodeSystemProviderContext; + def : TFhirCodeSystemConceptW; + d : String; begin - FIncompleteOK := value; - FHasIncompleteOK := true; + result := false; + cp := findCodeSystem(system, version, nil, [cscmComplete, cscmFragment], true); + if cp <> nil then + begin + try + lct := cp.locate(code); + try + if (op.error('InstanceValidator', itInvalid, path, lct <> nil, 'Unknown Code ('+system+'#'+code+')')) then + result := op.warning('InstanceValidator', itInvalid, path, (display = '') or (display = cp.Display(lct, THTTPLanguageList(nil))), + 'Display for '+system+' code "'+code+'" should be "'+cp.Display(lct, THTTPLanguageList(nil))+'"'); + finally + lct.free; + end; + finally + cp.free; + end; + end; end; -procedure TFHIRExpansionParams.SetDisplayWarning(value : boolean); +constructor TFHIRConceptMapTranslator.Create(factory: TFHIRFactory; opContext: TTerminologyOperationContext; getVS: TGetValueSetEvent; getCS: TGetProviderEvent; getVersions: TGetSystemVersionsEvent; getExpansion: TGetExpansionEvent; txResources: TFslMetadataResourceList; languages: TIETFLanguageDefinitions; i18n: TI18nSupport); begin - FDisplayWarning := value; - FHasDisplayWarning := true; + inherited create(factory, opContext, getVS, getCS, getVersions, getExpansion, txResources, languages, i18n); end; -procedure TFHIRExpansionParams.SetMembershipOnly(value : boolean); +destructor TFHIRConceptMapTranslator.Destroy; begin - FMembershipOnly := value; - FHasMembershipOnly := true; + inherited Destroy; end; -function TFHIRExpansionParams.sizeInBytesV(magic : integer) : cardinal; +function TFHIRConceptMapTranslator.translate(langList: THTTPLanguageList; reqId : String; cml : TFslList; coding: TFHIRCodingW; params: TFhirParametersW; profile: TFhirTxOperationParams): TFhirParametersW; +var + cm : TFHIRConceptMapW; + g : TFhirConceptMapGroupW; + em : TFhirConceptMapGroupElementW; + map : TFhirConceptMapGroupElementTargetW; + outcome : TFHIRCodingW; + p, pp : TFhirParametersParameterW; + prod : TFhirConceptMapGroupElementDependsOnW; + added : boolean; + msg : String; begin - result := inherited sizeInBytesV(magic); - inc(result, FVersionRules.sizeInBytes(magic)); - inc(result, FLanguages.sizeInBytes(magic)); - inc(result, (FUid.length * sizeof(char)) + 12); + result := FFactory.wrapParams(FFactory.makeResource('Parameters')); + try + try + added := false; + for cm in cml do + begin + //else if not checkCode(op, langList, '', coding.code, coding.systemUri, coding.version, coding.display) then + // raise ETerminologyError.Create('Code '+coding.code+' in system '+coding.systemUri+' not recognized', itUnknown); + if isOkSource(cm, coding, g, em) then + begin + try + for map in em.targets.forEnum do + begin + if (map.equivalence in [cmeNull, cmeEquivalent, cmeEqual, cmeWider, cmeSubsumes, cmeNarrower, cmeSpecializes, cmeInexact]) then + begin + result.AddParamBool('result', true); + added := true; + outcome := FFactory.wrapCoding(FFactory.makeByName('Coding')); + try + p := result.AddParam('match'); + outcome.systemUri := g.target; + outcome.code := map.code; + p.AddParam('concept', outcome.Element.Link); + p.addParamCode('equivalence', CODES_TFHIRConceptEquivalence[map.equivalence]); + if (map.comments <> '') then + p.addParamStr('message', map.comments); + for prod in map.products.forEnum do + begin + pp := p.addParam('product'); + pp.addParamStr('element', prod.property_); + pp.addParam('concept').value := FFactory.makeCoding(prod.system_, prod.value); + end; + finally + outcome.free; + end; + end; + end; + finally + em.free; + g.free; + end; + end; + end; + if not added then + begin + result.AddParamBool('result', false); + result.AddParamStr('message', 'No translations found'); + end; + except + on e : exception do + begin + result.AddParamBool('result', false); + result.AddParamStr('message', e.message); + end; + end; + result.link; + finally + result.free; + end; end; -class function TFHIRExpansionParams.defaultProfile: TFHIRExpansionParams; +function TFHIRConceptMapTranslator.isOkTarget(cm: TFhirConceptMapW; + vs: TFhirValueSetW): boolean; begin - result := TFHIRExpansionParams.Create; + //if cm.Target <> nil then + // result := cm.Target.url = vs.url + //else + result := false; + // todo: or it might be ok to use this value set if it's a subset of the specified one? end; -procedure TFHIRExpansionParams.seeParameter(name: String; value: TFHIRObject; isValidation, overwrite: boolean); +function TFHIRConceptMapTranslator.isOkSource(cm: TFhirConceptMapW; + vs: TFhirValueSetW; coding: TFHIRCodingW; out group: TFhirConceptMapGroupW; + out match: TFhirConceptMapGroupElementW): boolean; +var + g : TFhirConceptMapGroupW; + em : TFhirConceptMapGroupElementW; begin - if (value <> nil) then + result := false; + if true {(vs = nil) or ((cm.source <> nil) and (cm.Source.url = vs.url))} then begin - if (name = 'displayLanguage') and (not HasLanguages or overwrite) then - languages := THTTPLanguageList.create(value.primitiveValue, not isValidation); - - if (name = 'includeAlternateCodes') then - altCodeRules.seeParam(value.primitiveValue); - if (name = 'designation') then - designations.add(value.primitiveValue); + for g in cm.groups.forEnum do + for em in g.elements.forEnum do + if (g.source = coding.systemUri) and (em.code = coding.code) then + begin + result := true; + match := em.link; + group := g.link; + end; end; end; -function TFHIRExpansionParams.getVersionForRule(systemURI: String; mode: TFhirExpansionParamsVersionRuleMode): String; + +function TFHIRConceptMapTranslator.isOkSource(cm: TFhirConceptMapW; + coding: TFHIRCodingW; out group: TFhirConceptMapGroupW; out + match: TFhirConceptMapGroupElementW): boolean; var - rule : TFhirExpansionParamsVersionRule; + g : TFhirConceptMapGroupW; + em : TFhirConceptMapGroupElementW; begin - for rule in FVersionRules do - if (rule.system = systemUri) and (rule.mode = mode) then - exit(rule.version); - result := ''; -end; - -procedure TFHIRExpansionParams.seeVersionRule(url: String; mode: TFhirExpansionParamsVersionRuleMode); -var - sl : TArray; -begin - sl := url.split(['|']); - if (Length(sl) = 2) then - versionRules.Add(TFhirExpansionParamsVersionRule.Create(sl[0], sl[1], mode)) - else - raise ETerminologyError.Create('Unable to understand '+CODES_TFhirExpansionParamsVersionRuleMode[mode]+' system version "'+url+'"', itInvalid); + result := false; + for g in cm.groups.forEnum do + if (g.source = coding.systemUri) then + begin + for em in g.elements.forEnum do + if (em.code = coding.code) then + begin + result := true; + match := em.link; + group := g.link; + end; + end; end; -function TFHIRExpansionParams.langSummary: String; +function TFHIRConceptMapTranslator.findConceptMap(var cm: TFhirConceptMapW; var msg: String): boolean; begin - if (FLanguages = nil) or (FLanguages.source = '') then - result := '--' + msg := ''; + if cm <> nil then + result := true else - result := FLanguages.asString(false); -end; - -destructor TFHIRExpansionParams.Destroy; -begin - FAltCodeRules.free; - FVersionRules.free; - FLanguages.free; - FProperties.free; - FDesignations.free; - inherited; -end; - -function TFHIRExpansionParams.hash: String; -var - s : String; - l : TIETFLang; - t : TFhirExpansionParamsVersionRule; - function b(v : boolean):string; begin - if v then - result := '1|' - else - result := '0|'; - end; -begin - s := FUid+'|'+ b(FMembershipOnly) + '|' + FProperties.CommaText+'|'+ - b(FactiveOnly)+b(FIncompleteOK)+b(FDisplayWarning)+b(FexcludeNested)+b(FGenerateNarrative)+b(FlimitedExpansion)+b(FexcludeNotForUI)+b(FexcludePostCoordinated)+ - b(FincludeDesignations)+b(FincludeDefinition)+b(FHasactiveOnly)+b(FHasExcludeNested)+b(FHasGenerateNarrative)+ - b(FHasLimitedExpansion)+b(FHesExcludeNotForUI)+b(FHasExcludePostCoordinated)+b(FHasIncludeDesignations)+ - b(FHasIncludeDefinition)+b(FHasDefaultToLatestVersion)+b(FHasIncompleteOK)+b(FHasDisplayWarning)+b(FHasexcludeNotForUI)+b(FHasMembershipOnly)+b(FDefaultToLatestVersion); - - if hasLanguages then - s := s + FLanguages.AsString(true)+'|'; - if hasDesignations then - s := s + FDesignations.commaText+'|'; - for t in FVersionRules do - s := s + t.asString+'|'; - result := inttostr(HashStringToCode32(s)); -end; - -function TFHIRExpansionParams.link: TFHIRExpansionParams; -begin - result := TFHIRExpansionParams(inherited Link); -end; - - -{ TFhirExpansionParamsVersionRule } - -constructor TFhirExpansionParamsVersionRule.Create(system, version: String; mode: TFhirExpansionParamsVersionRuleMode); -begin - inherited Create; - FSystem := system; - FVersion := version; - FMode := mode; -end; - -function TFhirExpansionParamsVersionRule.asString: String; -begin - result := Fsystem+'#'+Fversion+'/'+inttostr(ord(FMode)); -end; -constructor TFhirExpansionParamsVersionRule.Create(system, version: String); -begin - inherited Create; - FSystem := system; - FVersion := version; + end; end; -function TFhirExpansionParamsVersionRule.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, (Fsystem.length * sizeof(char)) + 12); - inc(result, (Fversion.length * sizeof(char)) + 12); -end; +//function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; +//var +// op : TFhirOperationOutcomeW; +// list : TLoadedConceptMapList; +// i : integer; +// summary : string; +// cm : TLoadedConceptMap; +// p : TFhirParametersW; +// g : TFhirConceptMapGroupW; +// em : TFhirConceptMapGroupElementW; +// map : TFhirConceptMapGroupElementTargetW; +// outcome : TFHIRCodingW; +//begin +// op := Factory.wrapOperationOutcome(factory.makeResource('OperationOutcome')); +// try +// try +// if not checkCode(op, langList, '', coding.code, coding.systemUri, coding.version, coding.display) then +// raise ETerminologyError.Create('Code '+coding.code+' in system '+coding.systemUri+' not recognized', itUnknown); +// +// // check to see whether the coding is already in the target value set, and if so, just return it +// p := validate('', target, coding, nil, false, false, nil, summary); +// try +// if p.bool('result') then +// begin +// result := Factory.wrapParams(factory.makeResource('Parameters')); +// result.addParamBool('result', true); +// result.addParam('outcome', coding.Link); +// result.addParamCode('equivalence', 'equal'); +// exit; +// end; +// finally +// p.free; +// end; +// +// result := Factory.wrapParams(factory.makeResource('Parameters')); +// list := GetConceptMapList; +// try +// for i := 0 to list.Count - 1 do +// begin +// cm := list[i]; +// if isOkTarget(cm, target) and isOkSource(cm, source, coding, g, em) then +// try +// if em.targetCount = 0 then +// raise ETerminologyError.Create('Concept Map has an element with no map for '+'Code '+coding.code+' in system '+coding.systemUri, itInvalid); +// for map in em.targets.forEnum do +// begin +// if (map.equivalence in [cmeEquivalent, cmeEqual, cmeWider, cmeSubsumes, cmeNarrower, cmeSpecializes, cmeInexact]) then +// begin +// result.addParamBool('result', true); +// outcome := factory.wrapCoding(factory.makeByName('Coding')); +// result.AddParam('outcome', outcome); +// outcome.systemUri := g.target; +// outcome.code := map.code; +// result.addParamCode('equivalence', CODES_TFHIRConceptEquivalence[map.equivalence]); +// if (map.comments <> '') then +// result.addParamStr('message', map.comments); +// break; +// end +// end; +// exit; +// finally +// em.free; +// g.free; +// end; +// end; +// finally +// list.free; +// end; +// +// result.AddParamBool('result', false); +// result.AddParamStr('message', 'no match found'); +// except +// on e : exception do +// begin +// result := Factory.wrapParams(factory.makeResource('Parameters')); +// result.AddParamBool('result', false); +// result.AddParamStr('message', e.message); +// end; +// end; +// finally +// op.free; +// end; +//end; +// +//function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; +//var +// c : TFhirCodingW; +//begin +// for c in coded.codings.forEnum do +// exit(translate(langList, source, c, target, params, txResources, profile)); +// raise ETerminologyTodo.Create('TTerminologyServer.translate'); +//end; +// { TFHIRImportedValueSet } diff --git a/library/ftx/ftx_lang.pas b/library/ftx/ftx_lang.pas index 75aa7fca9..ac5864497 100644 --- a/library/ftx/ftx_lang.pas +++ b/library/ftx/ftx_lang.pas @@ -79,8 +79,8 @@ TIETFLanguageCodeServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; @@ -98,7 +98,8 @@ TIETFLanguageCodeServices = class (TCodeSystemProvider) function searchFilter(filter : TSearchFilterText; prep : TCodeSystemProviderFilterPreparationContext; sort : boolean) : TCodeSystemProviderFilterContext; override; function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; - function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -119,7 +120,7 @@ procedure TIETFLanguageCodeServices.defineFeatures(features: TFslList nil then - begin + l := FLanguages.parse(code, message); + if (l <> nil) then + begin + try + filter := TIETFLanguageCodeFilter(ctxt); case filter.component of - languageComponentLang: ok := filter.status = (cc.FInfo.language <> ''); - languageComponentExtLang: ok := filter.status = (length(cc.FInfo.extLang) > 0); - languageComponentScript: ok := filter.status = (cc.FInfo.script <> ''); - languageComponentRegion: ok := filter.status = (cc.FInfo.region <> ''); - languageComponentVariant: ok := filter.status = (cc.FInfo.variant <> ''); - languageComponentExtension: ok := filter.status = (cc.FInfo.extension <> ''); - languageComponentPrivateUse: ok := filter.status = (length(cc.FInfo.privateUse) > 0); + languageComponentLang: ok := filter.status = (l.language <> ''); + languageComponentExtLang: ok := filter.status = (length(l.extLang) > 0); + languageComponentScript: ok := filter.status = (l.script <> ''); + languageComponentRegion: ok := filter.status = (l.region <> ''); + languageComponentVariant: ok := filter.status = (l.variant <> ''); + languageComponentExtension: ok := filter.status = (l.extension <> ''); + languageComponentPrivateUse: ok := filter.status = (length(l.privateUse) > 0); + else + ok := false; end; + if ok then + result := TIETFLanguageCodeConcept.Create(l.link) + else if filter.status then + message := 'The language code '+code+' does not contain a '+CODES_TIETFLanguageComponent[filter.component]+', and it is required to' + else + message := 'The language code '+code+' contains a '+CODES_TIETFLanguageComponent[filter.component]+', and it is not allowed to'; + finally + l.free; end; - if ok then - result := cc.Link - else if filter.status then - message := 'The language code '+code+' does not contain a '+CODES_TIETFLanguageComponent[filter.component]+', and it is required to' - else - message := 'The language code '+code+' contains a '+CODES_TIETFLanguageComponent[filter.component]+', and it is not allowed to'; - finally - cc.free; end; end; @@ -322,6 +337,11 @@ function TIETFLanguageCodeServices.FilterMore(ctxt : TCodeSystemProviderFilterCo raise ETerminologyError.create('Language valuesets cannot be expanded as they are based on a grammar', itNotSupported); end; +function TIETFLanguageCodeServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyError.create('Language valuesets cannot be expanded as they are based on a grammar', itNotSupported); +end; + function TIETFLanguageCodeServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin raise ETerminologyTodo.create('TIETFLanguageCodeServices.FilterConcept'); diff --git a/library/ftx/ftx_loinc_importer.pas b/library/ftx/ftx_loinc_importer.pas index 559208402..33763e5e2 100644 --- a/library/ftx/ftx_loinc_importer.pas +++ b/library/ftx/ftx_loinc_importer.pas @@ -33,207 +33,44 @@ Interface Uses - SysUtils, Contnrs, Classes, + SysUtils, Contnrs, Classes, Generics.Collections, fsl_base, fsl_utilities, fsl_collections, fsl_stream, fsl_fpc, + fdb_manager, fdb_sqlite3, ftx_loinc_services, ftx_service; -Const - FLAG_LONG_COMMON = 1; - FLAG_LONG_RELATED = 2; - STEP_COUNT = 100; - ESTIMATED_CONCEPTS = 100000; - ESTIMATED_HEIRACHY = 100000; - ESTIMATED_ANSWERS = 50000; +type -Type - TLOINCImporter = class; - - THeirarchyEntry = class; - THeirarchyEntryList = class; - TCodeList = class; - - TConcept = class (TFslName) - private - Index : Cardinal; - Codes : TObjectList; - Flang : integer; - public - constructor Create(lang : byte); - destructor Destroy; Override; - End; - - TConceptArray = Array of TConcept; - - TConceptManager = class (TFslMap) - public - Function See(lang: byte; sName : String; oCode : TObject) : TConcept; - Function Store(langCount, lang: byte; sName : String; oImp : TLOINCImporter) : Cardinal; - End; - - TDescribed = class (TFslObject) + { TCodeInformation } + TCodeInformation = class (TFslObject) private - index : Cardinal; - Stems : TFslIntegerList; + FKey : integer; + FChildren : TKeySet; public - constructor Create; Override; - destructor Destroy; Override; + constructor create; override; + destructor destroy; override; + function link : TCodeInformation; overload; end; - { THeirarchyEntry } - - THeirarchyEntry = class (TDescribed) - private - FCode : String; - FText : String; - FParents : THeirarchyEntryList; - FChildren : THeirarchyEntryList; - FConcepts : TCodeList; - FDescendentConcepts : TCodeList; - public - constructor Create; Override; - destructor Destroy; Override; - function link : THeirarchyEntry; - End; + { TCodeMap } - THeirarchyEntryList = class (TFslObjectList) - private - function GetEntry(iIndex: Integer): THeirarchyEntry; - protected - Function ItemClass : TFslObjectClass; Override; - Function CompareByCode(pA, pB: Pointer): Integer; Virtual; - Function CompareByText(pA, pB: Pointer): Integer; Virtual; - Function FindByCode(entry : THeirarchyEntry; Out iIndex: Integer): Boolean; Overload; - Function FindByText(entry : THeirarchyEntry; Out iIndex: Integer): Boolean; Overload; + TCodeMap = class (TFslMap) public - Procedure SortedByCode; - Procedure SortedByText; - - Function getByCode(code : String) : THeirarchyEntry; - Function FindByCode(code: String; Out iIndex: Integer): Boolean; Overload; - Function getByText(text : String) : THeirarchyEntry; - Function FindByText(text: String; Out iIndex: Integer): Boolean; Overload; - - Property Entries[iIndex : Integer] : THeirarchyEntry Read GetEntry; Default; + function addCode(code : String; key : integer; codeList : TFslList) : TCodeInformation; + function getCode(code : String) : TCodeInformation; end; - { TCode } - - TCode = class (TDescribed) - Private - Code : String; - Display : String; - QuestionText : String; - Names : Cardinal; - Comps : TConceptArray; - Props : TConceptArray; - Time : TConceptArray; - System : TConceptArray; - Scale : TConceptArray; - Method : TConceptArray; - Class_ : TConceptArray; - Flags : byte; - entries : TFslList; - public - constructor Create(langCount : integer); - destructor Destroy; override; - Function Compare(pA, pB : Pointer) : Integer; - End; - - TCodeList = class (TFslObjectList) + { TKeyMap } + TKeyMap = class (TDictionary) private - function GetEntry(iIndex: Integer): TCode; - protected - Function ItemClass : TFslObjectClass; Override; - Function CompareByCode(pA, pB: Pointer): Integer; Virtual; - Function FindByCode(entry : TCode; Out iIndex: Integer): Boolean; Overload; + FName : String; public - Procedure SortedByCode; - - Function getByCode(code : String) : TCode; - Function FindByCode(code: String; Out iIndex: Integer): Boolean; Overload; + constructor Create(name : String); - Property Entries[iIndex : Integer] : TCode Read GetEntry; Default; + procedure addKey(code : String; key : integer); + function getKey(code : String) : integer; end; - TAnswerList = class; - - TAnswer = class (TFslObject) - private - FCode: String; - FDescription: String; - FParents: TFslList; - FIndex : integer; - public - constructor Create; override; - destructor Destroy; override; - Property Code : String read FCode write FCode; - Property Description : String read FDescription write FDescription; - Property Index : Integer read FIndex write FIndex; - Property Parents : TFslList read FParents; - end; - - TAnswerList = class (TFslObject) - private - FCode: String; - FDescription: String; - FAnswers : TFslList; - FIndex : integer; - public - constructor Create; Override; - destructor Destroy; Override; - - Property Code : String read FCode write FCode; - Property Description : String read FDescription write FDescription; - Property Answers : TFslList read FAnswers; - end; - - TLoincLanguageCodes = class (TFslObject) - private - FComponent : String; - FProperty : String; - FTimeAspect : String; - FSystem : String; - FScale : String; - FMethod : String; - FClass : String; - FShortname : String; - FLongName : String; - FRelatedNames : TStringList; - public - constructor Create; Override; - destructor Destroy; Override; - Function link : TLoincLanguageCodes; overload; - - function Display : String; - - property Component : String read FComponent write FComponent; - property Prop : String read FProperty write FProperty; - property TimeAspect : String read FTimeAspect write FTimeAspect; - property System : String read FSystem write FSystem; - property Scale : String read FScale write FScale; - property Method : String read FMethod write FMethod; - property Clss : String read FClass write FClass; - property Shortname : String read FShortname write FShortname; - property LongName : String read FLongName write FLongName; - property RelatedNames : TStringList read FRelatedNames; - end; - - TLoincLanguage = class (TFslObject) - private - FLang : String; - FCountry : String; - FCodes : TFslMap; - public - constructor Create; overload; Override; - constructor Create(lang, country : String); overload; - destructor Destroy; Override; - Function link : TLoincLanguage; overload; - - Property Lang : String read FLang write FLang; - Property Country : String read FCountry write FCountry; - Property Codes : TFslMap read FCodes; - end; { TLoincImporter } @@ -245,43 +82,55 @@ TLoincImporter = class (TFslObject) FFolder : String; TotalConcepts : Integer; - FDesc : TLoincStrings; - FCode : TLOINCCodeList; - FRefs : TLOINCReferences; - FConcepts : TLOINCConcepts; - FWords : TLoincWords; - FStems : TLoincStems; - FEntries : TLOINCHeirarchyEntryList; - FAnswerLists : TFslMap; - FAnswerMap : TFslMap; - FAnswers : TLOINCAnswersList; - FLanguages : TFslList; - FLangs : TLoincLanguages; - - FStrings : TStringList; - FVersion: String; - FWordList : TStringList; - FStemList : TStringList; - FStemmer : TFslWordStemmer; FOutputFile: String; FDate: String; + FVersion: String; + + FStepCount : Integer; + FLangKey : integer; + FCodeKey : integer; + FRelKey : integer; + FDescKey : integer; + FPropKey : integer; + FPropValueKey : integer; + FPropValues : TDictionary; + + // working items + conn, dbCodes, dbRels, dbDesc, dbProps, dbText: TFDBConnection; + codes : TCodeMap; + codeList : TFslList; + rels, langs, statii, dTypes, props : TKeyMap; + partNames : TDictionary; - procedure AddToDescendentConcepts(oHeirarchy: THeirarchyEntryList; entry: TCode; path: String); - procedure SeeDesc(sDesc: String; oObj : TDescribed; iFlags: Byte); - procedure SeeWord(sDesc: String; oObj : TDescribed; iFlags: Byte); - function listConcepts(arr : TConceptArray) : TCardinalArray; - procedure registerParents(oHeirarchy : THeirarchyEntryList; entry : THeirarchyEntry; path : String); - - Function AddDescription(lang : byte; s : String):Cardinal; - procedure readLanguage(i : integer; index : String; lang : TLoincLanguage); - procedure ReadLanguageVariants(); - function LoadLOINCFiles(folder : String; out props : TLoincPropertyIds; out roots : TCardinalArray; out subsets : TLoincSubsets) : Cardinal; - function ReadLOINCDatabase(out props : TLoincPropertyIds; out roots : TCardinalArray; out subsets : TLoincSubsets) : Cardinal; - procedure ProcessMultiAxialEntry(oHeirarchy : THeirarchyEntryList; oCodes : TCodeList; ln : string); - procedure ProcessAnswerLine(oHeirarchy : THeirarchyEntryList; oCodes : TCodeList; ln : string); - procedure StoreHeirarchyEntry(entry : THeirarchyEntry); procedure Progress(Step : integer; pct : real; msg : String); + function pv(value : String) : integer; + + procedure CreateTables(step : integer); + procedure ProcessDescription(codeKey, languageKey, descriptionType : integer; value : String); + procedure ProcessProperty(codeKey, propertyType : integer; value : String); + procedure ProcessParts(step : integer); + procedure ProcessPartItems(items : TStringArray); + procedure ProcessCodes(step : integer); + procedure ProcessCodeItems(items : TStringArray); + procedure ProcessConsumerNames(step : integer); + procedure ProcessConsumerNameItems(items : TStringArray); + procedure ProcessLists(step : integer); + procedure ProcessListItems(items : TStringArray; var list : String); + procedure ProcessPartLinks(step : integer); + procedure ProcessPartLinkItems(items : TStringArray); + procedure ProcessListLinks(step : integer); + procedure ProcessListLinkItems(items : TStringArray); + procedure ProcessLanguageVariants(step : integer; list : TStringList); + procedure ProcessLanguageVariantsItems(items : TStringArray; list : TStringList); + procedure ProcessLanguage(step : integer; code : String); + procedure ProcessLanguageItems(code : String; lk : integer; items : TStringArray); + procedure ProcessPropertyValues(step: integer); + procedure ProcessHierarchy(step: integer); + procedure ProcessHierarchyItems(items : TStringArray); + procedure StoreClosureTable(step: integer); public + constructor Create; overload; + destructor Destroy; overload; procedure ImportLOINC; Property Folder : String read FFolder write FFolder; @@ -294,34 +143,26 @@ function importLoinc(folder, version, date, dest : String; callback : TInstaller Implementation -Function DetermineVersion(filename : String) : String; -var - txtFile : String; - f : TFileStream; - txt : AnsiString; - s, t : String; -begin - txtFile := ChangeFileExt(filename, '.txt'); - if not FileExists(txtFile) then - raise ETerminologySetup.create('Unable to find the file '+txtFile+' so the version can be determined'); - f := TFileStream.Create(txtFile, fmOpenRead + fmShareDenyWrite); - try - setLength(txt, f.Size); - f.Read(txt[1], f.Size); - finally - f.free; - end; - t := String(txt); - StringSplit(t, [#13], s, t); - result := copy(s, length(s)-3, 4); - if not (StringIsInteger16(copy(result, 1, 1)) and (result[2] = '.') and StringIsInteger16(copy(result, 3, 2))) then - raise ETerminologySetup.create('Unable to read the version from '+txtFile); -end; + +const + KNOWN_PROPERTY_NAMES : array of String = ['AskAtOrderEntry', 'AssociatedObservations', 'CHANGE_REASON_PUBLIC', 'CHNG_TYPE', 'CLASS', 'CLASSTYPE', 'COMMON_ORDER_RANK', 'COMMON_TEST_RANK', 'COMPONENT', 'CONSUMER_NAME', + 'DefinitionDescription', 'DisplayName', 'EXAMPLE_UCUM_UNITS', 'EXAMPLE_UNITS', 'EXMPL_ANSWERS', 'EXTERNAL_COPYRIGHT_LINK', 'EXTERNAL_COPYRIGHT_NOTICE', 'FORMULA', + 'HL7_ATTACHMENT_STRUCTURE', 'HL7_FIELD_SUBFIELD_ID', 'LONG_COMMON_NAME', 'MAP_TO', 'METHOD_TYP', 'ORDER_OBS', 'PROPERTY', 'PanelType', 'RELATEDNAMES2', 'SCALE_TYP', + 'SHORTNAME', 'STATUS', 'STATUS_REASON', 'STATUS_TEXT', 'SURVEY_QUEST_SRC', 'SURVEY_QUEST_TEXT', 'SYSTEM', 'TIME_ASPCT', 'UNITSREQUIRED', 'ValidHL7AttachmentRequest', + 'VersionFirstReleased', 'VersionLastChanged', 'adjustment', 'analyte', 'analyte-core', 'analyte-divisor', 'analyte-divisor-suffix', 'analyte-gene', 'analyte-numerator', + 'analyte-suffix', 'answer-list', 'answers-for', 'category', 'challenge', 'child', 'count', 'document-kind', 'document-role', 'document-setting', 'document-subject-matter-domain', + 'document-type-of-service', 'parent', 'rad-anatomic-location-imaging-focus', 'rad-anatomic-location-laterality', 'rad-anatomic-location-laterality-presence', 'rad-anatomic-location-region-imaged', + 'rad-guidance-for-action', 'rad-guidance-for-approach', 'rad-guidance-for-object', 'rad-guidance-for-presence', 'rad-maneuver-maneuver-type', 'rad-modality-modality-subtype', + 'rad-modality-modality-type', 'rad-pharmaceutical-route', 'rad-pharmaceutical-substance-given', 'rad-reason-for-exam', 'rad-subject', 'rad-timing', 'rad-view-aggregation', + 'rad-view-view-type', 'search', 'super-system', 'system-core', 'time-core', 'time-modifier', + 'Answer', 'AnswerList']; function importLoinc(folder, version, date, dest : String; callback : TInstallerCallback = nil) : String; var imp : TLoincImporter; begin + if FileExists(dest) then + DeleteFile(dest); imp := TLoincImporter.Create; try imp.callback := callback; @@ -337,990 +178,109 @@ function importLoinc(folder, version, date, dest : String; callback : TInstaller end; end; - - -function TCode.Compare(pA, pB: Pointer): Integer; -begin - result := CompareStr(TCode(pA).Code, TCode(pB).Code); -End; - -Function MakeSafeFileName(sName : String; newkey : Integer):String; -var - i : integer; -Begin - result := ''; - for i := 1 to length(sName) Do - if CharInSet(sName[i], ['a'..'z', '_', '-', 'A'..'Z', '0'..'9']) Then - result := result + sName[i]; - if result = '' then - result := inttostr(newkey); -End; - -procedure TLoincImporter.SeeDesc(sDesc: String; oObj : TDescribed; iFlags: Byte); -var - s : String; +constructor TLoincImporter.Create; begin - while (sDesc <> '') Do - Begin - StringSplit(sdesc, [#13, #10, ',', ' ', ':', '.', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', '|', '\', ';', '"', '<', '>', '?', '/', '~', '`', '-', '_', '+', '='], - s, sdesc); - if (s <> '') {And not StringContainsAny(s, ['0'..'9']) And (length(s) > 3)} Then - SeeWord(s, oObj, iFlags); - End; + inherited create; + FPropValues := TDictionary.create; + partNames := TDictionary.create; + codes := TCodeMap.create; + statii := TKeyMap.create('Status'); + langs := TKeyMap.create('Language'); + rels := TKeyMap.create('Relationship'); + dTypes := TKeyMap.create('DescriptionType'); + props := TKeyMap.create('PropertyType'); + codeList := TFslList.create; + + FStepCount := 30; end; -procedure TLoincImporter.SeeWord(sDesc: String; oObj : TDescribed; iFlags: Byte); -var - i, m : integer; - sStem : String; - oList : TFslObjectList; -begin - sDesc := lowercase(sdesc); - if not FWordList.Find(sDesc, i) Then - i := FWordList.Add(sdesc); - m := integer(FWordList.Objects[i]); - case iFlags of - FLAG_LONG_COMMON : m := m or $1; - FLAG_LONG_RELATED : m := m or $2; - End; - - FWordList.Objects[i] := TObject(m); - - sStem := FStemmer.Stem(sDesc); - if not FStemList.Find(sStem, i) Then - Begin - oList := TFslObjectList.Create; - oList.SortedByReference; - FStemList.AddObject(sStem, oList); - End - Else - oList := TFslObjectList(FStemList.Objects[i]); - if not oList.ExistsByReference(oObj) Then - oList.Add(oObj.Link); -End; - - -procedure TLoincImporter.StoreHeirarchyEntry(entry: THeirarchyEntry); -var - parents, children, concepts, descendentConcepts: Cardinal; - refs : TCardinalArray; - i : integer; +destructor TLoincImporter.Destroy; begin - setLength(refs, entry.FChildren.Count); - for i := 0 to entry.FChildren.Count - 1 do - refs[i] := entry.FChildren[i].index; - children := FRefs.AddRefs(refs); - - setLength(refs, entry.FConcepts.Count); - entry.FConcepts.SortedByCode; - for i := 0 to entry.FConcepts.Count - 1 do - refs[i] := TCode(entry.FConcepts[i]).index; - concepts := FRefs.AddRefs(refs); - - setLength(refs, entry.FDescendentConcepts.Count); - entry.FDescendentConcepts.SortedByCode; - for i := 0 to entry.FDescendentConcepts.Count - 1 do - refs[i] := TCode(entry.FDescendentConcepts[i]).index; - descendentConcepts := FRefs.AddRefs(refs); - - setLength(refs, entry.FParents.Count); - for i := 0 to entry.FParents.Count - 1 do - refs[i] := entry.FParents[i].index; - parents := FRefs.AddRefs(refs); - - if FEntries.AddEntry(AddDescription(0, entry.FCode), AddDescription(0, entry.FText), parents, children, concepts, descendentConcepts) <> entry.index then - raise ETerminologySetup.create('Out of order'); + FPropValues.free; + codeList.free; + codes.free; + statii.free; + langs.free; + rels.free; + dTypes.free; + props.free; + partNames.free; + inherited; end; -Const - FLD_LOINC_NUM = 0; - FLD_COMPONENT = FLD_LOINC_NUM + 1; - FLD_PROPERTY = FLD_COMPONENT + 1; - FLD_TIME_ASPCT = FLD_PROPERTY + 1; - FLD_SYSTEM = FLD_TIME_ASPCT + 1; - FLD_SCALE_TYP = FLD_SYSTEM + 1; - FLD_METHOD_TYP = FLD_SCALE_TYP + 1; - FLD_CLASS = FLD_METHOD_TYP + 1; -// FLD_SOURCE = 8; removed as of 2.56 - FLD_VersionLastChanged = FLD_CLASS + 1; - FLD_CHNG_TYPE = FLD_VersionLastChanged + 1; - FLD_DefinitionDescription = FLD_CHNG_TYPE + 1; - FLD_STATUS = FLD_DefinitionDescription + 1; - FLD_CONSUMER_NAME = FLD_STATUS + 1; - FLD_CLASSTYPE = FLD_CONSUMER_NAME + 1; - FLD_FORMULA = FLD_CLASSTYPE + 1; -// FLD_SPECIES = FLD_FORMULA + 1; - FLD_EXMPL_ANSWERS = FLD_FORMULA + 1; - FLD_SURVEY_QUEST_TEXT = FLD_EXMPL_ANSWERS + 1; - FLD_SURVEY_QUEST_SRC = FLD_SURVEY_QUEST_TEXT + 1; - FLD_UNITSREQUIRED = FLD_SURVEY_QUEST_SRC + 1; - //FLD_SUBMITTED_UNITS = FLD_UNITSREQUIRED + 1; - FLD_RELATEDNAMES2 = FLD_UNITSREQUIRED + 1; - FLD_SHORTNAME = FLD_RELATEDNAMES2 + 1; - FLD_ORDER_OBS = FLD_SHORTNAME + 1; - //FLD_CDISC_COMMON_TESTS = FLD_ORDER_OBS + 1; - FLD_HL7_FIELD_SUBFIELD_ID = FLD_ORDER_OBS + 1; - FLD_EXTERNAL_COPYRIGHT_NOTICE = FLD_HL7_FIELD_SUBFIELD_ID + 1; - FLD_EXAMPLE_UNITS = FLD_EXTERNAL_COPYRIGHT_NOTICE + 1; - FLD_LONG_COMMON_NAME = FLD_EXAMPLE_UNITS + 1; - //FLD_UnitsAndRange = FLD_LONG_COMMON_NAME + 1; -// FLD_DOCUMENT_SECTION = FLD_UnitsAndRange + 1; - FLD_EXAMPLE_UCUM_UNITS = FLD_LONG_COMMON_NAME + 1; - //FLD_EXAMPLE_SI_UCUM_UNITS = FLD_EXAMPLE_UCUM_UNITS + 1; - FLD_STATUS_REASON = FLD_EXAMPLE_UCUM_UNITS + 1; - FLD_STATUS_TEXT = FLD_STATUS_REASON + 1; - FLD_CHANGE_REASON_PUBLIC = FLD_STATUS_TEXT + 1; - FLD_COMMON_TEST_RANK = FLD_CHANGE_REASON_PUBLIC + 1; - FLD_COMMON_ORDER_RANK = FLD_COMMON_TEST_RANK + 1; - FLD_COMMON_SI_TEST_RANK = FLD_COMMON_ORDER_RANK + 1; - FLD_HL7_ATTACHMENT_STRUCTURE = FLD_COMMON_SI_TEST_RANK + 1; - FLD_EXTERNAL_COPYRIGHT_LINK = FLD_HL7_ATTACHMENT_STRUCTURE + 1; - FLD_PanelType = FLD_EXTERNAL_COPYRIGHT_LINK + 1; - FLD_AskAtOrderEntry = FLD_PanelType + 1; - FLD_AssociatedObservations = FLD_AskAtOrderEntry + 1; - FLD_VersionFirstReleased = FLD_AssociatedObservations + 1; - FLD_ValidHL7AttachmentRequest = FLD_VersionFirstReleased + 1; - FLD_DisplayName = FLD_ValidHL7AttachmentRequest + 1; - - -Function TLoincImporter.LoadLOINCFiles(folder : String; out props : TLoincPropertyIds; out roots : TCardinalArray; out subsets : TLoincSubsets) : Cardinal; +procedure TLoincImporter.ImportLOINC; var - iLength : Integer; - iCount : Integer; - oCodes : TCodeList; - oTemp : TFslObjectList; - oCode : TCode; - iLoop, iLang : Integer; - oNames : TStringList; - aNames : TCardinalArray; - oComps : TConceptManager; - oProps : TConceptManager; - oTime : TConceptManager; - oSystem : TConceptManager; - oScale : TConceptManager; - oMethod : TConceptManager; - oClass : TConceptManager; - oHeirarchy : THeirarchyEntryList; - oEntry : THeirarchyEntry; - aConcepts : TCardinalArray; - oSubsets : Array[TLoincSubsetId] of TCodeList; - i, j : integer; - iFlag : Byte; - aCardinals : TCardinalArray; - iStem, e : Cardinal; - ma : Text; - ln : String; - a : TLoincSubsetId; - csv : TFslCSVExtractor; - items : TFslStringList; - f : TFslFile; - st, st2 : TStringList; - answerlist : TAnswerList; - answer : TAnswer; - s : String; - lc : TLoincLanguageCodes; + db : TFDBManager; + st : TStringList; + s : string; + i : integer; begin - result := 0; - iLength := 0; - - oCodes := TCodeList.Create; - oComps := TConceptManager.Create; - oProps := TConceptManager.Create; - oTime := TConceptManager.Create; - oSystem := TConceptManager.Create; - oScale := TConceptManager.Create; - oMethod := TConceptManager.Create; - oClass := TConceptManager.Create; - FAnswerLists := TFslMap.Create('loinc.answers'); - FAnswerMap := TFslMap.create('loinc.answers2'); - oHeirarchy := THeirarchyEntryList.Create; - Try - for a := Low(TLoincSubsetId) to high(TLoincSubsetId) do - begin - oSubsets[a] := TCodeList.Create; - oSubsets[a].SortedByCode; - end; - Progress(0, 24, 'Loading Languages'); - if FileExists(IncludeTrailingPathDelimiter(folder)+ 'LinguisticVariants.csv') then - ReadLanguageVariants(); - - - iCount := 0; - Progress(0, 0, 'Loading Concepts'); - items := TFslStringList.Create; - f := TFslFile.Create(IncludeTrailingPathDelimiter(folder)+ 'loinc.csv', fmOpenRead); + st := TStringList.create; + try + db := TFDBSQLiteManager.create('db', FOutputFile, false, true, 10); try - csv := TFslCSVExtractor.Create(f.Link, TEncoding.UTF8); - Try - // headers - csv.ConsumeEntries(items); - - while csv.More do + conn := db.GetConnection('definitions'); + dbCodes := db.GetConnection('codes'); + dbRels := db.GetConnection('relationships'); + dbDesc := db.GetConnection('descriptions'); + dbProps := db.GetConnection('properties'); + dbText := db.GetConnection('text'); + try + CreateTables(1); + + dbCodes.sql := 'Insert into Codes (CodeKey, Code, Type, RelationshipKey, StatusKey, Description) values (:ck, :c, :t, :rk, :sk, :d)'; + dbCodes.prepare; + dbRels.sql := 'Insert into Relationships (RelationshipKey, RelationshipTypeKey, SourceKey, TargetKey, StatusKey) values (:rk, :rtk, :sk, :tk, :stk)'; + dbRels.prepare; + dbDesc.sql := 'Insert into Descriptions (DescriptionKey, CodeKey, LanguageKey, DescriptionTypeKey, Value) values (:dk, :ck, :lk, :tk, :v)'; + dbDesc.prepare; + dbProps.sql := 'Insert into Properties (PropertyKey, PropertyTypeKey, CodeKey, PropertyValueKey) values (:pk, :ptk, :ck, :v)'; + dbProps.prepare; + dbText.sql := 'Insert into TextIndex (CodeKey, Type, Lang, Text) values (:ck, :tk, :lk, :t)'; + dbText.prepare; + + ProcessLanguageVariants(2, st); + FStepCount := 12 + st.count; + ProcessParts(3); + ProcessCodes(4); + ProcessConsumerNames(5); + ProcessLists(6); + ProcessPartLinks(7); + ProcessListLinks(8); + ProcessHierarchy(9); + ProcessPropertyValues(10); + storeClosureTable(11); + for i := 0 to st.count - 1 do + ProcessLanguage(12+i, st[i]); + + dbCodes.terminate; + dbRels.terminate; + dbDesc.terminate; + dbProps.terminate; + dbText.terminate; + + dbCodes.Release; + dbRels.Release; + dbDesc.terminate; + dbProps.terminate; + dbText.terminate; + conn.Release; + except + on e : Exception do begin - csv.ConsumeEntries(items); - if items.count > 0 then - begin - oCode := TCode.Create(FLanguages.Count); - oCodes.Add(oCode); - - oCode.Names := 0; - oCode.Code := Trim(items[FLD_LOINC_NUM]); - oCode.Display := Trim(items[FLD_LONG_COMMON_NAME]); - oCode.QuestionText := Trim(items[FLD_SURVEY_QUEST_TEXT]); - if Length(oCode.Code) > iLength Then - iLength := Length(oCode.Code); - - oCode.Comps[0] := oComps.See(0, items[FLD_COMPONENT], oCode); - oCode.Props[0] := oProps.See(0, items[FLD_PROPERTY], oCode); - oCode.Time[0] := oTime.See(0, items[FLD_TIME_ASPCT], oCode); - oCode.System[0] := oSystem.See(0, items[FLD_SYSTEM], oCode); - oCode.Scale[0] := oScale.See(0, items[FLD_SCALE_TYP], oCode); - oCode.Method[0] := oMethod.See(0, items[FLD_METHOD_TYP], oCode); - oCode.Class_[0] := oClass.See(0, items[FLD_CLASS], oCode); - for iLang := 1 to Flanguages.count - 1 do - begin - if Flanguages[iLang].Codes.TryGetValue(oCode.Code, lc) then - begin - oCode.Comps[iLang] := oComps.See(iLang, lc.Component, oCode); - oCode.Props[iLang] := oProps.See(iLang, lc.Prop, oCode); - oCode.Time[iLang] := oTime.See(iLang, lc.TimeAspect, oCode); - oCode.System[iLang] := oSystem.See(iLang, lc.System, oCode); - oCode.Scale[iLang] := oScale.See(iLang, lc.Scale, oCode); - oCode.Method[iLang] := oMethod.See(iLang, lc.Method, oCode); - oCode.Class_[iLang] := oClass.See(iLang, lc.Clss, oCode); - end; - end; - - oSubsets[lsiAll].add(oCode.Link); - oCode.Flags := 0; - // if o.ColIntegerByName['SETROOT'] = 1 Then - // oCode.Flags := oCode.Flags + FLAGS_ROOT; - if sameText(items[FLD_ORDER_OBS], 'Both') Then - begin - oCode.Flags := oCode.Flags + FLAGS_ORDER + FLAGS_OBS; - oSubsets[lsiOrderObs].add(oCode.Link); - end - else if sameText(items[FLD_ORDER_OBS], 'Observation') Then - begin - oCode.Flags := oCode.Flags + FLAGS_OBS; - oSubsets[lsiObs].add(oCode.Link); - end - else if sameText(items[FLD_ORDER_OBS], 'Order') Then - begin - oCode.Flags := oCode.Flags + FLAGS_ORDER; - oSubsets[lsiOrder].add(oCode.Link); - end - else if (items[FLD_ORDER_OBS] <> '') And (items[FLD_ORDER_OBS] <> 'Subset') Then - raise ETerminologySetup.create('unknown order/obs '+items[FLD_ORDER_OBS]) - else - oSubsets[lsiOrderSubset].add(oCode.Link); - - if items[FLD_UNITSREQUIRED] = 'Y' Then - oCode.Flags := oCode.Flags + FLAGS_UNITS; - if items[FLD_EXTERNAL_COPYRIGHT_NOTICE] = '' then - oSubsets[lsiInternal].add(oCode.Link) - else - oSubsets[lsi3rdParty].add(oCode.Link); - - s := items[FLD_CLASSTYPE]; - if s = '' then - s := '1'; - if not StringIsInteger32(s) then - raise ETerminologySetup.create('Error'); - - case StrToInt(s) of - 2: begin - oCode.Flags := oCode.Flags + FLAGS_CLIN; - oSubsets[lsiTypeClinical].add(oCode.Link); - end; - 3: begin - oCode.Flags := oCode.Flags + FLAGS_ATT; - oSubsets[lsiTypeAttachment].add(oCode.Link); - end; - 4: begin - oCode.Flags := oCode.Flags + FLAGS_SURV; - oSubsets[lsiTypeSurvey].add(oCode.Link); - end; - 1: begin - oSubsets[lsiTypeObservation].add(oCode.Link); - end; - else - raise ETerminologySetup.create('unexpected class type '+items[FLD_CLASSTYPE]); - End; - if SameText(items[FLD_STATUS], 'Active') then - oSubsets[lsiActive].add(oCode.Link) - else if SameText(items[FLD_STATUS], 'Deprecated') then - oSubsets[lsiDeprecated].add(oCode.Link) - else if SameText(items[FLD_STATUS], 'Discouraged') then - oSubsets[lsiDiscouraged].add(oCode.Link) - else if SameText(items[FLD_STATUS], 'Trial') then - oSubsets[lsiTrial].add(oCode.Link) - else - raise ETerminologySetup.create('Unknown LOINC Code status '+items[FLD_STATUS]); - - SeeDesc(oCode.Display, oCode, FLAG_LONG_COMMON); - - oNames := TStringList.Create; - Try - if items[FLD_SHORTNAME] <> '' Then - oNames.AddObject(items[FLD_SHORTNAME], TObject(0)); - if oCode.QuestionText <> '' then - oNames.AddObject(oCode.QuestionText, TObject(0)); - for s in items[FLD_RELATEDNAMES2].Split([';']) do - if oNames.IndexOf(items[FLD_SHORTNAME]) = -1 then - oNames.AddObject(items[FLD_SHORTNAME], TObject(0)); - for iLang := 1 to FLanguages.Count - 1 do - begin - if FLanguages[iLang].Codes.TryGetValue(oCode.Code, lc) then - begin - if lc.Shortname < '' then - if oNames.IndexOf(lc.Shortname) = -1 then - oNames.AddObject(lc.Shortname, TObject(iLang)); - for s in lc.RelatedNames do - if oNames.IndexOf(s) = -1 then - oNames.AddObject(s, TObject(iLang)); - end; - end; - - if oNames.Count > 0 Then - Begin - SetLength(aNames, oNames.Count); - For iLoop := 0 to oNames.Count - 1 Do - If Trim(oNames[iLoop]) <> '' Then - Begin - aNames[iLoop] := addDescription(integer(oNames.Objects[iLoop]), Trim(oNames[iLoop])); - if integer(oNames.Objects[iLoop]) = 0 then - SeeDesc(oNames[iLoop], oCode, FLAG_LONG_RELATED); - End - Else - aNames[iLoop] := 0; - - oCode.Names := FRefs.AddRefs(aNames); - End; - Finally - oNames.free; - End; - - // properties - - if iCount mod STEP_COUNT = 0 then - Progress(0, iCount * 3 / ESTIMATED_CONCEPTS, ''); - inc(iCount); - end; - End; - Finally - csv.free; - items.free; - End; - finally - f.free; - end; - Progress(3, 0, 'Sort Codes'); - oCodes.SortedByCode; - - // now, process the multi-axial file - if FileExists(IncludeTrailingPathDelimiter(folder) + 'ComponentHierarchyBySystem.csv') then - begin - Progress(3,0,'Loading Multi-Axial Source'); - oHeirarchy.SortedByCode; - AssignFile(ma, IncludeTrailingPathDelimiter(folder) + 'ComponentHierarchyBySystem.csv'); - Reset(ma); - Readln(ma, ln); // skip header - - iCount := 0; - while not eof(ma) do - begin - Readln(ma, ln); - ProcessMultiAxialEntry(oHeirarchy, oCodes, ln); - if iCount mod STEP_COUNT = 0 then - Progress(3, iCount*2/ESTIMATED_HEIRACHY, ''); - inc(iCount); - end; - CloseFile(ma); - for i := 0 to oHeirarchy.Count - 1 do - // first, we simply assign them all an index. Then we'll create everything else, and then go and actually store them - oHeirarchy[i].index := i; - end; - - if FileExists(IncludeTrailingPathDelimiter(folder) + 'answerList.csv') then - begin - Progress(5, 0, 'Loading Answer Lists'); - AssignFile(ma, IncludeTrailingPathDelimiter(folder) + 'answerList.csv'); - Reset(ma); - Readln(ma, ln); // skip header - iCount := 0; - while not eof(ma) do - begin - Readln(ma, ln); - if (iCount = 4749) then - inc(iCount); - ProcessAnswerLine(oHeirarchy, oCodes, ln); - if iCount mod STEP_COUNT = 0 then - Progress(5, iCount / ESTIMATED_ANSWERS, ''); - inc(iCount); - end; - CloseFile(ma); - end; - - Progress(6, 0, 'Index Codes'); - For iLoop := 0 to oCodes.Count - 1 Do - Begin - oCode := TCode(oCodes[iLoop]); - oCode.Code := StringPadRight(oCode.Code, ' ', iLength); - if iLoop mod STEP_COUNT = 0 then - Progress(6, iCount * 0.5 / oCodes.Count, ''); - End; - FCode.CodeLength := iLength; - - For iLoop := 0 to oCodes.Count - 1 Do - Begin - if iCount mod STEP_COUNT = 0 then - Progress(6, 0.5+(iCount *0.5 / oCodes.Count), ''); - inc(iCount); - oCode := TCode(oCodes[iLoop]); - Try - SetLength(aCardinals, oCode.entries.Count); - for i := 0 to oCode.entries.count - 1 do - aCardinals[i] := oCode.entries[i].index; - e := FRefs.AddRefs(aCardinals); - - SetLength(aNames, FLanguages.Count); - aNames[0] := AddDescription(0, oCode.Display); - For iLang := 1 to FLanguages.Count - 1 Do - begin - if FLanguages[iLang].Codes.TryGetValue(oCode.Code, lc) then - aNames[iLang] := AddDescription(iLang, lc.Display) - else - aNames[iLang] := 0; - end; - oCode.Index := FCode.AddCode(oCode.Code, FRefs.AddRefs(aNames), oCode.Names, e, oCode.Flags); - Except - on E:Exception Do - Begin - e.Message := e.Message + ' (Code = '+oCode.Code+')'; - recordStack(e); + dbCodes.Error(e); + dbRels.Error(e); + dbDesc.Error(e); + dbProps.Error(e); + conn.Error(e); raise; - End; - End; - End; - - SetLength(aConcepts, 7); - Props[lptComponents] := oComps.Store(FLanguages.Count, 0, 'Components', self); - aConcepts[0] := Props[lptComponents]; - Props[lptProperties] := oProps.Store(FLanguages.Count, 0, 'Properties', self); - aConcepts[1] := Props[lptProperties]; - Props[lptTimeAspects] := oTime.Store(FLanguages.Count, 0, 'Time Aspects', self); - aConcepts[2] := Props[lptTimeAspects]; - Props[lptSystems] := oSystem.Store(FLanguages.Count, 0, 'Systems', self); - aConcepts[3] := Props[lptSystems]; - Props[lptScales] := oScale.Store(FLanguages.Count, 0, 'Scales', self); - aConcepts[4] := Props[lptScales]; - Props[lptMethods] := oMethod.Store(FLanguages.Count, 0, 'Methods', self); - aConcepts[5] := Props[lptMethods]; - Props[lptClasses] := oClass.Store(FLanguages.Count, 0, 'Classes', self); - aConcepts[6] := Props[lptClasses]; - result := FConcepts.AddConcept(AddDescription(0, 'LOINC Definitions'), false, FRefs.AddRefs(aConcepts), 0); - FCode.donebuild; - - Progress(7, 0, 'Storing Heirachy'); - FEntries.StartBuild; - iCount := 0; - SetLength(roots, 0); - for i := 0 to oHeirarchy.Count - 1 do - begin - if iCount mod STEP_COUNT = 0 then - Progress(7, i / oHeirarchy.Count, ''); - inc(iCount); - if oHeirarchy[i].FParents.Count = 0 then - begin - SetLength(roots, Length(roots)+1); - roots[Length(roots)-1] := oHeirarchy[i].index; - end; - StoreHeirarchyEntry(oHeirarchy[i]); - end; - FEntries.DoneBuild; - - for a := Low(TLoincSubsetId) to high(TLoincSubsetId) do - begin - setLength(aCardinals, oSubsets[a].Count); - for i := 0 to oSubsets[a].Count - 1 do - aCardinals[i] := oSubsets[a][i].Index; - subsets[a] := FRefs.AddRefs(aCardinals); - end; - - Progress(8, 0, 'Processing Answer Lists'); - FAnswers.StartBuild; - st := TStringList.Create; - st2 := TStringList.Create; - try - for answerlist in FAnswerLists.Values do - st.AddObject(answerlist.FCode, answerlist); - st.Sort; - for answer in FAnswerMap.Values do - st2.AddObject(answer.FCode, answer); - st2.Sort; - - for i := 0 to st.Count - 1 do - begin - answerlist := TAnswerList(st.Objects[i]); - answerlist.FIndex := i + st2.Count; - end; - - for i := 0 to st2.Count - 1 do - begin - - - if i mod STEP_COUNT = 0 then - Progress(8, i/st2.Count, ''); - answer := TAnswer(st2.Objects[i]); - SetLength(aCardinals, answer.FParents.Count); - for j := 0 to answer.FParents.Count - 1 do - aCardinals[j] := answer.FParents[j].FIndex; - answer.Index := FAnswers.AddEntry(AddDescription(0, answer.Code), AddDescription(0, answer.FDescription), FRefs.AddRefs(aCardinals)); - end; - for i := 0 to st.Count - 1 do - begin - if i mod STEP_COUNT = 0 then - Progress(9, i/st2.Count, ''); - answerlist := TAnswerList(st.Objects[i]); - SetLength(aCardinals, answerlist.FAnswers.Count); - for j := 0 to answerlist.FAnswers.Count - 1 do - aCardinals[j] := answerlist.FAnswers[j].FIndex; - j := FAnswers.AddEntry(AddDescription(0, answerlist.Code), AddDescription(0, answerlist.FDescription), FRefs.AddRefs(aCardinals)); - if (j <> answerlist.FIndex) then - raise ETerminologySetup.create('Error Message'); + end; end; finally - st.free; - st2.free; + db.free; end; - FAnswers.DoneBuild; - - - - Progress(10, 0, 'Processing Words'); - FWords.StartBuild; - For i := 0 to FWordList.Count - 1 Do - Begin - if i mod STEP_COUNT = 0 then - Progress(10, i/FWordList.Count, ''); - iFlag := Integer(FWordList.Objects[i]); - FWords.AddWord(FDesc.AddEntry(0, FWordList[i]), iFlag); - End; - FWords.DoneBuild; - - Progress(11, 0, 'Processing Stems'); - FStems.StartBuild; - For i := 0 to FStemList.Count - 1 Do - Begin - if i mod STEP_COUNT = 0 then - Progress(11, i / FStemList.Count, ''); - oTemp := TFslObjectList(FStemList.Objects[i]); - iStem := FDesc.AddEntry(0, FStemList[i]); - FStems.AddStem(iStem); - for j := 0 to oTemp.Count - 1 Do - TDescribed(oTemp[j]).Stems.Add(iStem); - oTemp.free; - FStemList.Objects[i] := nil; - End; - FStems.DoneBuild; - For i := 0 to oCodes.Count - 1 Do - Begin - if i mod STEP_COUNT = 0 then - Progress(12, i / oCodes.Count, ''); - oCode := TCode(oCodes[i]); - SetLength(aCardinals, oCode.Stems.Count); - for j := 0 to oCode.Stems.Count - 1 do - aCardinals[j] := oCode.Stems[j]; - FCode.SetStems(oCode.Index, FRefs.AddRefs(aCardinals)); - End; - For i := 0 to oHeirarchy.Count - 1 Do - Begin - if i mod STEP_COUNT = 0 then - Progress(13, i / oHeirarchy.Count, ''); - oEntry := oHeirarchy[i]; - SetLength(aCardinals, oEntry.Stems.Count); - for j := 0 to oEntry.Stems.Count - 1 do - aCardinals[j] := oEntry.Stems[j]; - FEntries.SetStems(oEntry.Index, FRefs.AddRefs(aCardinals)); - End; - - Progress(14, 0, 'Cross-Linking'); - For iLoop := 0 to oCodes.Count - 1 Do - Begin - if iLoop mod STEP_COUNT = 0 then - Progress(14, iLoop / oCodes.Count, ''); - oCode := TCode(oCodes[iLoop]); - if oCode.Comps <> nil Then - FCode.SetComponents(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Comps))); - if oCode.Props <> nil Then - FCode.SetPropertys(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Props))); - if oCode.Time <> nil Then - FCode.SetTimeAspects(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Time))); - if oCode.System <> nil Then - FCode.SetSystems(oCode.Index, FRefs.AddRefs(listConcepts(oCode.System))); - if oCode.Scale <> nil Then - FCode.SetScales(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Scale))); - if oCode.Method <> nil Then - FCode.SetMethods(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Method))); - if oCode.Class_ <> nil Then - FCode.SetClasses(oCode.Index, FRefs.AddRefs(listConcepts(oCode.Class_))); - End; - - TotalConcepts := oCodes.Count; - Finally - for a := Low(TLoincSubsetId) to high(TLoincSubsetId) do - osubsets[a].free; - oHeirarchy.free; - oCodes.free; - oComps.free; - oProps.free; - oTime.free; - oSystem.free; - oScale.free; - oMethod.free; - oClass.free; - FAnswerLists.free; - FAnswerMap.free; - - End; -End; - -procedure TLoincImporter.ReadLanguageVariants; -var - f : TFslFile; - items : TFslStringList; - csv : TFslCSVExtractor; - lang : TLoincLanguage; - i : integer; -begin - items := TFslStringList.Create; - f := TFslFile.Create(IncludeTrailingPathDelimiter(folder)+ 'LinguisticVariants.csv', fmOpenRead); - try - csv := TFslCSVExtractor.Create(f.Link, TEncoding.UTF8); - Try - csv.ConsumeEntries(items); - i := 0; - while csv.More do - begin - csv.ConsumeEntries(items); - if items.count > 0 then - begin - lang := TLoincLanguage.Create(items[1], items[2]); - try - readLanguage(i, items[0], lang); - FLanguages.Add(lang.Link); - finally - lang.free; - end; - end; - inc(i); - End; - Finally - csv.free; - End; finally - f.free; - items.free; - end; -end; - -Function TLoincImporter.ReadLOINCDatabase(out props : TLoincPropertyIds; out roots : TCardinalArray; out subsets : TLoincSubsets) : Cardinal; -Begin - FStrings := TStringList.Create; - FStrings.Sorted := True; - try - result := LoadLOINCFiles(folder, props, roots, subsets); - Finally - FStrings.free; - End; -End; - -Procedure TLoincImporter.ImportLOINC; -var - oSvc : TLOINCServices; - props : TLoincPropertyIds; - i : integer; - roots : TCardinalArray; - subsets : TLoincSubsets; - ls, s : String; - code, desc, refs : Cardinal; - lang : byte; - oLang : TLoincLanguage; -begin - FStart := now; - FLanguages := TFslList.Create; - FWordList := TStringList.Create; - FStemList := TStringList.Create; - FStemmer := TFslWordStemmer.create('english'); - oSvc := TLOINCServices.Create(nil); - Try - Flanguages.add(TLoincLanguage.create('en', 'US')); - FWordList.Sorted := true; - FStemList.Sorted := true; - Fdesc := oSvc.Desc; - Fdesc.StartBuild; - FDesc.AddEntry(0, ''); - FCode := oSvc.CodeList; - FCode.StartBuild; - FRefs := oSvc.Refs; - FRefs.StartBuild; - FLangs := oSvc.Lang; - FLangs.StartBuild; - FConcepts := oSvc.Concepts; - FConcepts.StartBuild; - FWords := oSvc.Words; - FStems := oSvc.Stems; - FEntries := oSvc.Entries; - FAnswers := oSvc.AnswerLists; - - Try - oSvc.Root := ReadLOINCDatabase(props, roots, subsets); - oSvc.LOINCVersion := Version; - oSvc.Properties := props; - oSvc.HeirarchyRoots := roots; - oSvc.Subsets := subsets; - Finally - FConcepts.DoneBuild; - FRefs.DoneBuild; - Fdesc.doneBuild; - End; - - for oLang in FLanguages do - FLangs.AddEntry(olang.FLang, olang.FCountry); - FLangs.DoneBuild; - ls := ''; - for I := 0 to FAnswers.Count - 1 do - begin - FAnswers.GetEntry(i, code, desc, refs); - s := FDesc.GetEntry(code, lang); - if not((ls = '') or (CompareStr(ls, s) < 0)) then - raise ETerminologySetup.create('out of order'); - ls := s; - end; - - Progress(15, 0, 'Save'); - oSvc.Save(FOutputFile, Date); - - Progress(15, 0.5, 'Cleanup'); - Finally - oSvc.free; - FWordList.free; - For i := 0 to FStemList.Count - 1 do - FStemList.Objects[i].free; - FStemList.free; - FStemmer.free; - FLanguages.free; - End; - TLoincServices.Create(nil).Load(FOutputFile); -End; - -function TLoincImporter.listConcepts(arr: TConceptArray): TCardinalArray; -var - i : integer; -begin - setlength(result, length(arr)); - for i := 0 to length(arr) - 1 do - if arr[i] = nil then - result[i] := 0 - else - result[i] := arr[i].Index; -end; - -Function CSVStringSplit(Const sValue, sDelimiter : String; Var sLeft, sRight: String) : Boolean; -Var - iIndex : Integer; - sA, sB : String; -Begin - if (sValue <> '') and (sValue[1] = '"') then - begin - iIndex := 1; - repeat - inc(iIndex); - if (sValue[iIndex] = '"') then - if (iIndex < sValue.Length) and (sValue[iIndex+1] = '"') then - inc(iIndex) - else - break; - until iIndex = sValue.Length; - Result := iIndex < sValue.Length; - if result then - inc(iIndex); - end - else - begin - // Find the delimiter within the source string - iIndex := Pos(sDelimiter, sValue); - Result := iIndex <> 0; - end; - - If Not Result Then - Begin - sA := sValue; - sB := ''; - End - Else - Begin - sA := Copy(sValue, 1, iIndex - 1); - sB := Copy(sValue, iIndex + Length(sDelimiter), MaxInt); - End; - - sLeft := sA; - sRight := sB; - if (sLeft <> '') and (sLeft[1] = '"') then - sLeft := copy(sLeft, 2, length(sleft)-2).replace('""', '"'); -End; - -function isLoinc(s : String) : boolean; -begin - result := (s.Length > 3) and (s[length(s)-1] = '-'); -end; - -var - gc : integer = 0; - -procedure TLoincImporter.ProcessAnswerLine(oHeirarchy : THeirarchyEntryList; oCodes : TCodeList; ln: string); -var - s, AnswerListId, AnswerListName, AnswerStringID, AnswerCode, DisplayText : String; - list : TAnswerList; - answer : TAnswer; -begin - inc(gc); - CSVStringSplit(ln, ',', AnswerListId, ln); - CSVStringSplit(ln, ',', AnswerListName, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', AnswerStringID, ln); - CSVStringSplit(ln, ',', AnswerCode, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', s, ln); - CSVStringSplit(ln, ',', DisplayText, ln); - - if isLoinc(AnswerListId) then - begin - if FAnswerLists.ContainsKey(AnswerListId) then - list := FAnswerLists[AnswerListId] - else - begin - list := TAnswerList.Create; - list.FCode := AnswerListId; - list.FDescription := AnswerListName; - FAnswerLists.Add(list.Code, list); - end; - - if (AnswerStringID = '') then - // writeln('?') - else - begin - if FAnswerMap.ContainsKey(AnswerStringID) then - begin - answer := FAnswerMap[AnswerStringID]; - list.Answers.Add(answer.link as TAnswer); - answer.Parents.Add(list.Link as TAnswerList); - // cross-linking and linking means that they'll leak, but we don't care - end - else - begin - answer := TAnswer.Create; - try - answer.FCode := AnswerStringID; - answer.Description := DisplayText; - list.Answers.Add(answer.link as TAnswer); - answer.Parents.Add(list.Link as TAnswerList); - FAnswerMap.Add(AnswerStringID, answer.Link as TAnswer); - finally - answer.free; - end; - end; - end; - end; -end; - -procedure TLoincImporter.AddToDescendentConcepts(oHeirarchy : THeirarchyEntryList; entry : TCode; path : String); -var - p : string; - parent : THeirarchyEntry; -begin - StringSplit(path, '.', p, path); - parent := oHeirarchy.getByCode(p); - if parent = nil then - raise ETerminologySetup.create('Unable to find entry '+p); - if (not parent.FDescendentConcepts.ExistsByReference(entry)) then - parent.FDescendentConcepts.add(entry.link); - if (path <> '') then - AddToDescendentConcepts(oHeirarchy, entry, path); -end; - -procedure TLoincImporter.registerParents(oHeirarchy : THeirarchyEntryList; entry : THeirarchyEntry; path : String); -var - p : string; - parent : THeirarchyEntry; -begin - StringSplit(path, '.', p, path); - parent := oHeirarchy.getByCode(p); - if parent = nil then - raise ETerminologySetup.create('Unable to find entry '+p); - if (not parent.FChildren.ExistsByReference(entry)) then - parent.FChildren.Add(entry.Link); - if (not entry.FParents.ExistsByReference(parent)) then - begin - entry.FParents.add(parent.link); - end; - if path <> '' then - registerParents(oHeirarchy, parent, path); -end; - -procedure TLoincImporter.ProcessMultiAxialEntry(oHeirarchy : THeirarchyEntryList; oCodes : TCodeList; ln: string); -var - PATH_TO_ROOT, SEQUENCE, IMMEDIATE_PARENT, CODE, CODE_TEXT, p : String; - entry, parent : THeirarchyEntry; - oCode : TCode; - i : integer; -begin - StringSplit(ln, ',', PATH_TO_ROOT, ln); - StringSplit(ln, ',', SEQUENCE, ln); - StringSplit(ln, ',', IMMEDIATE_PARENT, ln); - StringSplit(ln, ',', CODE, CODE_TEXT); - - PATH_TO_ROOT := RemoveQuotes(PATH_TO_ROOT); - SEQUENCE := RemoveQuotes(SEQUENCE); - IMMEDIATE_PARENT := RemoveQuotes(IMMEDIATE_PARENT); - CODE := RemoveQuotes(CODE); - CODE_TEXT := RemoveQuotes(CODE_TEXT); - - if (CODE.StartsWith('LP')) then - begin - entry := oHeirarchy.getByCode(CODE); - if (entry = nil) then - begin - entry := THeirarchyEntry.Create; - entry.FCode := CODE; - entry.FText := CODE_TEXT; - oHeirarchy.Add(entry); - SeeDesc(entry.FText, entry, FLAG_LONG_COMMON); - end; - - if PATH_TO_ROOT <> '' then - registerParents(oHeirarchy, entry, PATH_TO_ROOT); - - if (IMMEDIATE_PARENT <> '') then - registerParents(oHeirarchy, entry, IMMEDIATE_PARENT); - end - else - begin - oCode := oCodes.getByCode(CODE); - IF (CODE = '10565-0') then - code := '10565-0'; - if (oCode = nil) then - raise ETerminologySetup.create('Unable to find code '+CODE); - entry := oHeirarchy.getByCode(IMMEDIATE_PARENT); - if (entry = nil) then - raise ETerminologySetup.create('Unable to find ma code '+IMMEDIATE_PARENT); - entry.FConcepts.Add(oCode.Link); - AddToDescendentConcepts(oHeirarchy, oCode, PATH_TO_ROOT); - oCode.entries.add(entry.link); + st.free; end; end; @@ -1330,7 +290,7 @@ procedure TLoincImporter.Progress(Step : integer; pct : real; msg : String); begin if msg = '' then msg := lastmessage; - pct := ((step / 16) * 100) + (pct * (100 / 16)); + pct := ((step / FStepCount) * 100) + (pct * (100 / 16)); callback(trunc(pct), Msg); lastmessage := msg; end @@ -1343,469 +303,1020 @@ procedure TLoincImporter.Progress(Step : integer; pct : real; msg : String); write('.'); end; -procedure TLoincImporter.readLanguage(i : integer; index: String; lang : TLoincLanguage); -var - f : TFslFile; - items : TFslStringList; - csv : TFslCSVExtractor; - code : TLoincLanguageCodes; - s, p : String; - j, fp, fs : integer; - +function TLoincImporter.pv(value: String): integer; begin - Progress(i, 0, 'Loading Language '+lang.Lang+'-'+lang.Country); - items := TFslStringList.Create; - f := TFslFile.Create(IncludeTrailingPathDelimiter(folder)+ lang.Lang+lang.Country+index+'LinguisticVariant.csv', fmOpenRead); - try - fs := f.size; - csv := TFslCSVExtractor.Create(f.Link, TEncoding.UTF8, false, fs); - Try - csv.ConsumeEntries(items); - j := 0; - while csv.More do - begin - inc(j); - if j mod 1000 = 0 then - begin - fp := csv.progress; - Progress(i, fp / fs, 'Loading Language '+lang.Lang+'-'+lang.Country+' '+pct(fp, fs)); - end; - csv.ConsumeEntries(items); - if items.count > 0 then - begin - code := TLoincLanguageCodes.Create; - try - code.Component := items[1].trim(); - code.Prop := items[2].trim(); - code.TimeAspect := items[3].trim(); - code.System := items[4].trim(); - code.Scale := items[5].trim(); - code.Method := items[6].trim(); - code.Clss := items[7].trim(); - code.Shortname := items[8].trim(); - code.LongName := items[9].trim(); - s := items[10]; - for p in s.Split([';']) do - if code.RelatedNames.IndexOf(p.Trim) = -1 then - code.RelatedNames.add(p.trim()); - lang.Codes.Add(items[0], code.Link); - finally - code.free; - end; - end; - End; - Finally - csv.free; - End; - finally - f.free; - items.free; + if not FPropValues.TryGetValue(value, result) then + begin + inc(FPropValueKey); + result := FPropValueKey; + FPropValues.add(value, result); end; end; -{ TConcept } - -constructor TConcept.Create(lang : byte); +function checkPropName(s : String) : String; begin - inherited Create; - Codes := TObjectList.Create; - Codes.OwnsObjects := False; - FLang := lang; + if not StringArrayExists(KNOWN_PROPERTY_NAMES, s) then + raise EFslException.create('Unknown Property Name: '+s); + result := s; end; - -destructor TConcept.Destroy; + +function adjustPropName(s : String) : String; begin - Codes.free; - inherited; + if StringArrayExistsSensitive(KNOWN_PROPERTY_NAMES, s) then + result := s + else if (s = 'ADJUSTMENT') then + result := 'adjustment' + else if (s = 'CHALLENGE') then + result := 'challenge' + else if (s = 'COUNT') then + result := 'count' + else if (s = 'DIVISORS') then + result := 'analyte-divisor' + else if (s = 'Document.Kind') then + result := 'document-kind' + else if (s = 'Document.Role') then + result := 'document-role' + else if (s = 'Document.Setting') then + result := 'document-setting' + else if (s = 'Document.SubjectMatterDomain') then + result := 'document-subject-matter-domain' + else if (s = 'Document.TypeOfService') then + result := 'document-type-of-service' + else if (s = 'GENE') then + result := 'analyte-gene' + else if (s = 'METHOD') then + result := 'METHOD_TYP' + else if (s = 'Rad.Anatomic Location.Imaging Focus') then + result := 'rad-anatomic-location-imaging-focus' + else if (s = 'Rad.Anatomic Location.Laterality') then + result := 'rad-anatomic-location-laterality' + else if (s = 'Rad.Anatomic Location.Laterality.Presence') then + result := 'rad-anatomic-location-laterality-presence' + else if (s = 'Rad.Anatomic Location.Region Imaged') then + result := 'rad-anatomic-location-region-imaged' + else if (s = 'Rad.Guidance for.Action') then + result := 'rad-guidance-for-action' + else if (s = 'Rad.Guidance for.Approach') then + result := 'rad-guidance-for-approach' + else if (s = 'Rad.Guidance for.Object') then + result := 'rad-guidance-for-object' + else if (s = 'Rad.Guidance for.Presence') then + result := 'rad-guidance-for-presence' + else if (s = 'Rad.Maneuver.Maneuver Type') then + result := 'rad-maneuver-maneuver-type' + else if (s = 'Rad.Modality.Modality Subtype') then + result := 'rad-modality-modality-subtype' + else if (s = 'Rad.Modality.Modality Type') then + result := 'rad-modality-modality-type' + else if (s = 'Rad.Pharmaceutical.Route') then + result := 'rad-pharmaceutical-route' + else if (s = 'Rad.Pharmaceutical.Substance Given') then + result := 'rad-pharmaceutical-substance-given' + else if (s = 'Rad.Reason for Exam') then + result := 'rad-reason-for-exam' + else if (s = 'Rad.Subject') then + result := 'rad-subject' + else if (s = 'Rad.Timing') then + result := 'rad-timing' + else if (s = 'Rad.View.Aggregation') then + result := 'rad-view-aggregation' + else if (s = 'Rad.View.View Type') then + result := 'rad-view-view-type' + else if (s = 'SCALE') then + result := 'SCALE_TYP' + else if (s = 'SUFFIX') then + result := 'analyte-suffix' + else if (s = 'SUPER SYSTEM') then + result := 'super-system' + else if (s = 'TIME') then + result := 'TIME_ASPCT' + else if (s = 'TIME MODIFIER') then + result := 'time-modifier' + else + raise EFslException.create('Unknown Property Name: '+s); end; -{ TConceptManager } - -function TConceptManager.See(lang: byte; sName: String; oCode: TObject): TConcept; +procedure TLoincImporter.CreateTables(step: integer); var - i : Integer; - key : String; -begin - if sname = '' Then - result := nil - else + sql : String; + procedure addEntry(tblname, keyName, valueName : String; map : TKeyMap; code : String; key : integer); begin - key := char(lang+1)+sName; - if not tryGetValue(key, result) then - Begin - result := TConcept.Create(lang); - result.Name := char(lang+1)+sName; - Add(key, result); - End; - result.Codes.Add(oCode); - End; + conn.ExecSQL('Insert into '+tblName+' ('+keyName+', '+valueName+') values ('''+inttostr(key)+''', '''+code+''')'); + if (map <> nil) then + map.addKey(code, key); + end; + +begin + sql := 'CREATE TABLE Config ('+ + '`ConfigKey` int NOT NULL, '+ + '`Value` varchar(15) NOT NULL, '+ + 'PRIMARY KEY (`ConfigKey`))'; + conn.ExecSQL(sql); + + sql := 'Insert into Config (ConfigKey, Value) values (1, ''c3c89b66-5930-4aa2-8962-124561a5f8c1'')'; + conn.ExecSQL(sql); + sql := 'Insert into Config (ConfigKey, Value) values (2, '''+FVersion+''')'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Types ('+ + '`TypeKey` int NOT NULL, '+ + '`Code` varchar(15) NOT NULL, '+ + 'PRIMARY KEY (`TypeKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Languages ('+ + '`LanguageKey` int NOT NULL, '+ + '`Code` varchar(15) NOT NULL, '+ + '`Description` varchar(255) NOT NULL, '+ + 'PRIMARY KEY (`LanguageKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE StatusCodes ('+ + '`StatusKey` int NOT NULL, '+ + '`Description` varchar(255) NOT NULL, '+ + 'PRIMARY KEY (`StatusKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE RelationshipTypes ('+ + '`RelationshipTypeKey` int NOT NULL, '+ + '`Description` varchar(15) NOT NULL, '+ + 'PRIMARY KEY (`RelationshipTypeKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE DescriptionTypes ('+ + '`DescriptionTypeKey` int NOT NULL, '+ + '`Description` varchar(15) NOT NULL, '+ + 'PRIMARY KEY (`DescriptionTypeKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE PropertyTypes ('+ + '`PropertyTypeKey` int NOT NULL, '+ + '`Description` varchar(15) NOT NULL, '+ + 'PRIMARY KEY (`PropertyTypeKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Codes ('+ + '`CodeKey` int NOT NULL, '+ + '`Code` varchar(15) NOT NULL, '+ + '`Type` int NOT NULL, '+ + '`RelationshipKey` int NULL, '+ + '`StatusKey` int NOT NULL, '+ + '`Description` varchar NOT NULL, '+ + 'PRIMARY KEY (`CodeKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE Unique Index CodesCode on Codes (Code)'; + conn.ExecSQL(sql); + + + sql := 'CREATE TABLE Relationships ('+ + '`RelationshipKey` int NOT NULL, '+ + '`RelationshipTypeKey` int NOT NULL, '+ + '`SourceKey` int NOT NULL, '+ + '`TargetKey` int NOT NULL, '+ + '`StatusKey` int NOT NULL, '+ + 'PRIMARY KEY (`RelationshipKey`))'; + conn.ExecSQL(sql); + sql := 'CREATE Index RelationshipsSource on Relationships (RelationshipTypeKey, SourceKey)'; + conn.ExecSQL(sql); + sql := 'CREATE Index RelationshipsTarget on Relationships (RelationshipTypeKey, TargetKey)'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE PropertyValues ('+ + '`PropertyValueKey` int NOT NULL, '+ + '`Value` varchar NOT NULL, '+ + 'PRIMARY KEY (`PropertyValueKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Properties ('+ + '`PropertyKey` int NOT NULL, '+ + '`PropertyTypeKey` int NOT NULL, '+ + '`CodeKey` int NOT NULL, '+ + '`PropertyValueKey` int NOT NULL, '+ + 'PRIMARY KEY (`PropertyKey`))'; + conn.ExecSQL(sql); + sql := 'CREATE Index PropertiesCode1 on Properties (PropertyTypeKey, CodeKey)'; + conn.ExecSQL(sql); + sql := 'CREATE Index PropertiesCode2 on Properties (CodeKey, PropertyTypeKey)'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Descriptions ('+ + '`DescriptionKey` int NOT NULL, '+ + '`CodeKey` int NOT NULL, '+ + '`LanguageKey` int NOT NULL, '+ + '`DescriptionTypeKey` int NOT NULL, '+ + '`Value` varchar NOT NULL, '+ + 'PRIMARY KEY (`DescriptionKey`))'; + conn.ExecSQL(sql); + sql := 'CREATE Index DescriptionsCode on Descriptions (CodeKey, LanguageKey)'; + conn.ExecSQL(sql); + + sql := 'CREATE TABLE Closure ('+ + '`AncestorKey` int NOT NULL, '+ + '`DescendentKey` int NOT NULL, '+ + 'PRIMARY KEY (`AncestorKey`, `DescendentKey`))'; + conn.ExecSQL(sql); + + sql := 'CREATE VIRTUAL TABLE TextIndex USING fts5(codekey UNINDEXED, type UNINDEXED, lang UNINDEXED, text)'; + conn.ExecSQL(sql); + + addEntry('Types', 'TypeKey', 'Code', nil, 'Code', 1); + addEntry('Types', 'TypeKey', 'Code', nil, 'Part', 2); + addEntry('Types', 'TypeKey', 'Code', nil, 'AnswerList', 3); + addEntry('Types', 'TypeKey', 'Code', nil, 'Answer', 4); + + + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'NotStated', 0); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'ACTIVE', 1); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'DEPRECATED', 2); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'TRIAL', 3); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'DISCOURAGED', 4); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'EXAMPLE', 5); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'PREFERRED', 6); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'Primary', 7); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'DocumentOntology', 8); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'Radiology', 9); + addEntry('StatusCodes', 'StatusKey', 'Description', statii, 'NORMATIVE', 10); + + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'N/A', 0); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('adjustment'), 1); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('challenge'), 2); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('CLASS'), 3); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('COMPONENT'), 4); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('count'), 5); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('analyte-divisor'), 6); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('document-kind'), 7); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('document-role'), 8); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('document-setting'), 9); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('document-subject-matter-domain'),10); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('document-type-of-service'),11); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('analyte-gene'),12); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('METHOD_TYP'),13); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('PROPERTY'),14); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-anatomic-location-imaging-focus'),15); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-guidance-for-action'),16); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-guidance-for-approach'),17); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-guidance-for-object'),18); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-guidance-for-presence'),19); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-maneuver-maneuver-type'),20); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-modality-modality-subtype'),21); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-modality-modality-type'),22); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-pharmaceutical-route'),23); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-pharmaceutical-substance-given'),24); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-reason-for-exam'),25); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-subject'),26); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-timing'),27); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-view-aggregation'),28); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-view-view-type'),29); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('SCALE_TYP'),30); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('analyte-suffix'),31); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('super-system'),32); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('SYSTEM'),33); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('TIME_ASPCT'),34); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('time-modifier'),35); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-anatomic-location-laterality'),36); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-anatomic-location-laterality-presence'),37); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, checkPropName('rad-anatomic-location-region-imaged'),38); + + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'AnswerList', 39); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'Answer', 40); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'answers-for', 41); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'parent', 42); + addEntry('RelationshipTypes', 'RelationshipTypeKey', 'Description', rels, 'child', 43); + + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'LONG_COMMON_NAME', 1); + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'SHORTNAME', 2); + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'ConsumerName', 3); + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'RELATEDNAMES2', 4); + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'DisplayName', 5); + addEntry('DescriptionTypes', 'DescriptionTypeKey', 'Description', dTypes, 'LinguisticVariantDisplayName', 6); + + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'CLASSTYPE', 1); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'ORDER_OBS', 2); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'EXAMPLE_UNITS', 3); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'EXAMPLE_UCUM_UNITS', 4); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'PanelType', 5); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'AskAtOrderEntry', 6); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'UNITSREQUIRED', 7); + //addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'CLASS', 8); + addEntry('PropertyTypes', 'PropertyTypeKey', 'Description', props, 'Copyright', 9); + + conn.ExecSQL('Insert into Languages (LanguageKey, Code, Description) values (1, ''en-US'', ''English (United States)'')'); + langs.addKey('en-US', 1); end; -function nameSort(List: TStringList; Index1, Index2: Integer): Integer; +procedure TLoincImporter.ProcessDescription(codeKey, languageKey, descriptionType : integer; value : String); +var + dk : integer; begin - result := CompareStr(list[Index1], list[index2]); + if (value <> '') then + begin + inc(FDescKey); + dk := FDescKey; + dbDesc.BindInteger('dk', dk); + dbDesc.BindInteger('ck', codeKey); + dbDesc.BindInteger('lk', languageKey); + dbDesc.BindInteger('tk', descriptionType); + dbDesc.BindString('v', value); + dbDesc.Execute; + + dbText.BindInteger('ck', codeKey); + dbText.BindInteger('tk', descriptionType); + dbDesc.BindInteger('lk', languageKey); + dbText.BindString('t', value); + dbText.Execute; + end; end; -function TConceptManager.Store(langCount, lang: byte; sName : String; oImp : TLoincImporter): Cardinal; +procedure TLoincImporter.ProcessProperty(codeKey, propertyType: integer; value: String); var - i, j : integer; - aChildren : array of TCardinalArray; - counter : array of integer; - childLangList : TCardinalArray; - aConcepts : TCardinalArray; - oConcept : TConcept; - byLang : boolean; - ts : TStringList; - s : String; + pk : integer; begin - SetLength(aChildren, langCount); - SetLength(counter, langCount); - SetLength(childLangList, langCount); - for i := 0 to langCount - 1 do + if (value <> '') then begin - counter[i] := 0; - SetLength(aChildren[i], Count); + inc(FPropKey); + pk := FPropKey; + dbProps.BindInteger('pk', pk); + dbProps.BindInteger('ck', codeKey); + dbProps.BindInteger('ptk', propertyType); + dbProps.BindInteger('v', pv(value)); + dbProps.Execute; end; +end; - ts := TStringList.Create; - try - for s in keys do - ts.add(s); - ts.CustomSort(nameSort); - for s in ts do +function readLine(src : String; len : integer; var cursor : integer) : String; +var + start : integer; + ch : char; +begin + start := cursor; + ch := src[cursor]; + while (cursor <= len) and not CharInSet(src[cursor], [#13, #10]) do + inc(cursor); + result := src.subString(start-1, cursor-start); + inc(cursor); // pass the eoln we found + if (cursor <= len) and CharInSet(src[cursor], [#13, #10]) and (src[cursor] <> src[cursor-1]) then + inc(cursor); +end; + +function csvSplit(line : String; count : integer) : TStringArray; +var + inQuoted : boolean; + ch : char; + i, b, e, l: integer; + procedure AddCell; + begin + if (l < count) then begin - oConcept := Items[s]; - SetLength(aConcepts, oConcept.Codes.Count); - For j := 0 to oConcept.Codes.Count - 1 do - aConcepts[j] := TCode(oConcept.Codes[j]).Index; - oConcept.Index := oImp.FConcepts.AddConcept(oImp.AddDescription(oConcept.Flang, oConcept.Name.substring(1)), false, 0, oImp.FRefs.AddRefs(aConcepts)); - aChildren[oConcept.Flang, counter[oConcept.Flang]] := oConcept.Index; - inc(counter[oConcept.Flang]); - End; - finally - ts.free; + result[l] := line.subString(b, e-b-1); + inc(l); + end; + b := i; end; - - byLang := false; - for i := 1 to langCount - 1 do - if counter[i] > 0 then - byLang := true; - if byLang then +begin + SetLength(result, count); + inQuoted := false; + i := 1; + b := 0; + e := 0; + l := 0; + while (i <= line.length) do begin - for i := 0 to langCount - 1 do + ch := line[i]; + if not Inquoted and (ch = ',') then + addCell + else if (ch <> '"') then + e := i + else if inQuoted then begin - SetLength(aChildren[i], counter[i]); - childLangList[i] := oImp.FRefs.AddRefs(aChildren[i]); + e := i; + InQuoted := false; + end + else + begin + InQuoted := true; + b := i; end; - result := oImp.FConcepts.AddConcept(oImp.AddDescription(lang, sName), true, oImp.FRefs.AddRefs(childLangList), 0); - end - else - result := oImp.FConcepts.AddConcept(oImp.AddDescription(lang, sName), false, oImp.FRefs.AddRefs(aChildren[0]), 0); + inc(i); + end; + addCell; end; -function TLoincImporter.AddDescription(lang : byte; s: String): Cardinal; +procedure TLoincImporter.ProcessParts(step: integer); var - i : Integer; + src, line : String; + len, cursor, count : Integer; begin - s := s.trim; - if s = '' then - result := 0 - else if FStrings.Find(char(lang+1)+s, i) Then - result := Cardinal(FStrings.Objects[i]) - Else - Begin - result := FDesc.AddEntry(lang, s); - FStrings.AddObject(char(lang+1)+s, TObject(result)); - End; + Progress(step, 0,'Importing Parts'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'PartFile', 'Part.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Parts: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessPartItems(csvSplit(line, 5)); + end; end; - -{ THeirarchyEntry } - -constructor THeirarchyEntry.Create; +procedure TLoincImporter.ProcessPartItems(items: TStringArray); +var + c, d : String; + ck, t, rk, sk : integer; begin - inherited; - FChildren := THeirarchyEntryList.Create; - FParents := THeirarchyEntryList.Create; - FConcepts := TCodeList.Create; - FDescendentConcepts := TCodeList.Create; + inc(FCodeKey); + ck := FCodeKey; + c := items[0]; + t := 2; + rk := rels.getKey(adjustPropName(items[1])); + d := items[2]; + sk := statii.getKey(items[4]); + dbCodes.bindInteger('ck', ck); + dbCodes.bindString('c', c); + dbCodes.bindInteger('t', t); + dbCodes.bindInteger('rk', rk); + dbCodes.bindInteger('sk', sk); + dbCodes.bindString('d', d); + dbCodes.execute; + codes.addCode(c, ck, codeList); + partNames.add(items[1]+'.'+items[2], items[0]); + + ProcessDescription(ck, 1, dTypes.getKey('DisplayName'), items[3]); end; -destructor THeirarchyEntry.Destroy; +procedure TLoincImporter.ProcessCodes(step: integer); +var + src, line : String; + len, cursor, count : Integer; begin - FConcepts.free; - FChildren.free; - FDescendentConcepts.free; - FParents.free; - inherited; + Progress(step, 0,'Importing Codes'); + src := FileToString(FilePath([folder, 'LoincTable', 'Loinc.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Codes: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessCodeItems(csvSplit(line, 39)); + end; end; -function THeirarchyEntry.link: THeirarchyEntry; +function descClassType(s : String) : String; begin - result := THeirarchyEntry(inherited link); + if (s = '1') then + result := 'Laboratory class' + else if (s = '2') then + result := 'Clinical class' + else if (s = '3') then + result := 'Claims attachment' + else if (s = '4') then + result := 'Surveys' + else + result := s; end; -{ THeirarchyEntryList } - -function THeirarchyEntryList.CompareByCode(pA, pB: Pointer): Integer; +procedure TLoincImporter.ProcessCodeItems(items: TStringArray); +var + c, d, s, clsCode : String; + ck, t, rk, sk, rtk, tk, stk : integer; begin - Result := CompareStr(THeirarchyEntry(pA).FCode, THeirarchyEntry(pB).FCode); + inc(FCodeKey); + ck := FCodeKey; + c := RemoveQuotes(items[0]); + t := 1; + d := RemoveQuotes(items[25]); // long common name + sk := statii.getKey(items[11]); + dbCodes.bindInteger('ck', ck); + dbCodes.bindString('c', c); + dbCodes.bindInteger('t', t); + dbCodes.bindNull('rk'); + dbCodes.bindInteger('sk', sk); + dbCodes.bindString('d', d); + dbCodes.execute; + codes.addCode(c, ck, codeList); + + clsCode := partNames['CLASS.'+items[7]]; + + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(adjustPropName('CLASS')); + sk := ck; + tk := codes.getCode(clsCode).FKey; + stk := 0; + + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', sk); + dbRels.bindInteger('tk', tk); + dbRels.bindInteger('stk', stk); + dbRels.execute; + + ProcessProperty(ck, props.getKey('CLASSTYPE'), descClassType(items[13])); + ProcessProperty(ck, props.getKey('ORDER_OBS'), items[21]); + ProcessProperty(ck, props.getKey('EXAMPLE_UNITS'), items[24]); + ProcessProperty(ck, props.getKey('EXAMPLE_UCUM_UNITS'), items[26]); + ProcessProperty(ck, props.getKey('PanelType'), items[34]); + ProcessProperty(ck, props.getKey('AskAtOrderEntry'), items[35]); + ProcessProperty(ck, props.getKey('UNITSREQUIRED'), items[18]); + ProcessProperty(ck, props.getKey('Copyright'), items[23]); + + + ProcessDescription(ck, 1, dTypes.getKey('LONG_COMMON_NAME'), d); + ProcessDescription(ck, 1, dTypes.getKey('ConsumerName'), items[12]); + ProcessDescription(ck, 1, dTypes.getKey('RELATEDNAMES2'), items[19]); + ProcessDescription(ck, 1, dTypes.getKey('SHORTNAME'), items[20]); + ProcessDescription(ck, 1, dTypes.getKey('DisplayName'), items[38]); end; -function THeirarchyEntryList.CompareByText(pA, pB: Pointer): Integer; +procedure TLoincImporter.ProcessConsumerNames(step: integer); +var + src, line : String; + len, cursor, count : Integer; begin - Result := CompareStr(THeirarchyEntry(pA).Ftext, THeirarchyEntry(pB).Ftext); + Progress(step, 0,'Importing Consumer Names'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'ConsumerName', 'ConsumerName.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Consumer Names: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessConsumerNameItems(csvSplit(line, 2)); + end; end; -function THeirarchyEntryList.FindByCode(entry: THeirarchyEntry; out iIndex: Integer): Boolean; + +procedure TLoincImporter.ProcessConsumerNameItems(items: TStringArray); begin - Result := Find(entry, iIndex, CompareByCode); + ProcessDescription(codes.getCode(items[0]).FKey, 1, dTypes.getKey('ConsumerName'), items[1]); end; -function THeirarchyEntryList.FindByCode(code: String; out iIndex: Integer): Boolean; -Var - entry : THeirarchyEntry; -Begin - entry := THeirarchyEntry(ItemNew); - Try - entry.Fcode := code; - - Result := FindByCode(entry, iIndex); - Finally - entry.free; - End; -end; -function THeirarchyEntryList.getByCode(code: String): THeirarchyEntry; -Var - iIndex : Integer; -Begin - If FindByCode(code, iIndex) Then - Result := Entries[iIndex] - Else - Result := Nil; -end; - -function THeirarchyEntryList.FindByText(entry: THeirarchyEntry; out iIndex: Integer): Boolean; +procedure TLoincImporter.ProcessLists(step: integer); +var + src, line : String; + len, cursor, count : Integer; + list : String; begin - Result := Find(entry, iIndex, CompareByText); -end; - -function THeirarchyEntryList.FindByText(text: String; out iIndex: Integer): Boolean; -Var - entry : THeirarchyEntry; -Begin - entry := THeirarchyEntry(ItemNew); - Try - entry.Ftext := text; - - Result := FindByText(entry, iIndex); - Finally - entry.free; - End; + Progress(step, 0,'Importing Answer Lists'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'AnswerFile', 'AnswerList.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + list := ''; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Answer Lists: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessListItems(csvSplit(line, 11), list); + end; end; -function THeirarchyEntryList.getByText(text: String): THeirarchyEntry; -Var - iIndex : Integer; -Begin - If FindByText(text, iIndex) Then - Result := Entries[iIndex] - Else - Result := Nil; -end; +procedure TLoincImporter.ProcessListItems(items: TStringArray; var list: String); +var + c, d : String; + ck1, ck2, t, sk : integer; + rk, rtk, stk : integer; +begin + c := RemoveQuotes(items[0]); + if (c <> list) then + begin + list := c; + inc(FCodeKey); + ck1 := FCodeKey; + t := 3; + d := RemoveQuotes(items[1]); // long common name + sk := 0; + dbCodes.bindInteger('ck', ck1); + dbCodes.bindString('c', c); + dbCodes.bindInteger('t', t); + dbCodes.bindNull('rk'); + dbCodes.bindInteger('sk', sk); + dbCodes.bindString('d', d); + dbCodes.execute; + codes.addCode(c, ck1, codeList); + end + else + ck1 := codes.getCode(c).FKey; -function THeirarchyEntryList.GetEntry(iIndex: Integer): THeirarchyEntry; -begin - result := THeirarchyEntry(ObjectByIndex[iIndex]); -end; + c := RemoveQuotes(items[6]); + if codes.ContainsKey(c) then + ck2 := codes.getCode(c).FKey + else + begin + inc(FCodeKey); + ck2 := FCodeKey; + t := 4; + d := RemoveQuotes(items[10]); // long common name + sk := 0; + dbCodes.bindInteger('ck', ck2); + dbCodes.bindString('c', c); + dbCodes.bindInteger('t', t); + dbCodes.bindNull('rk'); + dbCodes.bindInteger('sk', sk); + dbCodes.bindString('d', d); + dbCodes.execute; + codes.addCode(c, ck2, codeList); + end; -function THeirarchyEntryList.ItemClass: TFslObjectClass; -begin - result := THeirarchyEntry; + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(checkPropName('Answer')); + stk := 0; + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', ck1); + dbRels.bindInteger('tk', ck2); + dbRels.bindInteger('stk', stk); + dbRels.execute; + + // reverse relationship + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(checkPropName('AnswerList')); + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', ck2); + dbRels.bindInteger('tk', ck1); + dbRels.bindInteger('stk', stk); + dbRels.execute; end; -procedure THeirarchyEntryList.SortedByCode; +procedure TLoincImporter.ProcessPartLinks(step: integer); +var + src, line : String; + len, cursor, count : Integer; begin - SortedBy(CompareByCode); + Progress(step, 0,'Importing Part Relationships'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'PartFile', 'LoincPartLink_Primary.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Part Relationships: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessPartLinkItems(csvSplit(line, 7)); + end; end; -procedure THeirarchyEntryList.SortedByText; +procedure TLoincImporter.ProcessPartLinkItems(items: TStringArray); +var + rk, rtk, sk, tk, stk : integer; begin - SortedBy(CompareByText); + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(adjustPropName(items[5])); + sk := codes.getCode(items[0]).FKey; + tk := codes.getCode(items[2]).FKey; + stk := statii.getKey(items[6]); + + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', sk); + dbRels.bindInteger('tk', tk); + dbRels.bindInteger('stk', stk); + dbRels.execute; end; -{ TCodeList } - -function TCodeList.CompareByCode(pA, pB: Pointer): Integer; +procedure TLoincImporter.ProcessListLinks(step: integer); +var + src, line : String; + len, cursor, count : Integer; begin - Result := CompareStr(TCode(pA).Code, TCode(pB).Code); + Progress(step, 0,'Importing Answer List Links'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'AnswerFile', 'LoincAnswerListLink.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Answer List Links: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessListLinkItems(csvSplit(line, 5)); + end; end; -function TCodeList.FindByCode(entry: TCode; out iIndex: Integer): Boolean; +procedure TLoincImporter.ProcessListLinkItems(items: TStringArray); +var + rk, rtk, sk, tk, stk : integer; begin - Result := Find(entry, iIndex, CompareByCode); -end; - -function TCodeList.FindByCode(code: String; out iIndex: Integer): Boolean; -Var - entry : TCode; -Begin - entry := TCode(ItemNew); - Try - entry.code := code; - - Result := FindByCode(entry, iIndex); - Finally - entry.free; - End; -end; + inc(FRelKey); + rk := FRelKey; + sk := codes.getCode(items[0]).FKey; + tk := codes.getCode(items[2]).FKey; + stk := statii.getKey(items[4]); + + rtk := rels.getKey(checkPropName('AnswerList')); + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', sk); + dbRels.bindInteger('tk', tk); + dbRels.bindInteger('stk', stk); + dbRels.execute; + + // reverse relationship + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(checkPropName('answers-for')); + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', tk); + dbRels.bindInteger('tk', sk); + dbRels.bindInteger('stk', stk); + dbRels.execute; -function TCodeList.getByCode(code: String): TCode; -Var - iIndex : Integer; -Begin - If FindByCode(code, iIndex) Then - Result := Entries[iIndex] - Else - Result := Nil; end; -function TCodeList.GetEntry(iIndex: Integer): TCode; +procedure TLoincImporter.ProcessLanguageVariants(step : integer; list : TStringList); +var + src, line : String; + len, cursor, count : Integer; begin - result := TCode(ObjectByIndex[iIndex]); + conn.SQL := 'Insert into Languages (LanguageKey, Code, Description) values (:k, :c, :d)'; + conn.prepare; + Progress(step, 0,'Importing Languages'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'LinguisticVariants', 'LinguisticVariants.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + Progress(step, cursor / len, 'Importing Languages: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessLanguageVariantsItems(csvSplit(line, 4), list); + end; + conn.terminate; end; -function TCodeList.ItemClass: TFslObjectClass; +procedure TLoincImporter.ProcessLanguageVariantsItems(items : TStringArray; list : TStringList); +var + k : integer; + c, d : String; begin - result := TCode; + k := strToInt(items[0]); + c := items[1]+'-'+items[2]; + d := items[3]; + conn.bindInteger('k', k); + conn.bindString('c', c); + conn.bindString('d', d); + conn.Execute; + langs.add(c, k); + list.add(c); end; -procedure TCodeList.SortedByCode; +procedure TLoincImporter.ProcessLanguage(step: integer; code: String); +var + src, line : String; + len, cursor, count : Integer; + lk : integer; begin - SortedBy(CompareByCode); + Progress(step, 0,'Importing Language '+code); + lk := langs.getKey(code); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'LinguisticVariants', code.replace('-', '')+inttostr(lk)+'LinguisticVariant.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Importing Language '+code+': '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessLanguageItems(code, lk, csvSplit(line, 12)); + end; end; - -{ TDescribed } - -constructor TDescribed.Create; +procedure TLoincImporter.ProcessLanguageItems(code: String; lk: integer; items: TStringArray); +var + ck : integer; begin - inherited; - Stems := TFslIntegerList.Create; -end; + ck := codes.getCode(items[0]).FKey; -destructor TDescribed.Destroy; -begin - Stems.free; - inherited; + ProcessDescription(ck, lk, dTypes.getKey('LONG_COMMON_NAME'), items[9]); + ProcessDescription(ck, lk, dTypes.getKey('RELATEDNAMES2'), items[10]); + ProcessDescription(ck, lk, dTypes.getKey('SHORTNAME'), items[8]); + ProcessDescription(ck, lk, dTypes.getKey('LinguisticVariantDisplayName'), items[11]); end; - -{ TAnswerList } - -constructor TAnswerList.Create; +procedure TLoincImporter.ProcessPropertyValues(step: integer); +var + pp : TPair; begin - inherited; - FAnswers := TFslList.create(); + conn.sql := 'Insert into PropertyValues (PropertyValueKey, Value) values (:pk, :v)'; + conn.prepare; + for pp in FPropValues do + begin + conn.BindInteger('pk', pp.Value); + conn.bindString('v', pp.Key); + conn.execute; + end; + conn.terminate; end; -destructor TAnswerList.Destroy; +procedure TLoincImporter.ProcessHierarchy(step: integer); +var + src, line : String; + len, cursor, count : Integer; + lk : integer; begin - FAnswers.free; - inherited; + Progress(step, 0,'Processing Hierarchy'); + src := FileToString(FilePath([folder, 'AccessoryFiles', 'ComponentHierarchyBySystem', 'ComponentHierarchyBySystem.csv']), TEncoding.UTF8); + len := src.length; + cursor := 1; + readLine(src, len, cursor); + count := 0; + while (cursor < len) do + begin + inc(count); + if count mod 1000 = 0 then + Progress(step, cursor / len, 'Processing Hierarchy: '+pct(cursor, len)); + line := readLine(src, len, cursor); + ProcessHierarchyItems(csvSplit(line, 12)); + end; end; -{ TAnswer } - -constructor TAnswer.Create; +procedure TLoincImporter.ProcessHierarchyItems(items : TStringArray); +var + ciC, ciP, ci : TCodeInformation; + rk, rtk, sk, tk, stk : integer; + s : string; + c, d : String; + ck, t : integer; begin - inherited Create; - FParents := TFslList.Create; + // "LP432695-7.LP29693-6.LP343406-7","1","LP343406-7","LP7819-8","Microbiology" + if not codes.TryGetValue(items[3], ciC) then + begin + inc(FCodeKey); + ck := FCodeKey; + c := items[3]; + t := 2; + rk := 0; + d := items[4]; + sk := 0; + dbCodes.bindInteger('ck', ck); + dbCodes.bindString('c', c); + dbCodes.bindInteger('t', t); + dbCodes.bindInteger('rk', rk); + dbCodes.bindInteger('sk', sk); + dbCodes.bindString('d', d); + dbCodes.execute; + ciC := codes.addCode(c, ck, codeList); + end; + if items[2] = '' then + conn.ExecSQL('Insert into Config (ConfigKey, Value) values (3, '''+items[3]+''')') + else + begin + ciP := codes.GetCode(items[2]); + + + // // we do 3 things with this info - store parent and child relationships and generate parent->child closure table for is-a queries + + // 1: parent + + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(checkPropName('parent')); + sk := ciC.FKey; + tk := ciP.FKey; + stk := 0; + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', sk); + dbRels.bindInteger('tk', tk); + dbRels.bindInteger('stk', stk); + dbRels.execute; + + // 2; child + inc(FRelKey); + rk := FRelKey; + rtk := rels.getKey(checkPropName('child')); + sk := ciP.FKey; + tk := ciC.FKey; + stk := 0; + dbRels.bindInteger('rk', rk); + dbRels.bindInteger('rtk', rtk); + dbRels.bindInteger('sk', sk); + dbRels.bindInteger('tk', tk); + dbRels.bindInteger('stk', stk); + dbRels.execute; + + for s in items[0].split(['.']) do + begin + ci := codes.getCode(s); + if (ci.FChildren = nil) then + ci.FChildren := TKeySet.create; + ci.FChildren.addKey(ciC.FKey); + end; + end; end; -destructor TAnswer.Destroy; +procedure TLoincImporter.StoreClosureTable(step: integer); +var + count, k : integer; + ci : TCodeInformation; begin - FParents.free; - inherited; + Progress(step, 0,'Storing Closure Table'); + conn.sql := 'Insert into Closure (AncestorKey, DescendentKey) values (:a, :d)'; + conn.prepare; + count := 0; + for ci in codeList do + begin + inc(count); + if count mod 10 = 0 then + Progress(step, count / codeList.count, 'Storing Closure Table: '+pct(count, codeList.count)); + if (ci.FChildren <> nil) then + begin + conn.BindInteger('a', ci.FKey); + for k in ci.FChildren.Keys do + begin + conn.BindInteger('d', k); + conn.Execute; + end; + end; + end; + conn.terminate; end; -{ TLoincLanguageCodes } +{ TKeyMap } -constructor TLoincLanguageCodes.Create; +constructor TKeyMap.Create(name: String); begin - inherited; - FRelatedNames := TStringList.Create; + inherited create; + FName := name; end; -destructor TLoincLanguageCodes.Destroy; +procedure TKeyMap.addKey(code: String; key: integer); begin - FRelatedNames.free; - inherited; -end; - -function TLoincLanguageCodes.Display: String; -begin - result := Trim(FLongName); - if result = '' then - result := Trim(FShortName); - if result = '' then - result := Trim(FComponent); - if (result = '') and (FRelatedNames.Count > 0) then - result := Trim(FRelatedNames[0]); - if result = '' then - result := ''; + if ContainsKey(code) then + raise EFslException.create('Duplicate code '+code+' tried to be added to '+FName+' Table') + else + Add(code, key); end; -function TLoincLanguageCodes.link: TLoincLanguageCodes; +function TKeyMap.getKey(code: String): integer; begin - result := TLoincLanguageCodes(inherited Link); + if not TryGetValue(code, result) then + raise EFslException.create(code+' not found in '+FName+' Table'); end; -{ TLoincLanguage } +{ TCodeInformation } -constructor TLoincLanguage.Create; +constructor TCodeInformation.create; begin - inherited; - FCodes := TFslMap.create('loinc.lang'); + inherited create; end; -constructor TLoincLanguage.Create(lang, country: String); +destructor TCodeInformation.destroy; begin - Create; - FLang := lang; - FCountry := country; + FChildren.Free; + inherited destroy; end; -destructor TLoincLanguage.Destroy; +function TCodeInformation.link: TCodeInformation; begin - FCodes.free; - inherited; + result := TCodeInformation(inherited link); end; -function TLoincLanguage.link: TLoincLanguage; -begin - result := TLoincLanguage(inherited Link); -end; +{ TCodeMap } -constructor TCode.Create(langCount: integer); +function TCodeMap.addCode(code: String; key: integer; codeList : TFslList) : TCodeInformation; begin - inherited Create; - entries := TFslList.Create; - SetLength(Comps, langCount); - SetLength(Props, langCount); - SetLength(Time, langCount); - SetLength(System, langCount); - SetLength(Scale, langCount); - SetLength(Method, langCount); - SetLength(Class_, langCount); + result := TCodeInformation.create; + add(code, result); + codeList.add(result.link); + result.FKey := key; end; -destructor TCode.Destroy; +function TCodeMap.getCode(code: String): TCodeInformation; begin - entries.free; - inherited Destroy; + if not TryGetValue(code, result) then + raise EFslException.create(code+' not found in Code Table'); end; End. diff --git a/library/ftx/ftx_loinc_publisher.pas b/library/ftx/ftx_loinc_publisher.pas index eb2195630..91f4e3e22 100644 --- a/library/ftx/ftx_loinc_publisher.pas +++ b/library/ftx/ftx_loinc_publisher.pas @@ -35,11 +35,13 @@ Uses SysUtils, Classes, Math, fsl_threads, fsl_base, fsl_collections, fsl_http, fsl_htmlgen, + fdb_manager, fhir_objects, ftx_loinc_services, ftx_service; Const MAX_ROWS = 50; + CODES_TLoincProviderContextKind : array [TLoincProviderContextKind] of String = ('Code', 'Part Code', 'Answer List', 'Answer List Item'); Type TloincPublisher = class (TFslObject) @@ -48,26 +50,14 @@ TloincPublisher = class (TFslObject) FSearchCache : TStringList; FLoinc : TLOINCServices; FFHIRPath : String; - langs : TLangArray; - - function useLang(lang : byte) : boolean; - function GetConceptDesc(iConcept : cardinal):String; - - function makeParentsLists(parents : Cardinal) : TCardinalArrayArray; procedure loincFooter(html : THTMLPublisher); Procedure PublishCode(Const sPrefix, sCode : String; html : THTMLPublisher); - Procedure PublishCodes(Const sPrefix : String; iStart : Integer; html : THTMLPublisher); - Procedure PublishConcept(bRoot : Boolean; Const sPrefix, sId : String; iStart : Integer; html : THTMLPublisher); Procedure PublishHome(Const sPrefix : String; html : THTMLPublisher); Procedure PublishSearch(Const sPrefix, sText : String; iStart: Integer; all : boolean; html : THTMLPublisher); - Procedure PublishHeirarchyRoot(Const sPrefix : String; html : THTMLPublisher); - Procedure PublishHeirarchyEntry(sCode : String; iStart : Integer; Const sPrefix : String; html : THTMLPublisher); - Procedure ProcessMap(Const sPath : String; oMap : TFslStringMatch); Procedure PublishDictInternal(oMap : TFslStringMatch; Const sPrefix : String; html : THTMLPublisher); - function descLength(i: cardinal): String; protected function sizeInBytesV(magic : integer) : cardinal; override; Public @@ -77,6 +67,7 @@ TloincPublisher = class (TFslObject) Procedure PublishDict(oMap : TFslStringMatch; Const sPrefix : String; html : THTMLPublisher); Overload; Virtual; End; + Implementation Uses @@ -114,29 +105,22 @@ function StringToBoolDef(s : String; def : boolean):boolean; sURL := sPrefix +'?type=loinc&'; sId := oMap.Matches['id']; If sId <> '' Then - PublishConcept(false, sURL, sId, StrToIntDef(oMap.Matches['start'], 0), html) + PublishCode(sURL, sId, html) else if oMap.ExistsByKey('srch') then - if FLoinc.IsCode(oMap.Matches['srch']) then + if FLoinc.Codes.containsKey(oMap.Matches['srch']) then PublishCode(sURL, oMap.Matches['srch'], html) - else if FLoinc.IsMACode(oMap.Matches['srch']) then - PublishHeirarchyEntry(oMap.Matches['srch'], StrToIntDef(oMap.Matches['start'], 0), sURL, html) else PublishSearch(sURL, oMap.Matches['srch'], StrToIntDef(oMap.Matches['start'], 0), StringToBoolDef(oMap.matches['all'], false), html) - else if oMap.ExistsByKey('macode') then - PublishHeirarchyEntry(oMap.Matches['macode'], StrToIntDef(oMap.Matches['start'], 0), sURL, html) - else Begin + else + begin sId := oMap.Matches['code']; If sId = '' Then PublishHome(sURL, html) - else If sId = '*' Then - PublishCodes(sURL, StrToIntDef(oMap.Matches['start'], 0), html) else PublishCode(sURL, sId, html); - End; + end; End; - - Procedure TloincPublisher.ProcessMap(Const sPath : String; oMap : TFslStringMatch); Var sLeft, sRight : String; @@ -183,718 +167,164 @@ procedure TloincPublisher.PublishDict(oMap: TFslStringMatch; const sPrefix: Stri End; end; -function TloincPublisher.descLength(i : cardinal) : String; -begin - if i = 0 then - result := '0' - else - result := IntToStr(Length(FLoinc.Refs.GetRefs(i))); -end; - -function TloincPublisher.makeParentsLists(parents : Cardinal) : TCardinalArrayArray; -begin - SetLength(result, 0); -end; - -procedure TloincPublisher.PublishHeirarchyEntry(sCode: String; iStart : Integer; const sPrefix: String; html: THTMLPublisher); - procedure AddParentPath(index : Cardinal; plist : TCardinalArray); - var - p : Cardinal; - code, text, parents, children, concepts, descendentConcepts, stems : Cardinal; - lang : byte; - begin - FLoinc.Entries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - html.URL(FLoinc.Desc.GetEntry(text, lang), sPrefix+'macode='+FLoinc.Desc.GetEntry(code, lang)); - for p in plist do - begin - FLoinc.Entries.GetEntry(p, code, text, parents, children, concepts, descendentConcepts, stems); - html.AddTextPlain(' / '); - html.URL(FLoinc.Desc.GetEntry(text, lang), sPrefix+'macode='+FLoinc.Desc.GetEntry(code, lang)); - end; - end; - - procedure addParentsLists(index : Cardinal; parents : cardinal); - var - pll : TCardinalArrayArray; - pl : TCardinalArray; - begin - if (parents <> 0) then - begin - pll := makeParentsLists(parents); - if length(pll) = 1 then - begin - html.StartParagraph; - html.addTextPlain('Heirarchy: '); - addParentPath(index, pll[0]); - html.EndParagraph; - end - else - begin - html.AddParagraph('Heirarchy: '); - html.StartList(); - for pl in pll do - begin - html.StartListItem(); - addParentPath(index, pl); - html.EndListItem; - end; - html.EndList; - end; - end; - end; - -var - index, code, text, parents, children, concepts, descendentConcepts, stems, iCategories : Cardinal; - stext : string; - arr : TCardinalArray; - i, iTotal : integer; - b : boolean; - iDescription, iOtherNames, iStems : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - lang : byte; -begin - index := FLoinc.findMAConcept(sCode); - if index = 0 then - raise ETerminologyError.create('Unknown Malti-axial code '+sCode, itUnknown); - FLoinc.Entries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - stext := FLoinc.Desc.GetEntry(text, lang); - arr := FLoinc.Refs.GetRefs(children); - if (length(arr) = 0) then - begin - html.Heading(1, 'LOINC Part Concept '+sText+' ('+scode+')'); - addParentsLists(index, parents); - end - else - begin - html.Heading(1, 'Categories in LOINC Part Concept '+sText+' ('+scode+')'); - addParentsLists(index, parents); - - html.StartParagraph; - html.AddText('', true, false); - html.EndParagraph; - html.StartTable(true); - html.StartTableRow; - html.AddTableCell('Code', true); - html.AddTableCell('Description', true); - html.AddTableCell('Children', true); - html.AddTableCell('Concepts', true); - if FFHIRPath <> '' then - html.AddTableCell('Tools', true); - html.EndTableRow; - - for I := 0 to Length(arr) - 1 do - begin - FLoinc.Entries.GetEntry(arr[i], code, text, parents, children, concepts, descendentConcepts, stems); - html.StartTableRow; - html.AddTableCellURL(FLoinc.Desc.GetEntry(code, lang),sPrefix+'macode='+FLoinc.Desc.GetEntry(code, lang)); - html.AddTableCell(FLoinc.Desc.GetEntry(text, lang)); - html.AddTableCell(descLength(children)); - html.AddTableCell(descLength(descendentConcepts)); - if FFHIRPath <> '' then - html.AddTableCellURL('Expanded Value Set', FFHIRPath+'ValueSet?_query=expand&identifier=http://loinc.org/vs/'+FLoinc.Desc.GetEntry(code, lang)); - html.EndTableRow; - end; - html.EndTable; - end; - - // reset descendentConcepts: - FLoinc.Entries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - arr := FLoinc.Refs.GetRefs(descendentConcepts); - if (length(arr) > 0) then - begin - html.StartParagraph; - html.AddText('LOINC Codes in Category "'+sText+'"', true, false); - if FFHIRPath <> '' then - begin - html.AddTextPlain('. Get this as an '); - html.URL('Expanded Value Set', FFHIRPath+'ValueSet?_query=expand&identifier=http://loinc.org/vs/'+scode); - end; - html.EndParagraph; - b := false; - - html.StartTable(false); - html.StartTableRow; - html.StartTableCell; - html.AddParagraph(' '); - html.EndTableCell; - html.StartTableCell; - html.StartList; - iTotal := length(arr)-1; - For i := iStart to Min(iStart+MAX_ROWS, iTotal) Do - Begin - if not b And ((i - iStart) / Min(MAX_ROWS, iTotal) >= 0.5) Then - Begin - html.EndList; - html.EndTableCell; - html.StartTableCell; - html.StartList; - b := true; - End; - FLoinc.CodeList.GetInformation(arr[i], nil, sCode1, iDescription, iOtherNames, iStems, iEntries, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - html.StartListItem; - html.URL(sCode1, sPrefix + 'code='+sCode1); - html.AddTextPlain(': '+FLoinc.Desc.GetEntry(iDescription, lang)); - html.EndListItem; - End; - html.EndList; - html.EndTableCell; - html.EndTableRow; - html.EndTable; - if (iStart > 0) or (iStart+MAX_ROWS < iTotal) Then - Begin - html.StartParagraph; - if iStart > 0 Then - Begin - html.URL('Start', sPrefix+'macode='+sCode); - html.AddTextPlain(' '); - End; - if iStart > MAX_ROWS Then - Begin - html.URL('Previous', sPrefix+'macode='+sCode+'&start='+inttostr(iStart - MAX_ROWS)); - html.AddTextPlain(' '); - End; - html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(iTotal div MAX_ROWS + 1), true, false); - if (iStart+MAX_ROWS < iTotal) And (iStart + MAX_ROWS < MAX_ROWS * (iTotal div MAX_ROWS)) Then - Begin - html.AddTextPlain(' '); - html.URL('Next', sPrefix+'macode='+sCode+'&start='+inttostr(iStart + MAX_ROWS)); - End; - if (iStart+MAX_ROWS < iTotal) Then - Begin - html.AddTextPlain(' '); - html.URL('End', sPrefix+'macode='+sCode+'&start='+inttostr(MAX_ROWS * (iTotal div MAX_ROWS))); - End; - html.EndParagraph; - End; - - end; - html.line; - html.ParaURL('LOINC Home', sPrefix); - loincFooter(html); - html.Done; -end; - -procedure TloincPublisher.PublishHeirarchyRoot(const sPrefix: String; html: THTMLPublisher); -var - i : integer; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; - lang : byte; -begin - html.StartTable(true); - html.StartTableRow; - html.AddTableCell('Code', true); - html.AddTableCell('Description', true); - html.AddTableCell('Children', true); - html.AddTableCell('Concepts', true); - html.EndTableRow; - - for I := 0 to Length(FLoinc.HeirarchyRoots) - 1 do - begin - FLoinc.Entries.GetEntry(FLoinc.HeirarchyRoots[i], code, text, parents, children, concepts, descendentConcepts, stems); - - html.StartTableRow; - html.AddTableCellURL(FLoinc.Desc.GetEntry(code, lang),sPrefix+'macode='+FLoinc.Desc.GetEntry(code, lang)); - html.AddTableCell(FLoinc.Desc.GetEntry(text, lang)); - html.AddTableCell(descLength(children)); - html.AddTableCell(descLength(descendentConcepts)); - html.EndTableRow; - end; - html.EndTable; -end; - procedure TloincPublisher.PublishHome(const sPrefix: String; html: THTMLPublisher); var i : Integer; Begin html.Heading(1, 'LOINC Definitions'); - if not FLOINC.Loaded then - Begin - html.StartParagraph; - html.AddText('LOINC is not loaded', true, false); - html.EndParagraph; - End - Else - Begin - html.StartForm('GET', sPrefix); - html.StartParagraph; - html.AddTextPlain('Search LOINC: '); - html.textInput('srch'); - html.submit('Go'); - html.AddTextPlain(' '); - html.checkbox('all', false, 'Tight'); - html.endForm; - html.Line; - html.ParaURL('Browse All Codes', sPrefix+'code=*'); - html.StartParagraph; - html.AddText('LOINC Axes', true, false); - html.EndParagraph; - PublishConcept(true, sPrefix, inttostr(FLoinc.root), 0, html); - html.AddParagraph; - - html.AddText('LOINC Heirarchy', true, false); - html.EndParagraph; - PublishHeirarchyRoot(sPrefix, html); - html.AddParagraph; + html.StartForm('GET', sPrefix); + html.StartParagraph; + html.AddTextPlain('Search LOINC: '); + html.textInput('srch'); + html.submit('Go'); + html.AddTextPlain(' '); + html.checkbox('all', false, 'Tight'); + html.endForm; + html.Line; + html.ParaURL('Browse All Codes', sPrefix+'code=*'); + html.StartParagraph; + html.AddText('LOINC Axes', true, false); + html.EndParagraph; + PublishCode(sPrefix, FLoinc.root, html); + html.AddParagraph; + //html.AddText('LOINC Heirarchy', true, false); + //html.EndParagraph; + //PublishHeirarchyRoot(sPrefix, html); + //html.AddParagraph; - html.Line; - Lock.Lock; - Try - if FSearchCache.Count <> 0 Then - Begin - html.AddParagraph('Past Searches:'); - html.StartList; - For i := 0 to FSearchCache.Count - 1 Do - begin - html.StartListItem; - html.URL('Search for "'+FSearchCache[i]+'"', sPrefix+'srch='+FSearchCache[i]+'&caption=Search LOINC Codes&prompt=Text'); - html.EndListItem; - end; - html.EndList; - End; - Finally - Lock.UnLock; + html.Line; + Lock.Lock('PublishHome'); + Try + if FSearchCache.Count <> 0 Then + Begin + html.AddParagraph('Past Searches:'); + html.StartList; + For i := 0 to FSearchCache.Count - 1 Do + begin + html.StartListItem; + html.URL('Search for "'+FSearchCache[i]+'"', sPrefix+'srch='+FSearchCache[i]+'&caption=Search LOINC Codes&prompt=Text'); + html.EndListItem; + end; + html.EndList; End; + Finally + Lock.UnLock; End; loincFooter(html); html.Done; End; -function TloincPublisher.GetConceptDesc(iConcept : cardinal):String; -var - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; - lang : byte; -Begin - if iConcept = 0 then - result := '' - Else - Begin - FLoinc.Concepts.GetConcept(iConcept, langs, iName, iChildren, iCodes); - result := FLoinc.Desc.GetEntry(iname, lang); - End; -End; - - procedure TloincPublisher.loincFooter(html: THTMLPublisher); begin html.StartParagraph; html.AddTextPlain('LOINC Version: '); - html.AddTextPlain(FLoinc.version(nil)); + html.AddTextPlain(FLoinc.version); html.EndParagraph; end; +function codeKind(kind : TLoincProviderContextKind) : String; +begin + case kind of + lpckCode: result := 'Code'; + lpckPart: result := 'Part Code'; + lpckList : result := 'Answer List'; + lpckAnswer : result := 'Answer Code'; + else + result := '??'; + end; +end; + procedure TloincPublisher.PublishCode(const sPrefix, sCode: String; html: THTMLPublisher); var - iIndex : Cardinal; - iDescription, iOtherNames, iStems, iCategories : Cardinal; - sCode1, s, se : String; - iEntries : Cardinal; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, parents, children, concepts, descendentConcepts, stems, iCode, iText : Cardinal; - iFlags : Byte; - iRefs : TCardinalArray; - i, j : integer; - lang : byte; - found, match : boolean; + ci : TLoincProviderContext; + c : TFDBConnection; begin - iRefs := nil; - if FLoinc.CodeList.FindCode(sCode, iIndex) Then - Begin - FLoinc.CodeList.GetInformation(iIndex, langs, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - assert(sCode = sCode1); - html.Heading(1, 'LOINC Code '+sCode+' : '+FLoinc.Desc.GetEntry(iDescription, lang)); - html.StartTable(true); - if iComponent <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Component'); - html.AddTableCell(GetConceptDesc(iComponent)); - html.EndTableRow; - End; - if iProperty <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Property'); - html.AddTableCell(GetConceptDesc(iProperty)); - html.EndTableRow; - End; - if iTimeAspect <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Time Aspect'); - html.AddTableCell(GetConceptDesc(iTimeAspect)); - html.EndTableRow; - End; - if iSystem <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('System'); - html.AddTableCell(GetConceptDesc(iSystem)); - html.EndTableRow; - End; - if iScale <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Scale'); - html.AddTableCell(GetConceptDesc(iScale)); - html.EndTableRow; - End; - if iMethod <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Method'); - html.AddTableCell(GetConceptDesc(iMethod)); - html.EndTableRow; - End; - if iClass <> 0 Then - Begin - html.StartRow(); - html.AddTableCell('Class'); - html.AddTableCell(GetConceptDesc(iClass)); - html.EndTableRow; - End; - - html.StartRow(); - html.AddTableCell('Type'); - if iFlags and FLAGS_CLIN > 0 Then - html.AddTableCell('Clinical') - Else if iFlags and FLAGS_ATT > 0 Then - html.AddTableCell('Attachment') - Else if iFlags and FLAGS_SURV > 0 Then - html.AddTableCell('Survey') - Else - html.AddTableCell('Lab'); - html.EndTableRow; - - html.StartRow(); - html.AddTableCell('Status'); - if iFlags and FLAGS_HOLD > 0 Then - html.AddTableCell('Not yet final') - Else - html.AddTableCell('Final'); - html.EndTableRow; + if not FLoinc.Codes.TryGetValue(sCode, ci) then + html.AddParagraph('Unknown LOINC Code '+sCode) + else + begin + html.Heading(1, 'LOINC '+codeKind(ci.kind)+' '+sCode+' : '+ci.desc); + html.AddParagraph(); + c := FLoinc.DB.getConnection('PublishCode'); + try + html.Heading(2, 'Properties'); + html.StartTable(true); + c.select('Select RelationshipTypes.Description as Relationship, Codes.Code, Codes.Description as Value from Relationships, RelationshipTypes, Codes where Relationships.SourceKey = '+inttostr(ci.key)+' and Relationships.RelationshipTypeKey = RelationshipTypes.RelationshipTypeKey and Relationships.TargetKey = Codes.CodeKey'); + while c.fetchNext do + begin + html.StartRow(); + html.AddTableCell(c.colStringByName['Relationship']); + html.AddTableCell(c.colStringByName['Value']); + html.AddTableCellURL(c.colStringByName['Code'], sPrefix+'code='+c.colStringByName['Code']); + html.EndTableRow; + end; + c.terminate; - if iFlags and FLAGS_ROOT > 0 Then - Begin - html.StartRow(); - html.AddTableCell('Root'); - html.AddTableCell('This is a root of a set'); - html.EndTableRow; - End; + c.select('Select Description, Value from Properties, PropertyTypes, PropertyValues where CodeKey = '+inttostr(ci.key)+' and Properties.PropertyTypeKey = PropertyTypes.PropertyTypeKey and Properties.PropertyValueKey = PropertyValues.PropertyValueKey'); + while c.fetchNext do + begin + html.StartRow(); + html.AddTableCell(c.colStringByName['Description']); + html.AddTableCell(c.colStringByName['Value']); + html.AddTableCell(''); + html.EndTableRow; + end; + c.terminate; - if iFlags and FLAGS_UNITS > 0 Then - Begin + c.select('Select StatusCodes.Description from Codes, StatusCodes where CodeKey = '+inttostr(ci.key)+' and Codes.StatusKey != 0 and Codes.StatusKey = StatusCodes.StatusKey'); + while c.fetchNext do + while c.fetchNext do + begin + html.StartRow(); + html.AddTableCell('STATUS'); + html.AddTableCell(c.colStringByName['Description']); + html.AddTableCell(''); + html.EndTableRow; + end; + c.terminate; + html.endTable; + + html.Heading(2, 'Displays'); + html.StartTable(true); html.StartRow(); - html.AddTableCell('Units'); - html.AddTableCell('Units are required'); + case ci.Kind of + lpckCode: html.AddTableCell('LONG_COMMON_NAME'); + lpckPart: html.AddTableCell('PartDisplayName'); + lpckList: html.AddTableCell('LONG_COMMON_NAME'); + lpckAnswer: html.AddTableCell('LONG_COMMON_NAME'); + end; + html.AddTableCell('en-US'); + html.AddTableCell(ci.desc); html.EndTableRow; - End; - - html.StartRow(); - html.AddTableCell('Order/Obs Status'); - if (iFlags and FLAGS_ORDER> 0 ) and (iFlags and FLAGS_OBS> 0 ) Then - html.AddTableCell('Both') - Else if iFlags and FLAGS_ORDER > 0 Then - html.AddTableCell('Order') - Else if iFlags and FLAGS_OBS > 0 Then - html.AddTableCell('Observation') - Else - html.AddTableCell(''); - html.EndTableRow; - - html.EndTable; - html.AddParagraph(''); - if iOtherNames <> 0 Then - Begin - html.StartParagraph; - html.AddText('Other Names', true, false); - html.EndParagraph; - iRefs := FLoinc.Refs.GetRefs(iOtherNames); - html.StartTable(true); - for i := Low(iRefs) To High(iRefs) Do - if iRefs[i] <> 0 Then - begin - s := FLoinc.desc.GetEntry(iRefs[i], lang); - if useLang(lang) then - begin - html.StartRow(); - html.AddTableCell(s); - html.EndTableRow; - end; - End; - html.EndTable; - End; - - found := false; - for i := 0 to FLoinc.Entries.Count - 1 do - begin - FLoinc.Entries.GetEntry(i, iCode, iText, parents, children, concepts, descendentConcepts, stems); - se := FLoinc.Desc.GetEntry(iCode, lang); - - iRefs := FLoinc.Refs.GetRefs(descendentConcepts); - match := false; - for j := 0 to length(iRefs) - 1 do - if iRefs[j] = iIndex then - begin - match := true; - break; - end; - if match then + c.Select('Select Languages.Code as Lang, DescriptionTypes.Description as DType, Value from Descriptions, Languages, DescriptionTypes where CodeKey = '+inttostr(ci.key)+' and Descriptions.DescriptionTypeKey != 4 and Descriptions.DescriptionTypeKey = DescriptionTypes.DescriptionTypeKey and Descriptions.LanguageKey = Languages.LanguageKey'); + while c.fetchNext do begin - if not found then - begin - html.StartParagraph; - html.AddText('Categories', true, false); - html.EndParagraph; - html.StartTable(true); - found := true; - end; html.StartRow(); - html.AddTableCell(se); - html.AddTableCell(FLoinc.Desc.GetEntry(iText, lang)); + html.AddTableCell(c.ColStringByName['DType']); + html.AddTableCell(c.ColStringByName['Lang']); + html.AddTableCell(c.ColStringByName['Value']); html.EndTableRow; + end; + html.endTable; + c.terminate; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; end; end; - if found then - html.EndTable; - End - Else - html.AddParagraph('Unable to find code '+sCode); + end; html.line; html.ParaURL('LOINC Home', sPrefix); loincFooter(html); html.done; end; -procedure TloincPublisher.PublishConcept(bRoot : Boolean; const sPrefix, sId: String; iStart : Integer; html: THTMLPublisher); -var - aChildren : TCardinalArray; - aCodes : TCardinalArray; - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; - i : Integer; - iDummy : Cardinal; - b : Boolean; - - iDescription, iOtherNames, iStems, iCategories : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags, lang : Byte; - iEntries : Cardinal; - -begin - aChildren := nil; - aCodes := nil; - FLoinc.Concepts.GetConcept(StrToInt(sId), langs, iName, iChildren, iCodes); - if Not bRoot then - html.Heading(1, 'LOINC Concept '+FLoinc.Desc.GetEntry(iName, lang)); - - b := false; - - if iChildren <> 0 Then - begin - aChildren := FLoinc.Refs.GetRefs(iChildren); - html.StartTable(false, 'bare'); - html.StartTableRow; - html.StartTableCell; - html.AddParagraph(' '); - html.EndTableCell; - html.StartTableCell; - html.StartList; - For i := iStart to Min(iStart+MAX_ROWS, High(aChildren)) Do - Begin - if not b And (Length(aChildren) > 20) And ((i - iStart) / Min(MAX_ROWS, Length(aChildren)) >= 0.5) Then - Begin - html.EndList; - html.EndTableCell; - html.StartTableCell; - html.StartList; - b := true; - End; - FLoinc.Concepts.GetConcept(aChildren[i], langs, iName, iChildren, iDummy); - html.StartListItem; - html.URL(FLoinc.Desc.GetEntry(iName, lang), sPrefix + 'id='+inttostr(aChildren[i])); - html.EndListItem; - End; - html.EndList; - html.EndTableCell; - html.EndTableRow; - html.EndTable; - if (iStart > 0) or (iStart+MAX_ROWS < High(aChildren)) Then - Begin - html.StartParagraph; - if iStart > 0 Then - Begin - html.URL('Start', sPrefix+'id='+sId); - html.AddTextPlain(' '); - End; - if iStart > MAX_ROWS Then - Begin - html.URL('Previous', sPrefix+'id='+sId+'&start='+inttostr(iStart - MAX_ROWS)); - html.AddTextPlain(' '); - End; - html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(High(aChildren) div MAX_ROWS + 1), true, false); - if (iStart+MAX_ROWS < High(aChildren)) And (iStart + MAX_ROWS < MAX_ROWS * (High(aChildren) div MAX_ROWS)) Then - Begin - html.AddTextPlain(' '); - html.URL('Next', sPrefix+'id='+sId+'&start='+inttostr(iStart + MAX_ROWS)); - End; - if (iStart+MAX_ROWS < High(aChildren)) Then - Begin - html.AddTextPlain(' '); - html.URL('End', sPrefix+'id='+sId+'&start='+inttostr(MAX_ROWS * (High(aChildren) div MAX_ROWS))); - End; - html.EndParagraph; - End; - End; - - b := false; - if iCodes <> 0 Then - begin - aCodes := FLoinc.Refs.GetRefs(iCodes); - html.StartTable(false); - html.StartTableRow; - html.StartTableCell; - html.AddParagraph(' '); - html.EndTableCell; - html.StartTableCell; - For i := iStart to Min(iStart+MAX_ROWS, High(aCodes)) Do - Begin - if not b And (Length(aCodes) > 20) And ((i - iStart) / Min(MAX_ROWS, Length(aCodes)) >= 0.5) Then - Begin - html.EndTableCell; - html.StartTableCell; - b := true; - End; - FLoinc.CodeList.GetInformation(aCodes[i], nil, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - html.StartParagraph; - html.URL(sCode1, sPrefix + 'code='+sCode1); - html.AddTextPlain(': '+FLoinc.Desc.GetEntry(iDescription, lang)); - html.EndParagraph; - End; - html.EndTableCell; - html.EndTableRow; - html.EndTable; - if (iStart > 0) or (iStart+MAX_ROWS < High(aCodes)) Then - Begin - html.StartParagraph; - if iStart > 0 Then - Begin - html.URL('Start', sPrefix+'id='+sId); - html.AddTextPlain(' '); - End; - if iStart > MAX_ROWS Then - Begin - html.URL('Previous', sPrefix+'id='+sId+'&start='+inttostr(iStart - MAX_ROWS)); - html.AddTextPlain(' '); - End; - html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(High(aCodes) div MAX_ROWS + 1), true, false); - if (iStart+MAX_ROWS < High(aCodes)) And (iStart + MAX_ROWS < MAX_ROWS * (High(aCodes) div MAX_ROWS)) Then - Begin - html.AddTextPlain(' '); - html.URL('Next', sPrefix+'id='+sId+'&start='+inttostr(iStart + MAX_ROWS)); - End; - if (iStart+MAX_ROWS < High(aCodes)) Then - Begin - html.AddTextPlain(' '); - html.URL('End', sPrefix+'id='+sId+'&start='+inttostr(MAX_ROWS * (High(aCodes) div MAX_ROWS))); - End; - html.EndParagraph; - End; - End; - if not bRoot then - begin - html.line; - html.ParaURL('LOINC Home', sPrefix); - loincFooter(html); - html.done; - end; -end; - -procedure TloincPublisher.PublishCodes(const sPrefix: String; iStart: Integer; html: THTMLPublisher); -var - i : Integer; - iTotal : Integer; - b : Boolean; - - iDescription, iOtherNames, iStems, iCategories : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags, lang : Byte; -begin - b := false; - - if iStart = 0 then - html.Heading(1, 'All Loinc Codes') - else - html.Heading(1, 'All Loinc Codes (offset = '+inttostr(iStart)+')'); - - html.StartTable(false); - html.StartTableRow; - html.StartTableCell; - html.AddParagraph(' '); - html.EndTableCell; - html.StartTableCell; - html.StartList; - iTotal := FLoinc.CodeList.Count; - For i := iStart to Min(iStart+MAX_ROWS, iTotal) Do - Begin - if not b And ((i - iStart) / Min(MAX_ROWS, iTotal) >= 0.5) Then - Begin - html.EndList; - html.EndTableCell; - html.StartTableCell; - html.StartList; - b := true; - End; - FLoinc.CodeList.GetInformation(i, langs, sCode1, iDescription, iOtherNames, iStems, iEntries, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - html.StartListItem; - html.URL(sCode1, sPrefix + 'code='+sCode1); - html.AddTextPlain(': '+FLoinc.Desc.GetEntry(iDescription, lang)); - html.EndListItem; - End; - html.EndList; - html.EndTableCell; - html.EndTableRow; - html.EndTable; - if (iStart > 0) or (iStart+MAX_ROWS < iTotal) Then - Begin - html.StartParagraph; - if iStart > 0 Then - Begin - html.URL('Start', sPrefix+'code=*'); - html.AddTextPlain(' '); - End; - if iStart > MAX_ROWS Then - Begin - html.URL('Previous', sPrefix+'code=*&start='+inttostr(iStart - MAX_ROWS)); - html.AddTextPlain(' '); - End; - html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(iTotal div MAX_ROWS + 1), true, false); - if (iStart+MAX_ROWS < iTotal) And (iStart + MAX_ROWS < MAX_ROWS * (iTotal div MAX_ROWS)) Then - Begin - html.AddTextPlain(' '); - html.URL('Next', sPrefix+'code=*&start='+inttostr(iStart + MAX_ROWS)); - End; - if (iStart+MAX_ROWS < iTotal) Then - Begin - html.AddTextPlain(' '); - html.URL('End', sPrefix+'code=*&start='+inttostr(MAX_ROWS * (iTotal div MAX_ROWS))); - End; - html.EndParagraph; - End; - html.line; - html.ParaURL('LOINC Home', sPrefix); -end; - constructor TloincPublisher.Create(oLoinc : TLoincServices; FHIRPathEngine : String; langList : THTTPLanguageList); begin inherited Create; @@ -903,7 +333,6 @@ constructor TloincPublisher.Create(oLoinc : TLoincServices; FHIRPathEngine : Str FSearchCache.Sorted := true; FLoinc := oLoinc.Link; FFHIRPath := FHIRPathEngine; - langs := FLoinc.langsForLang(langList); end; destructor TloincPublisher.Destroy; @@ -918,148 +347,160 @@ destructor TloincPublisher.Destroy; inherited; end; -Type - TSearchCache = class (TObject) - public - a : TMatchArray; - End; - procedure TloincPublisher.PublishSearch(const sPrefix, sText: String; iStart: Integer; all : boolean; html: THTMLPublisher); - //procedure AddParent(p : Cardinal); - //var - // code, text, parent, children, concepts, descendentConcepts, stems, iCategories : Cardinal; - // lang : byte; - //begin - // FLoinc.Entries.GetEntryH(p, code, text, parent, children, concepts, descendentConcepts, stems); - // if (parent <> NO_PARENT) then - // begin - // AddParent(parent); - // html.AddTextPlain(' / '); - // end; - // html.URL(FLoinc.Desc.GetEntry(text, lang), sPrefix+'macode='+FLoinc.Desc.GetEntry(code, lang)); - //end; - var - a : TMatchArray; - i : integer; - o : TSearchCache; - iTotal : Integer; -// iDummy : Cardinal; - - iDescription, iOtherNames, iStems, iCategories : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags, ilang : Byte; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; + ci : TLoincProviderContext; + c : TFDBConnection; + k : TKeySet; begin - Lock.Lock; - Try - if FSearchCache.Find(sText, i) Then - a := TSearchCache(FSearchCache.Objects[i]).a - else - Begin - a := FLoinc.Search(sText, all); - o := TSearchCache.Create; - o.a := a; - FSearchCache.AddObject(sText, o); - End; - Finally - Lock.Unlock; - End; - html.Heading(1, 'Search LOINC for '+sText); - - html.StartTable(false); - html.StartTableRow; - html.AddTableCell('Code'); - html.AddTableCell('Description'); - html.AddTableCell('Component'); - html.AddTableCell('Property'); - html.AddTableCell('Time Aspect'); - html.AddTableCell('System'); - html.AddTableCell('Scale'); - html.AddTableCell('Method'); - html.AddTableCell('Class'); - html.AddTableCell('Rating'); - html.EndTableRow; - iTotal := Length(a)-1; - - - For i := iStart to Min(iStart+MAX_ROWS, iTotal) Do - Begin - html.StartTableRow; - if a[i].kind = lpckCode then - begin - FLoinc.CodeList.GetInformation(a[i].index, nil, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - html.AddTableCellURL(sCode1, sPrefix + 'code='+sCode1); - html.AddTableCell(FLoinc.Desc.GetEntry(iDescription, ilang)); - html.AddTableCell(GetConceptDesc(iComponent)); - html.AddTableCell(GetConceptDesc(iProperty)); - html.AddTableCell(GetConceptDesc(iTimeAspect)); - html.AddTableCell(GetConceptDesc(iSystem)); - html.AddTableCell(GetConceptDesc(iScale)); - html.AddTableCell(GetConceptDesc(iMethod)); - html.AddTableCell(GetConceptDesc(iClass)); - html.AddTableCell(RealToString(a[i].Priority)); - end - else - begin - FLoinc.Entries.GetEntry(a[i].index, code, text, parents, children, concepts, descendentConcepts, stems); - sCode1 := FLoinc.Desc.GetEntry(code, ilang); - html.AddTableCellURL(sCode1, sPrefix + 'macode='+sCode1); - html.AddTableCell(FLoinc.Desc.GetEntry(text, ilang)); - html.StartTableCell(7); - //html.AddTextPlain('Heirarchy: '); - //if (parent = NO_PARENT) then - // html.AddTextPlain('(root)') - //else - // AddParent(parent); - html.EndTableCell; - html.AddTableCell(RealToString(a[i].Priority - 1000000)); + html.Heading(1, 'LOINC search for '+sText); + html.AddParagraph(); + k := TKeySet.create; + try + c := FLoinc.DB.getConnection('PublishSearch'); + try + html.StartTable(true); + c.select('SELECT CodeKey FROM TextIndex WHERE Text MATCH '''+SQLWrapString(sText)+''';'); + while c.fetchNext do + begin + if k.addKey(c.ColKeyByName['CodeKey']) then + begin + ci := FLoinc.CodeList[c.ColKeyByName['CodeKey']]; + html.StartRow(); + html.AddTableCellURL(ci.code, sPrefix+'code='+ci.code); + html.AddTableCell(CODES_TLoincProviderContextKind[ci.Kind]); + html.AddTableCell(ci.Desc); + html.EndTableRow; + end; + end; + c.terminate; + html.endTable; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; + end; end; - html.EndTableRow; - End; - html.EndTable; - if (iStart > 0) or (iStart+MAX_ROWS < iTotal) Then - Begin - html.StartParagraph; - if iStart > 0 Then - Begin - html.URL('Start', sPrefix+'srch='+sText); - html.AddTextPlain(' '); - End; - if iStart > MAX_ROWS Then - Begin - html.URL('Previous', sPrefix+'srch='+sText+'&start='+inttostr(iStart - MAX_ROWS)); - html.AddTextPlain(' '); - End; - html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(iTotal div MAX_ROWS + 1), true, false); - if (iStart+MAX_ROWS < iTotal) And (iStart + MAX_ROWS < MAX_ROWS * (iTotal div MAX_ROWS)) Then - Begin - html.AddTextPlain(' '); - html.URL('Next', sPrefix+'srch='+sText+'&start='+inttostr(iStart + MAX_ROWS)); - End; - if (iStart+MAX_ROWS < iTotal) Then - Begin - html.AddTextPlain(' '); - html.URL('End', sPrefix+'srch='+sText+'&start='+inttostr(MAX_ROWS * (iTotal div MAX_ROWS))); - End; - html.EndParagraph; - End; + finally + k.free; + end; html.line; html.ParaURL('LOINC Home', sPrefix); loincFooter(html); html.done; -end; - -function TloincPublisher.useLang(lang: byte): boolean; -var - b: byte; -begin - result := false; - for b in langs do - if b = lang then - exit(true); +//var +// a : TMatchArray; +// i : integer; +// o : TSearchCache; +// iTotal : Integer; +//// iDummy : Cardinal; +// +// iDescription, iOtherNames, iStems, iCategories : Cardinal; +// iEntries : Cardinal; +// sCode1 : String; +// iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; +// iFlags, ilang : Byte; +// code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; +//begin +// Lock.Lock('PublishSearch'); +// Try +// if FSearchCache.Find(sText, i) Then +// a := TSearchCache(FSearchCache.Objects[i]).a +// else +// Begin +// a := FLoinc.Search(sText, all); +// o := TSearchCache.Create; +// o.a := a; +// FSearchCache.AddObject(sText, o); +// End; +// Finally +// Lock.Unlock; +// End; +// html.Heading(1, 'Search LOINC for '+sText); +// +// html.StartTable(false); +// html.StartTableRow; +// html.AddTableCell('Code'); +// html.AddTableCell('Description'); +// html.AddTableCell('Component'); +// html.AddTableCell('Property'); +// html.AddTableCell('Time Aspect'); +// html.AddTableCell('System'); +// html.AddTableCell('Scale'); +// html.AddTableCell('Method'); +// html.AddTableCell('Class'); +// html.AddTableCell('Rating'); +// html.EndTableRow; +// iTotal := Length(a)-1; +// +// +// For i := iStart to Min(iStart+MAX_ROWS, iTotal) Do +// Begin +// html.StartTableRow; +// if a[i].kind = lpckCode then +// begin +// FLoinc.CodeList.GetInformation(a[i].index, nil, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); +// html.AddTableCellURL(sCode1, sPrefix + 'code='+sCode1); +// html.AddTableCell(FLoinc.Desc.GetEntry(iDescription, ilang)); +// html.AddTableCell(GetConceptDesc(iComponent)); +// html.AddTableCell(GetConceptDesc(iProperty)); +// html.AddTableCell(GetConceptDesc(iTimeAspect)); +// html.AddTableCell(GetConceptDesc(iSystem)); +// html.AddTableCell(GetConceptDesc(iScale)); +// html.AddTableCell(GetConceptDesc(iMethod)); +// html.AddTableCell(GetConceptDesc(iClass)); +// html.AddTableCell(RealToString(a[i].Priority)); +// end +// else +// begin +// FLoinc.Entries.GetEntry(a[i].index, code, text, parents, children, concepts, descendentConcepts, stems); +// sCode1 := FLoinc.Desc.GetEntry(code, ilang); +// html.AddTableCellURL(sCode1, sPrefix + 'macode='+sCode1); +// html.AddTableCell(FLoinc.Desc.GetEntry(text, ilang)); +// html.StartTableCell(7); +// //html.AddTextPlain('Heirarchy: '); +// //if (parent = NO_PARENT) then +// // html.AddTextPlain('(root)') +// //else +// // AddParent(parent); +// html.EndTableCell; +// html.AddTableCell(RealToString(a[i].Priority - 1000000)); +// end; +// html.EndTableRow; +// End; +// html.EndTable; +// if (iStart > 0) or (iStart+MAX_ROWS < iTotal) Then +// Begin +// html.StartParagraph; +// if iStart > 0 Then +// Begin +// html.URL('Start', sPrefix+'srch='+sText); +// html.AddTextPlain(' '); +// End; +// if iStart > MAX_ROWS Then +// Begin +// html.URL('Previous', sPrefix+'srch='+sText+'&start='+inttostr(iStart - MAX_ROWS)); +// html.AddTextPlain(' '); +// End; +// html.AddText('Page '+ inttostr((iStart div MAX_ROWS) + 1)+' of '+inttostr(iTotal div MAX_ROWS + 1), true, false); +// if (iStart+MAX_ROWS < iTotal) And (iStart + MAX_ROWS < MAX_ROWS * (iTotal div MAX_ROWS)) Then +// Begin +// html.AddTextPlain(' '); +// html.URL('Next', sPrefix+'srch='+sText+'&start='+inttostr(iStart + MAX_ROWS)); +// End; +// if (iStart+MAX_ROWS < iTotal) Then +// Begin +// html.AddTextPlain(' '); +// html.URL('End', sPrefix+'srch='+sText+'&start='+inttostr(MAX_ROWS * (iTotal div MAX_ROWS))); +// End; +// html.EndParagraph; +// End; +// html.line; +// html.ParaURL('LOINC Home', sPrefix); +// loincFooter(html); +// html.done; end; function TloincPublisher.sizeInBytesV(magic : integer) : cardinal; diff --git a/library/ftx/ftx_loinc_services.pas b/library/ftx/ftx_loinc_services.pas index 947031e24..5a9de9245 100644 --- a/library/ftx/ftx_loinc_services.pas +++ b/library/ftx/ftx_loinc_services.pas @@ -28,13 +28,16 @@ POSSIBILITY OF SUCH DAMAGE. } +// Component:property:time:system:scale:method + {$I fhir.inc} Interface Uses SysUtils, Classes, Generics.Collections, {$IFDEF FPC} LazUTF8,{$ELSE} IOUtils, RegularExpressions, {$ENDIF} - fsl_base, fsl_utilities, fsl_stream, fsl_collections, fsl_fpc, fsl_lang, fsl_http, fsl_regex, + fsl_base, fsl_utilities, fsl_stream, fsl_collections, fsl_fpc, fsl_lang, fsl_http, fsl_regex, fsl_i18n, fsl_threads, + fdb_manager, fdb_sqlite3, fhir_objects, fhir_common, fhir_utilities, fhir_factory, fhir_features, fhir_uris, fhir_cdshooks, ftx_service; @@ -55,396 +58,136 @@ order/obs v2 & v3 data type } -Const - LOINC_CACHE_VERSION_CURRENT = '13'; - - CL_OFFSET_Description = 0; - CL_OFFSET_OtherNames = 4; - CL_OFFSET_Component = 8; - CL_OFFSET_Property = 12; - CL_OFFSET_TimeAspect = 16; - CL_OFFSET_System = 20; - CL_OFFSET_Scale = 24; - CL_OFFSET_Method = 28; - CL_OFFSET_Class = 32; - CL_OFFSET_Flags = 36; - CL_OFFSET_Stems = 37; - CL_OFFSET_Entry = 41; - -Type - TLangArray = array of byte; - TLoincPropertyType = (lptComponents, lptProperties, lptTimeAspects, lptSystems, lptScales, lptMethods, lptClasses); - TLoincProviderContextKind = (lpckCode, lpckPart, lpckAnswer); - -type - // We store LOINC as five structures. - // the first structure is a simply a list of strings which are variable length names - referred to from the other structures - // the second structure is a list of lists of word or cardinal references. - // the third structure is a list of concepts. each concept has a ref0ernce to a name and a contained list of references which are either children - // the fourth structure is the code list - a list of loinc concepts, with codes and references to names and properties - // the fifth structure is the multi-axial heirarchy - parent, children, concepts, and descendent concepts - - // 0. language list - TLoincLanguages = class (TFslObject) - private - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - public - procedure GetEntry(iIndex : byte; var lang, country : String); - function count : integer; - - Procedure StartBuild; - Function AddEntry(lang, country: String) : byte; - Procedure DoneBuild; - end; - - // 1. a list of strings - // each entry in the String starts with a byte length, and then the series of characters (2 bytes) - // we store loinc descriptions, and other names in here - TLoincStrings = class (TFslObject) - Private - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Function GetEntry(iIndex : Cardinal; var lang : byte):String; - - Procedure StartBuild; - Function AddEntry(lang : byte; Const s : String) : Cardinal; - Procedure DoneBuild; - End; - - TWordArray = array of word; - TCardinalArray = array of Cardinal; - TCardinalArrayArray = array of TCardinalArray; - - TConceptReference = packed record - index : cardinal; - kind : TLoincProviderContextKind; - end; - TConceptReferenceArray = array of TConceptReference; - - TMatch = record - index : cardinal; - kind : TLoincProviderContextKind; - code : String; - Priority : Double; - End; - - TMatchArray = Array of TMatch; - const - FLAG_LONG_COMMON = 1; - FLAG_LONG_RELATED = 2; - CONCEPT_LENGTH = 13; - -Type - // word index. Every word is 5 bytes - a 4 byte index into the strings, and a 1 byte flag - TLoincWords = class (TFslObject) - Private - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Procedure GetEntry(iIndex : Cardinal; var index : Cardinal; var flags : Byte); - Function Count : Integer; - Function GetString(iIndex : Cardinal) : Cardinal; + LOINC_KEY_CLASS = 3; + LOINC_KEY_SCALE = 30; + LOINC_KEY_COMPONENT = 4; + LOINC_KEY_PROPERTY = 14; + LOINC_KEY_TIME = 34; + LOINC_KEY_SYSTEM = 33; + LOINC_KEY_METHOD = 13; - Procedure StartBuild; - Procedure AddWord(index : Cardinal; Flags : Byte); - Procedure DoneBuild; - End; + KEY_INCREMENT = 10; - // stem word index. Every word is 4 bytes - a 4 byte index into the strings - TLoincStems = class (TFslObject) - Private - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Procedure GetEntry(iIndex : Cardinal; var index : Cardinal); - Function Count : Integer; - Function GetString(iIndex : Cardinal) : Cardinal; - Procedure StartBuild; - Procedure AddStem(index : Cardinal); - Procedure DoneBuild; - End; +type + TKeyArray = array of cardinal; + TLoincProviderContextKind = (lpckCode, lpckPart, lpckList, lpckAnswer); - // 2. a list of list of references - TLOINCReferences = class (TFslObject) - Private - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Function GetRefs(iIndex : Cardinal) : TCardinalArray; - Function Getlength(iIndex : Cardinal) : Cardinal; + { TKeySet } - Procedure StartBuild; - Function AddRefs(Const a : TCardinalArray) : Cardinal; - Procedure DoneBuild; - End; + TKeySet = class (TFslObject) + private + FKeys : TKeyArray; + FCount : integer; + public + function addKey(key : integer) : boolean; + procedure close; + property Keys : TKeyArray read FKeys; + end; - // 3. a list of concepts - TLOINCConcepts = class (TFslObject) - Private - FRefs:TLOINCReferences; // no own - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - function getForLang(langs : TLangArray; ref : cardinal) : cardinal; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - constructor Create(refs : TLOINCReferences); - Procedure GetConcept(iIndex : Cardinal; langs : TLangArray; var iName : Cardinal; var iChildren : Cardinal; var iConcepts : Cardinal); + { TDescriptionCacheEntry } + TDescriptionCacheEntry = class (TFslObject) + private + FDisplay : boolean; + FLang : String; + FValue : String; + public + constructor create(display : boolean; lang: String; value : String); - Procedure StartBuild; - Function AddConcept(iName : Cardinal; childByLang : boolean; iChildren : Cardinal; iConcepts : Cardinal) : Cardinal; - Procedure DoneBuild; + property display : boolean read FDisplay; + property lang : String read FLang; + property value : String read FValue; + end; - End; + { TLoincProviderContext } - // 4. the master code reference. - // it is a list of codes and the offset reference to their description - // codes are stored in alphabetical order so you can do a binary serach for Code identity - // This is the effective logical structure of the bytes: -// TLOINCCode = {private} packed record -// Code : Char[FCodeLength]; padded with spaces (2 bytes per char) -// Description : Cardinal; -// other names : cardinal -// component : word -// Property : word -// TimeAspect : word -// System : word -// Scale : word -// Method : word -// Class : word -// flags : byte -// stems : Cardinal -// End; -Const - FLAGS_ROOT = $01; - FLAGS_UNITS = $02; - FLAGS_ORDER = $04; - FLAGS_OBS = $08; - FLAGS_HOLD = $10; - FLAGS_CLIN = $20; - FLAGS_ATT = $40; - FLAGS_SURV = $80; - -Type - - { TLOINCCodeList } - - TLOINCCodeList = class (TFslObject) - Private - FRefs:TLOINCReferences; // no own - FCodeLength, FReclength : Cardinal; - FMaster : TBytes; - FLength : Cardinal; - FBuilder : TFslBytesBuilder; - procedure SetCodeLength(const Value: Cardinal); - function getForLang(langs : TLangArray; ref : cardinal) : cardinal; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - constructor Create(refs : TLOINCReferences); + TLoincProviderContext = class (TCodeSystemProviderContext) + private + FKey: cardinal; + FKind : TLoincProviderContextKind; + FCode : String; + FDesc : String; + FDisplays : TFslList; + FChildren : TKeySet; + procedure addChild(key : Integer); + public + constructor Create(key : cardinal; kind : TLoincProviderContextKind; code, desc : String); destructor Destroy; override; + function link : TLoincProviderContext; overload; - Function FindCode(sCode : String; var iIndex : Cardinal) : Boolean; - - Procedure GetInformation(iIndex: Cardinal; langs : TLangArray; var sCode : String; var iDescription, iOtherNames, iEntries, iStems : Cardinal; var iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : cardinal; var iFlags : Byte); - - // we presume that the Codes are registered in order - Procedure StartBuild; - Function AddCode(sCode : String; iDescriptions, iOtherNames, iEntries : Cardinal; iFlags : Byte) : Cardinal; - Procedure DoneBuild; - - // these need to be called after Done Build - Procedure SetComponents(iIndex : Cardinal; iValue : cardinal); - Procedure SetPropertys(iIndex : Cardinal; iValue : cardinal); - Procedure SetTimeAspects(iIndex : Cardinal; iValue : cardinal); - Procedure SetSystems(iIndex : Cardinal; iValue : cardinal); - Procedure SetScales(iIndex : Cardinal; iValue : cardinal); - Procedure SetMethods(iIndex : Cardinal; iValue : cardinal); - Procedure SetClasses(iIndex : Cardinal; iValue : cardinal); - Procedure SetStems(iIndex : Cardinal; iValue : Cardinal); - - Function Count : Cardinal; - Property CodeLength : Cardinal read FCodeLength Write SetCodeLength; - End; - - // 5. the multi-axial heirachy - // it is a list of entries - // This is the effective logical structure of the bytes: -// TLOINCEntry = {private} packed record -// code : Cardinal; -// text : Cardinal; -// children : Cardinal; -// concepts : Cardinal; -// descendentconcepts : Cardinal; -// End; - - TLOINCHeirarchyEntryList = class (TFslObject) - Private - FMaster : TBytes; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Function FindCode(sCode : String; var iIndex : Cardinal; Strings : TLoincStrings) : Boolean; - Procedure GetEntry(iIndex: Cardinal; var code, text, parents, children, concepts, descendentConcepts, stems : Cardinal); - - // we presume that the Codes are registered in order - Procedure StartBuild; - Function AddEntry(code, text, parents, children, concepts, descendentConcepts : Cardinal) : Cardinal; - Procedure DoneBuild; - - // this needs to be called after Done Build - Procedure SetStems(iIndex : Cardinal; iValue : Cardinal); - - Function Count : Integer; - End; - - TLOINCAnswersList = class (TFslObject) - Private - FMaster : TBytes; - FBuilder : TFslBytesBuilder; - protected - function sizeInBytesV(magic : integer) : cardinal; override; - Public - Function FindCode(sCode : String; var iIndex : Cardinal; Strings : TLoincStrings) : Boolean; - Procedure GetEntry(iIndex: Cardinal; var code, description, answers : Cardinal); - - // we presume that the Codes are registered in order - Procedure StartBuild; - Function AddEntry(code, description, answers : Cardinal) : Cardinal; - Procedure DoneBuild; - - Function Count : cardinal; - End; - - - TLoincSubsetId = (lsiNull, lsiAll, lsiOrder, lsiObs, lsiOrderObs, lsiOrderSubset, lsiTypeObservation, lsiTypeClinical, lsiTypeAttachment, - lsiTypeSurvey, lsiInternal, lsi3rdParty, lsiActive, lsiDeprecated, lsiDiscouraged, lsiTrial); - TLoincSubsets = Array [TLoincSubsetId] of Cardinal; - TLoincPropertyIds = Array [TLoincPropertyType] of Cardinal; + property Key: cardinal read FKey; + property Kind : TLoincProviderContextKind read FKind; + property Code : String read FCode; + property Desc : String read FDesc; + end; + { TLoincDisplay } - TLoincProviderContext = class (TCodeSystemProviderContext) + TLoincDisplay = class (TFslObject) private - FIndex: cardinal; - FKind: TLoincProviderContextKind; + FLanguage : String; + FValue : String; public - constructor Create(kind : TLoincProviderContextKind; index : cardinal); - property kind : TLoincProviderContextKind read FKind write FKind; - property index : cardinal read FIndex write FIndex; + constructor create(lang, v : String); + property Language : String read FLanguage; + property Value : String read FValue; end; + { TLoincIteratorContext } + + TLoincIteratorContext = class (TCodeSystemIteratorContext) + private + FKeys : TKeyArray; + public + constructor create(ctxt : TLoincProviderContext; keys : TKeyArray); + function more : boolean; override; + end; { TLoincFilterHolder } TLoincFilterHolder = class (TCodeSystemProviderFilterContext) private - FIndex: integer; - FChildren : TConceptReferenceArray; - procedure SetChildren(children : TConceptReferenceArray); - function HasChild(kind : TLoincProviderContextKind; v : integer) : boolean; + FKeys : TKeyArray; + FCursor : integer; + lsql : String; + function HasKey(key : cardinal) : boolean; end; { TLOINCServices } TLOINCServices = class (TCodeSystemProvider) Private - FLang : TLoincLanguages; - FDesc : TLoincStrings; - FCode : TLOINCCodeList; - FRefs : TLOINCReferences; - FConcepts : TLOINCConcepts; - FProperties : TLoincPropertyIds; - FSubsets : TLoincSubsets; - FWords : TLoincWords; - FStems : TLoincStems; - FEntries : TLOINCHeirarchyEntryList; - FAnswerLists : TLOINCAnswersList; - FHeirarchyRoots : TCardinalArray; - - FRoot : Cardinal; - FLoaded: Boolean; - FVersion: String; - FKey: integer; - function FindStem(s: String; var index: Integer): Boolean; - function FilterByPropertyId(prop : TLoincPropertyType; op: TFhirFilterOperator; value: String): TCodeSystemProviderFilterContext; - function FilterBySubset(op: TFhirFilterOperator; subset : TLoincSubsetId): TCodeSystemProviderFilterContext; - function FilterByList(op: TFhirFilterOperator; list : String): TCodeSystemProviderFilterContext; - function FilterByHeirarchy(op: TFhirFilterOperator; value: String; transitive: boolean): TCodeSystemProviderFilterContext; - function FilterByIsA(value: String; this: boolean): TCodeSystemProviderFilterContext; - function GetConceptDesc(iConcept : cardinal; langs : TLangArray):String; - function useLang(lang : byte; langs : TLangArray; incLast : boolean) : boolean; - function langDesc(iLang : word) : String; - function allLangs : TLangArray; + FLock : TFslLock; + FDB : TFDBManager; + FLangs : TDictionary; + FCodes : TFslMap; + FCodeList : TFslList; + FVersion : String; + FRoot : String; + FFirstCodeKey : integer; + FRelationships : TDictionary; + FProperties : TDictionary; + FStatusKeys : TDictionary; + function filterBySQL(c : TFDBConnection; sql, lsql : String) : TCodeSystemProviderFilterContext; protected function sizeInBytesV(magic : integer) : cardinal; override; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TLOINCServices; Overload; Procedure Load(Const sFilename : String); class function checkFile(Const sFilename : String) : String; - Procedure Save(Const sFilename : String; statedDate : String); - function langsForLang(langList : THTTPLanguageList): TLangArray; - function supportsLang(langList : THTTPLanguageList): boolean; - - Function GetDisplayByName(Const sCode : String; langs : TLangArray) : String; - procedure GetDisplaysByName(Const sCode : String; langs : TLangArray; list : TConceptDesignations); - Function Search(sText : String; all: boolean) : TMatchArray; overload; - Function GetPropertyId(aType : TLoincPropertyType; langs : TLangArray; const sName : String) : cardinal; - Function GetPropertyCodes(iProp : cardinal) : TCardinalArray; - Function GetConceptName(iConcept : cardinal): String; - Function IsCode(sCode : String): Boolean; - Function IsMACode(sCode : String): Boolean; - - Property Lang : TLoincLanguages read FLang; - Property Desc : TLoincStrings read FDesc; - Property Refs : TLOINCReferences read FRefs; - Property Concepts : TLOINCConcepts read FConcepts; - Property CodeList : TLOINCCodeList read FCode; - Property Words : TLoincWords read FWords; - Property Stems : TLoincStems read FStems; - Property Entries : TLOINCHeirarchyEntryList read FEntries; - Property AnswerLists : TLOINCAnswersList read FAnswerLists; - - - Property Root : Cardinal read FRoot write FRoot; - Property Loaded : Boolean read FLoaded write FLoaded; - Property LOINCVersion : String read FVersion write FVersion; - Property Properties : TLoincPropertyIds read FProperties Write FProperties; - Property HeirarchyRoots : TCardinalArray read FHeirarchyRoots write FHeirarchyRoots; - Property Key : integer read FKey write FKey; - Property Subsets : TLoincSubsets read FSubsets Write FSubsets; function description : String; override; function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function findMAConcept(code : String) : Cardinal; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + //function findMAConcept(code : String) : Cardinal; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -455,6 +198,7 @@ TLOINCServices = class (TCodeSystemProvider) procedure Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); override; function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; @@ -469,6 +213,15 @@ TLOINCServices = class (TCodeSystemProvider) //function subsumes(codeA, codeB : String) : String; override; procedure defineFeatures(features : TFslList); override; + + property DB : TFDBManager read FDB; + property Langs : TDictionary read FLangs; + property Codes : TFslMap read FCodes; + property CodeList : TFslList read FCodelist; + property VersionStr : String read FVersion; + property Root : String read FRoot; + property Relationships : TDictionary read FRelationships; + property Properties : TDictionary read FProperties; End; TLOINCServiceList = class (TFslObjectList) @@ -483,7 +236,6 @@ TLOINCServiceList = class (TFslObjectList) Public destructor Destroy; Override; - Function GetByKey(sKey : String) : TLOINCServices; Function GetServiceByName(sName : String) : TLOINCServices; Function HasDefaultService : Boolean; @@ -494,8 +246,8 @@ TLOINCServiceList = class (TFslObjectList) End; //function utfcopy(s : TBytes; start, length : integer) : String; -function nolang : TLangArray; - +//function nolang : TLangArray; +// function memU8toString(bytes : TBytes; index, chars : integer) : String; function memU16ToString(const bytes : TBytes; index : cardinal; chars : word) : String; function pct(i, t : integer) : String; @@ -543,1760 +295,617 @@ function memU8toString(bytes : TBytes; index, chars : integer) : String; {$ENDIF} end; -{ TLoincStrings } - -function TLoincStrings.GetEntry(iIndex: Cardinal; var lang : byte): String; -var - l : word; - b : TBytes; -begin - result := ''; - if iIndex > 0 Then - begin - if (iIndex > FLength) then - Raise ETerminologyError.Create('Wrong length index getting LOINC name', itException); - move(FMaster[iIndex], l, 2); - if (iIndex + 3 + (l * 2) > FLength) then - raise ETerminologyError.create('Wrong length index getting LOINC name (2)', itException); - lang := FMaster[iIndex+2]; - if l > 0 Then - begin - b := copy(FMaster, iIndex+3, l); - try - result := TEncoding.UTF8.getString(b); - except - raise EFslException.Create('Unable to Read LOINC source String @'+inttostr(iIndex+3)+'+'+inttostr(l)); - end; - end; - end; -end; -function TLoincStrings.AddEntry(lang : byte; const s: String): Cardinal; -var - i : word; - b : TBytes; -begin - result := FBuilder.Length; - b := TEncoding.UTF8.GetBytes(s); - if Length(b) > 65535 Then - raise ETerminologyError.create('LOINC Description too long: '+inttostr(s.length), itException); - i := length(b); - FBuilder.AddWord(i); - FBuilder.Append(lang); - if (i > 0) then - FBuilder.Append(b); -end; +{ TLOINCServices } -procedure TLoincStrings.DoneBuild; +constructor TLOINCServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster); - FBuilder.free; + inherited; + FLangs := TDictionary.create; + FCodes := TFslMap.create; + FCodes.DefaultValue := nil; + FCodeList := TFslList.create; + FRelationships := TDictionary.create; + FProperties := TDictionary.create; + FStatusKeys := TDictionary.create; + FLock := TFslLock.create('LOINC'); end; -procedure TLoincStrings.StartBuild; +destructor TLOINCServices.Destroy; begin - FBuilder := TFslBytesBuilder.Create; -end; + FRelationships.free; + FProperties.free; + FStatusKeys.free; -function TLoincStrings.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); + FCodeList.free; + FCodes.free; + FLangs.free; + FLock.free; + inherited; end; -{ TLOINCReferences } - -Function TLOINCReferences.GetRefs(iIndex: Cardinal) : TCardinalArray; -var - i : integer; - lw : cardinal; +function TLOINCServices.Link: TLOINCServices; begin - if (iIndex > FLength) then - raise ETerminologyError.create('Wrong length index getting LOINC list', itException); - move(FMaster[iIndex], lw, 4); - SetLength(Result, lw); - inc(iIndex, 4); - for i := 0 to Length(result)-1 Do - Begin - move(FMaster[iIndex], result[i], 4); - inc(iIndex, 4); - End; + result := TLOINCServices(inherited Link); end; -Function TLOINCReferences.AddRefs(Const a : TCardinalArray) : Cardinal; -var - iLoop : Integer; -Begin - if (length(a) = 0) then - exit(0); - - result := FBuilder.Length; - FBuilder.AddCardinal(length(a)); - for iLoop := Low(a) to High(a) Do - FBuilder.AddCardinal(a[iLoop]); -End; - -procedure TLOINCReferences.DoneBuild; +procedure TLOINCServices.defineFeatures(features: TFslList); begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster); - FBuilder.free; + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'SCALE_TYP:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'SCALE_TYP:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'CLASS:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'COMPONENT:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'PROPERTY:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'TIME_ASPCT:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'SYSTEM:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'METHOD_TYP:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'ORDER_OBS:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'CLASSTYPE:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'STATUS:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'copyright:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'parent:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'ancestor:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:is-a')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:descends')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'LIST:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'TYPE:equals')); end; -procedure TLOINCReferences.StartBuild; +function TLOINCServices.Definition(context: TCodeSystemProviderContext): string; begin - FBuilder := TFslBytesBuilder.Create; - FBuilder.AddCardinal(0); // placeholder for 0 + result := ''; end; -function TLOINCReferences.Getlength(iIndex: Cardinal): Cardinal; +function TLOINCServices.isNotClosed(textFilter: TSearchFilterText; propFilter: TCodeSystemProviderFilterContext): boolean; begin - if (iIndex > FLength) then - raise ETerminologyError.create('Wrong length index getting LOINC list', itException); - move(FMaster[iIndex], result, 4); + result := false; end; -function TLOINCReferences.sizeInBytesV(magic : integer) : cardinal; +function TLOINCServices.description: String; begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); + result := 'LOINC'; end; -{ TLOINCConcepts } - -Procedure TLOINCConcepts.GetConcept(iIndex : Cardinal; langs : TLangArray; var iName : Cardinal; var iChildren : Cardinal; var iConcepts : Cardinal); +procedure TLOINCServices.Load(const sFilename: String); var - b : byte; + c : TFDBConnection; + i, k : integer; + ci : TLoincProviderContext; + s : String; begin - if (iIndex >= FLength) then - raise ETerminologyError.create('Wrong length index getting LOINC name', itException); - Move(FMaster[iIndex*CONCEPT_LENGTH+0], iName, 4); - Move(FMaster[iIndex*CONCEPT_LENGTH+4], b, 1); - Move(FMaster[iIndex*CONCEPT_LENGTH+5], iChildren, 4); - Move(FMaster[iIndex*CONCEPT_LENGTH+9], iConcepts, 4); - if b <> 0 then - iChildren := getForLang(langs, iChildren); -end; + FDB := TFDBSQLiteManager.create('db', sFilename, true, false, 10); + c := FDB.GetConnection('load'); + try + c.sql := 'Select LanguageKey, Code from Languages'; + c.prepare; + c.Execute; + while c.fetchnext do + FLangs.Add(c.ColStringByName['Code'], c.ColKeyByName['LanguageKey']); + c.terminate; + + c.sql := 'Select StatusKey, Description from StatusCodes'; + c.prepare; + c.Execute; + while c.fetchnext do + FStatusKeys.Add(c.ColStringByName['Description'], c.ColStringByName['StatusKey']); + c.terminate; + + c.sql := 'Select RelationshipTypeKey, Description from RelationshipTypes'; + c.prepare; + c.Execute; + while c.fetchnext do + begin + FRelationships.Add(c.ColStringByName['Description'], c.ColStringByName['RelationshipTypeKey']); + s := c.ColStringByName['Description']; + if (s <> c.ColStringByName['Description']) then + FRelationships.Add(s, c.ColStringByName['RelationshipTypeKey']); + end; + c.terminate; -function TLOINCConcepts.getForLang(langs: TLangArray; ref: cardinal): cardinal; -var - dlist : TCardinalArray; - l : byte; -begin - dlist := FRefs.GetRefs(ref); - result := dlist[0]; - for l in langs do - begin - result := dlist[l]; - if result <> 0 then - exit; - end; -end; + c.sql := 'Select PropertyTypeKey, Description from PropertyTypes'; + c.prepare; + c.Execute; + while c.fetchnext do + FProperties.Add(c.ColStringByName['Description'], c.ColStringByName['PropertyTypeKey']); + c.terminate; -function TLOINCConcepts.AddConcept(iName : Cardinal; childByLang : boolean; iChildren : Cardinal; iConcepts : Cardinal) : Cardinal; -begin - result := FBuilder.Length div CONCEPT_LENGTH; - FBuilder.AddCardinal(iName); - if (childByLang) then - FBuilder.Append(1) - else - FBuilder.Append(0); - FBuilder.AddCardinal(iChildren); - FBuilder.AddCardinal(iConcepts); -end; + FCodeList.add(nil); // keys start from 1 -constructor TLOINCConcepts.Create(refs: TLOINCReferences); -begin - Inherited Create; - FRefs := refs; + c.sql := 'Select CodeKey, Code, Type, Description from Codes order by CodeKey Asc'; + c.prepare; + c.Execute; + i := 0; + while c.fetchnext do + begin + inc(i); + k := c.ColKeyByName['CodeKey']; + if (i <> k) then + raise EFslException.create('Error loading LOINC: Primary key has break in sequence at '+inttostr(k)); + ci := TLoincProviderContext.create(c.ColKey[1], TLoincProviderContextKind(c.ColKey[3]-1), c.ColString[2], c.ColString[4]); + FCodes.Add(c.ColStringByName['Code'], ci); + FCodeList.add(ci.link); + if (FFirstCodeKey = 0) and (ci.Kind = lpckCode) then + FFirstCodeKey := ci.Key; + end; + c.terminate; + + c.sql := 'Select Languages.Code as Lang, CodeKey as Key, DescriptionTypes.Description as DType, Value from Descriptions, Languages, DescriptionTypes where Descriptions.DescriptionTypeKey != 4 and Descriptions.DescriptionTypeKey = DescriptionTypes.DescriptionTypeKey and Descriptions.LanguageKey = Languages.LanguageKey'; + c.prepare; + c.execute; + while c.fetchNext do + FCodeList[c.colKey[2]].FDisplays.add(TDescriptionCacheEntry.create('LongCommonName' = c.ColString[3], c.ColString[1], c.ColString[4])); + c.terminate; + + c.sql := 'select SourceKey, TargetKey from Relationships where RelationshipTypeKey = '+FRelationships['child']; + c.prepare; + c.execute; + while c.fetchNext do + if (c.colKey[1] <> 0) and (c.colKey[2] <> 0) then + FCodeList[c.colKey[1]].addChild(c.colKey[2]); + c.terminate; + + for ci in FCodeList do + if (ci <> nIl) and (ci.FChildren <> nil) then + ci.FChildren.close; + + FVersion := c.Lookup('Config', 'ConfigKey', '2', 'Value', ''); + FRoot := c.Lookup('Config', 'ConfigKey', '3', 'Value', ''); + c.Release; + except + on e : exception do + begin + c.error(e); + raise; + end; + end; end; -procedure TLOINCConcepts.DoneBuild; +class function TLOINCServices.checkFile(const sFilename: String): String; +var + db : TFDBSQLiteManager; + c : TFDBConnection; begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster) div 12; - FBuilder.free; + try + dB := TFDBSQLiteManager.create('db', sFilename, true, false, 10); + try + c := db.GetConnection('test'); + try + if (c.Lookup('Config', 'ConfigKey', '1', 'Value', '') = 'c3c89b66-5930-4aa2-8962-124561a5f8c1') then + result := 'Ok (version = '+c.Lookup('Config', 'ConfigKey', '2', 'Value', '')+')'; + c.Release; + except + on e : Exception do + begin + c.Error(e) + end; + end; + finally + db.free; + end; + except + on e : Exception do + result := 'Error: '+e.message; + end; end; -procedure TLOINCConcepts.StartBuild; +function TLOINCServices.searchFilter(filter: TSearchFilterText; prep: TCodeSystemProviderFilterPreparationContext; sort: boolean): TCodeSystemProviderFilterContext; begin - FBuilder := TFslBytesBuilder.Create; + raise Exception.create('Not done yet'); end; - -function TLOINCConcepts.sizeInBytesV(magic : integer) : cardinal; +function TLOINCServices.sizeInBytesV(magic : integer) : cardinal; begin result := inherited sizeInBytesV(magic); - inc(result, FRefs.sizeInBytes(magic)); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); end; -{ TLOINCCodeList } - -procedure TLOINCCodeList.StartBuild; +procedure TLOINCServices.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin - FBuilder := TFslBytesBuilder.Create; + //b := TFslStringBuilder.Create; + //try + // iRefs := nil; + // if not CodeList.FindCode(code, iIndex) Then + // b.Append('* Error: Code '+code+' not known') + // else + // Begin + // card.addLink('Further Detail', baseURL+'/loinc/doco/?type=loinc&code='+code); + // + // CodeList.GetInformation(iIndex, langs, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); + // b.Append('LOINC Code '+code+' : '+Desc.GetEntry(iDescription, ll)+#13#10#13#10); + // if iComponent <> 0 Then + // b.Append('* Component: '+GetConceptDesc(iComponent, langs)+#13#10); + // if iProperty <> 0 Then + // b.Append('* Property: '+GetConceptDesc(iProperty, langs)+#13#10); + // if iTimeAspect <> 0 Then + // b.Append('* Time Aspect: '+GetConceptDesc(iTimeAspect, langs)+#13#10); + // if iSystem <> 0 Then + // b.Append('* System: '+GetConceptDesc(iSystem, langs)+#13#10); + // if iScale <> 0 Then + // b.Append('* Scale: '+GetConceptDesc(iScale, langs)+#13#10); + // if iMethod <> 0 Then + // b.Append('* Method: '+GetConceptDesc(iMethod, langs)+#13#10); + // if iClass <> 0 Then + // b.Append('* Class: '+GetConceptDesc(iClass, langs)+#13#10); + // + // b.Append('* Type: '); + // if iFlags and FLAGS_CLIN > 0 Then + // b.Append('Clinical'+#13#10) + // Else if iFlags and FLAGS_ATT > 0 Then + // b.Append('Attachment'+#13#10) + // Else if iFlags and FLAGS_SURV > 0 Then + // b.Append('Survey'+#13#10) + // Else + // b.Append('Lab'+#13#10); + // + // b.Append('* Status: '); + // if iFlags and FLAGS_HOLD > 0 Then + // b.Append('Not yet final'+#13#10) + // Else + // b.Append('Final'+#13#10); + // + // if iFlags and FLAGS_UNITS > 0 Then + // b.Append('* Units are required'+#13#10); + // + // b.Append('* Order/Obs Status: '); + // if (iFlags and FLAGS_ORDER> 0 ) and (iFlags and FLAGS_OBS> 0 ) Then + // b.Append('Both'+#13#10) + // Else if iFlags and FLAGS_ORDER > 0 Then + // b.Append('Order'+#13#10) + // Else if iFlags and FLAGS_OBS > 0 Then + // b.Append('Observation'+#13#10) + // else + // b.Append(#13#10); + // + // if iOtherNames <> 0 Then + // begin + // first := true; + // b.Append('* Other Names: '); + // iRefs := Refs.GetRefs(iOtherNames); + // for i := Low(iRefs) To High(iRefs) Do + // if iRefs[i] <> 0 Then + // begin + // s := desc.GetEntry(iRefs[i], ll); + // ok := false; + // for ilang in langs do + // if (ilang = ll) then + // ok := true; + // if ok then + // begin + // if first then + // first := false + // else + // b.Append(', '); + // b.Append(s); + // end; + // End; + // b.Append(#13#10); + // End; + // End; + // b.Append(#13#10+'This LOINC© content is copyright © 1995 Regenstrief Institute, Inc. and the LOINC Committee, and available at no cost under the license at '#13#10); + // card.detail := b.ToString; + //finally + // b.free; + //end; end; - -Function TLOINCCodeList.AddCode(sCode : String; iDescriptions, iOtherNames, iEntries : Cardinal; iFlags : Byte) : Cardinal; +function TLOINCServices.buildValueSet(factory : TFHIRFactory; id: String): TFhirValueSetW; var - s : AnsiString; - i : integer; + inc : TFhirValueSetComposeIncludeW; + filt : TFhirValueSetComposeIncludeFilterW; + cc : TFhirValueSetComposeIncludeConceptW; + ci : TLoincProviderContext; + c : TFDBConnection; begin - Result := FBuilder.Length div FReclength; - SetLength(s, FCodeLength); - FillChar(s[1], FCodeLength, 32); - for I := 1 to length(sCode) do - s[i] := AnsiChar(sCode[i]); - FBuilder.AddStringAnsi(s); - FBuilder.AddCardinal(iDescriptions); - FBuilder.AddCardinal(iOtherNames); - FBuilder.AddCardinal(0); // Component - FBuilder.AddCardinal(0); // Property - FBuilder.AddCardinal(0); // TimeAspect - FBuilder.AddCardinal(0); // System - FBuilder.AddCardinal(0); // Scale - FBuilder.AddCardinal(0); // Method - FBuilder.AddCardinal(0); // Class - FBuilder.Append(iFlags); - FBuilder.AddCardinal(0); // stems - FBuilder.AddCardinal(iEntries); + result := nil; + if (id = '') then + begin + result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); + try + result.url := id; + result.status := psActive; + result.version := version; + result.name := 'LOINC Value Set - all LOINC codes'; + result.description := 'All LOINC codes'; + result.date := TFslDateTime.makeUTC; + result.experimental := false; + inc := result.addInclude; + try + inc.systemUri := URI_LOINC; + finally + inc.free; + end; + result.link; + finally + result.free; + end; + end + else if (id.StartsWith('http://loinc.org/vs/') and FCodes.ContainsKey(id.Substring(20))) then + begin + ci := FCodes[id.Substring(20)]; + if (ci.kind = lpckPart) then + begin + result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); + try + result.url := id; + result.status := psActive; + result.version := version; + result.name := 'LOINCValueSetFor'+ci.code.replace('-', '_'); + result.description := 'LOINC value set for code '+ci.code+': '+ci.desc; + result.date := TFslDateTime.makeUTC; + result.experimental := false; + inc := result.addInclude; + try + inc.systemUri := URI_LOINC; + filt := inc.addFilter; + try + filt.prop := 'ancestor'; + filt.op := foEqual; + filt.value := id.Substring(20); + finally + filt.free; + end; + finally + inc.free; + end; + result.link; + finally + result.free; + end; + end + else if (ci.kind = lpckList) then + begin + result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); + try + result.url := id; + result.status := psActive; + result.version := version; + result.name := 'LOINCAnswerList'+ci.code.replace('-', '_'); + result.description := 'LOINC Answer list for code '+ci.code+': '+ci.desc; + result.date := TFslDateTime.makeUTC; + result.experimental := false; + inc := result.addInclude; + try + inc.systemUri := URI_LOINC; + c := FDB.GetConnection('buildValueSet'); + try + c.sql := 'select Code, Description from Relationships, Codes where SourceKey = '+inttostr(ci.key)+' and RelationshipTypeKey = 40 and Relationships.TargetKey = Codes.CodeKey'; + c.prepare; + c.execute; + while c.fetchnext do + begin + cc := inc.addConcept; + try + cc.code := c.colStringByName['Code']; + cc.display := c.colStringByName['Description']; + finally + cc.free; + end; + end; + c.terminate; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; + end; + end; + finally + inc.free; + end; + result.link; + finally + result.free; + end; + end; + end; end; -procedure TLOINCCodeList.SetCodeLength(const Value: Cardinal); +function TLOINCServices.getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; +var + ctxt : TLoincProviderContext; + c : TFDBConnection; + keys : TKeyArray; + l : integer; begin - FCodeLength := Value; - FRecLength := FCodeLength+CL_OFFSET_Entry+4; -end; - -procedure TLOINCCodeList.SetComponents(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*(FRecLength) +FCodeLength+CL_OFFSET_Component], 4); -End; - -procedure TLOINCCodeList.SetPropertys(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_Property], 4); -End; - -procedure TLOINCCodeList.SetTimeAspects(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_TimeAspect], 4); -End; - -procedure TLOINCCodeList.SetSystems(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_System], 4); -End; - -procedure TLOINCCodeList.SetScales(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_Scale], 4); -End; - -procedure TLOINCCodeList.SetMethods(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_Method], 4); -End; + ctxt := context as TLoincProviderContext; -procedure TLOINCCodeList.SetClasses(iIndex: Cardinal; iValue: cardinal); -Begin - Move(iValue, FMaster[iIndex*FRecLength+FCodeLength+CL_OFFSET_Class], 4); -End; + if context = nil then + begin + result := TCodeSystemIteratorContext.Create(nil, TotalCount); + result.moveCursor(FFirstCodeKey); + end + else if ctxt.kind = lpckPart then + begin + if (ctxt.FChildren = nil) then + result := TCodeSystemIteratorContext.Create(nil, 0) + else + result := TLoincIteratorContext.Create(ctxt.link, ctxt.FChildren.FKeys); + end + else + result := TCodeSystemIteratorContext.Create(nil, 0); +end; -destructor TLOINCCodeList.Destroy; +function TLOINCServices.getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; +var + ctxt : TLoincIteratorContext; + i, k : integer; begin - inherited; + if (context.context = nil) then + result := FCodeList[context.current].link + else + begin + ctxt := context as TLoincIteratorContext; + i := context.current; + k := ctxt.FKeys[i]; + result := FCodeList[k].link; + end; + context.next; end; -procedure TLOINCCodeList.DoneBuild; +function TLOINCServices.Code(context: TCodeSystemProviderContext): string; begin - FMaster := FBuilder.AsBytes; - FBuilder.free; + result := (context as TLoincProviderContext).code; end; -{$Q-} - -function TLOINCCodeList.FindCode(sCode: String; var iIndex: Cardinal): Boolean; +function TLOINCServices.Display(context: TCodeSystemProviderContext; langList : THTTPLanguageList): string; var - L, H, I : Integer; - C: Integer; - s, sF : String; + displays : TFslList; + c : TFDBConnection; + ll : THTTPLanguageEntry; + disp : TLoincDisplay; begin - if length(FMaster) = 0 Then - Result := False - Else - Begin - s := StringPadRight(sCode, ' ', FCodeLength); - Result := False; - L := 0; - H := (FLength div FRecLength) - 1; - while L <= H do - begin - I := (L + H) shr 1; - sF := memU8toString(FMaster, i*FReclength, FCodeLength); - C := CompareStr(sF, s); - if C < 0 then L := I + 1 else - begin - H := I - 1; - if C = 0 then - begin - Result := True; - L := I; - end; - end; - end; - iIndex := L; - End; -end; - - -function TLOINCCodeList.getForLang(langs: TLangArray; ref: cardinal): cardinal; -var - dlist : TCardinalArray; - l : byte; -begin - dlist := FRefs.GetRefs(ref); - result := dlist[0]; - for l in langs do - begin - result := dlist[l]; - if result <> 0 then - exit; - end; -end; - -Procedure TLOINCCodeList.GetInformation(iIndex: Cardinal; langs : TLangArray; var sCode : String; var iDescription, iOtherNames, iEntries, iStems : Cardinal; var iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; var iFlags : Byte); -Begin - if iIndex > FLength div FRecLength - 1 Then - raise ETerminologyError.create('Attempt to access invalid LOINC index at '+inttostr(iIndex*FRecLength), itException); - sCode := trim(memU8toString(FMaster, iIndex*FRecLength, FCodeLength)); -{0} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Description], iDescription, 4); -{4} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_OtherNames], iOtherNames, 4); -{8} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Component], iComponent, 4); -{12} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Property], iProperty, 4); -{16} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_TimeAspect], iTimeAspect, 4); -{20} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_System], iSystem, 4); -{24} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Scale], iScale, 4); -{28} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Method], iMethod, 4); -{32} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Class], iClass, 4); -{36} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Flags], iFlags, 1); -{37} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Stems], iStems, 4); -{41} Move(FMaster[(iIndex*FRecLength)+FCodeLength+CL_OFFSET_Entry], iEntries, 4); - - iDescription := getForLang(langs, iDescription); - iComponent := getForLang(langs, iComponent); - iProperty := getForLang(langs, iProperty); - iTimeAspect := getForLang(langs, iTimeAspect); - iSystem := getForLang(langs, iSystem); - iScale := getForLang(langs, iScale); - iMethod := getForLang(langs, iMethod); - iClass := getForLang(langs, iClass); -end; - -function TLOINCCodeList.Count: Cardinal; -begin - result := FLength div FRecLength; -end; - -constructor TLOINCCodeList.Create(refs: TLOINCReferences); -begin - Inherited Create; - FRefs := refs; -end; - -procedure TLOINCCodeList.SetStems(iIndex, iValue: Cardinal); -var - offset : cardinal; -begin - offset := (iIndex*FRecLength)+FCodeLength+CL_OFFSET_Stems; - if (offset + 4 > length(FMaster)) then - raise ETerminologyError.create('Write off end', itException); - Move(iValue, FMaster[offset], 4); -end; - -function TLOINCCodeList.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, FRefs.sizeInBytes(magic)); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); -end; - -{ TLOINCServices } - -constructor TLOINCServices.Create(languages : TIETFLanguageDefinitions); -begin - inherited; - FLang := TLoincLanguages.Create; - FDesc := TLoincStrings.Create; - FRefs := TLOINCReferences.Create; - FCode := TLOINCCodeList.Create(FRefs); - FConcepts := TLOINCConcepts.Create(FRefs); - FWords := TLoincWords.Create; - FStems := TLoincStems.Create; - FEntries := TLOINCHeirarchyEntryList.Create; - FAnswerLists := TLOINCAnswersList.Create; -end; - -procedure TLOINCServices.defineFeatures(features: TFslList); -begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'SCALE_TYP:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'SCALE_TYP:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'CLASS:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'COMPONENT:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'PROPERTY:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'TIME_ASPCT:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'SYSTEM:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'METHOD_TYP:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'ORDER_OBS:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'CLASSTYPE:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'STATUS:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'copyright:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'parent:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'ancestor:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:is-a')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:descends')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'LIST:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'TYPE:equals')); -end; - -function TLOINCServices.Definition(context: TCodeSystemProviderContext): string; -begin - result := ''; -end; - -function TLOINCServices.description: String; -begin - result := 'LOINC'; -end; - -destructor TLOINCServices.Destroy; -begin - FAnswerLists.free; - FEntries.free; - FWords.free; - FStems.free; - FRefs.free; - FConcepts.free; - FDesc.free; - FLang.free; - FCode.free; - inherited; -end; - -function TLOINCServices.GetConceptName(iConcept: cardinal): String; -var - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; - lang : byte; -begin - Concepts.GetConcept(iConcept, nil, iName, iChildren, iCodes); - result := Desc.GetEntry(iName, lang); -end; - -procedure TLOINCServices.GetDisplaysByName(const sCode: String; langs: TLangArray; list: TConceptDesignations); -var - iIndex : Cardinal; - iDescription, iStems, iOtherNames : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iCode, iAnswers : cardinal; - parents, children, descendentConcepts, text, concepts, stems : cardinal; - iFlags : Byte; - names : TCardinalArray; - name : Cardinal; - ilang, l : byte; - s : String; -begin - if CodeList.FindCode(sCode, iIndex) then - Begin - CodeList.GetInformation(iIndex, langs, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - assert(sCode = sCode1); - list.addDesignation(true, true, '', Desc.GetEntry(iDescription, ilang).trim); - if iOtherNames <> 0 then - begin - names := FRefs.GetRefs(iOtherNames); - for name in names do - begin - s := Desc.GetEntry(name, ilang); - for l in langs do - if (l = ilang) then - list.addDesignation(false, true, langDesc(iLang), s.trim); - end; - end; - End - else if AnswerLists.FindCode(sCode, iIndex, FDesc) then - begin - AnswerLists.GetEntry(iIndex, iCode, iDescription, iAnswers); - s := Desc.GetEntry(iDescription, ilang); - list.addDesignation(true, true,langDesc(iLang), s.Trim); - end - else if Entries.FindCode(sCode, iIndex, FDesc) then - begin - FEntries.GetEntry(iIndex, iCode, text, parents, children, concepts, descendentConcepts, stems); - s := Desc.GetEntry(text, ilang).Trim; - list.addDesignation(true, true,langDesc(iLang), s); - end -end; - - -function TLOINCServices.GetDisplayByName(const sCode: String; langs : TLangArray): String; -var - iIndex : Cardinal; - iDescription, iStems, iCategories, iOtherNames : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - ilang : byte; -begin - if CodeList.FindCode(sCode, iIndex) then - Begin - CodeList.GetInformation(iIndex, langs, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - assert(sCode = sCode1); - result := Desc.GetEntry(iDescription, ilang); - End - Else - result := ''; -end; - -function TLOINCServices.GetPropertyCodes(iProp: cardinal): TCardinalArray; -var - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; -begin - Concepts.GetConcept(iProp, nil, iName, iChildren, iCodes); - result := Refs.GetRefs(iCodes); -end; - -function TLOINCServices.GetPropertyId(aType: TLoincPropertyType; langs : TLangArray; const sName: String): cardinal; -var - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; - aChildren : TCardinalArray; - i : Integer; - iDummy : Cardinal; - lang : byte; - -begin - // get all the children of the property code - // iterate them looking for a name match - Concepts.GetConcept(Properties[aType], langs, iName, iChildren, iCodes); - aChildren := Refs.GetRefs(iChildren); - result := 0; - For i := 0 to High(aChildren) Do - Begin - Concepts.GetConcept(aChildren[i], langs, iName, iChildren, iDummy); - if SameText(sName, Desc.GetEntry(iName, lang)) Then - Begin - result := aChildren[i]; - exit; - End; - End; -end; - - -function TLOINCServices.IsCode(sCode: String): Boolean; -var - iIndex : Cardinal; -begin - result := CodeList.FindCode(sCode, iIndex); -end; - -function TLOINCServices.IsMACode(sCode: String): Boolean; -var - iIndex : Cardinal; -begin - result := Entries.FindCode(sCode, iIndex, FDesc); -end; - -function TLOINCServices.isNotClosed(textFilter: TSearchFilterText; propFilter: TCodeSystemProviderFilterContext): boolean; -begin - result := false; -end; - -function TLOINCServices.langDesc(iLang: word): String; -var - i : integer; - llang, country : String; -begin - if iLang = 0 then - result := '' - else - begin - FLang.GetEntry(iLang, llang, country); - result := llang +'-'+country; - end; -end; - -function TLOINCServices.langsForLang(langList : THTTPLanguageList): TLangArray; - procedure add(b : byte); - begin - SetLength(result, length(result)+1); - result[length(result)-1] := b; - end; -var - i : integer; - llang, country : string; -begin - if lang = nil then - result := noLang - else - begin - SetLength(result, 0); - - // first pass, exact matches - for i := 0 to FLang.count - 1 do - begin - FLang.GetEntry(i, llang, country); - if (langList = nil) or (llang +'-'+country = langList.source) then - add(i); - end; - if length(result) = 0 then - begin - // look for preferred match where country = lang - for i := 0 to FLang.count - 1 do - begin - FLang.GetEntry(i, llang, country); - if (langList = nil) or (llang +'-'+llang.ToUpper = langList.source) then - add(i); - end; - // other possible matches - for i := 0 to FLang.count - 1 do - begin - FLang.GetEntry(i, llang, country); - if (langList = nil) or (langList.source = llang) then - add(i); - end; - end; - - // always fall back to english - add(0); - end; -end; - -function TLOINCServices.Link: TLOINCServices; -begin - result := TLOINCServices(Inherited Link); -end; - -procedure TLOINCServices.Load(const sFilename: String); -var - oFile : Tfilestream; - oread : TReader; - aLoop : TLoincPropertyType; - a : TLoincSubsetId; - i, t : integer; - v : String; - function readBytes : TBytes; - begin - SetLength(result, oRead.ReadInteger); - if length(result) > 0 then - oread.Read(result[0], length(result)); - end; -begin - oFile := TFileStream.Create(sFilename, fmOpenread); - try - oread := TReader.Create(oFile, 8192); - try - v := oRead.ReadString; - if v <> LOINC_CACHE_VERSION_CURRENT Then - raise ETerminologyError.create('The LOINC cache must be rebuilt using the ''Import LOINC'' operation in the Console.', itException); - - FCode.CodeLength := oRead.ReadInteger; - FLang.FMaster := ReadBytes; - FLang.FLength := Length(FLang.FMaster); - FCode.FMaster := ReadBytes; - FCode.FLength := Length(FCode.FMaster); - FDesc.FMaster := ReadBytes; - FDesc.FLength := Length(FDesc.FMaster); - FRefs.FMaster := ReadBytes; - FRefs.FLength := Length(FRefs.FMaster); - FConcepts.FMaster := ReadBytes; - FConcepts.FLength := Length(FConcepts.FMaster) div 12; - FWords.FMaster := ReadBytes; - FWords.FLength := Length(FWords.FMaster); - FStems.FMaster := ReadBytes; - FStems.FLength := Length(FStems.FMaster); - FEntries.FMaster := ReadBytes; - FAnswerLists.FMaster := ReadBytes; - FRoot := oRead.ReadInteger; - FVersion := oRead.ReadString; - For aLoop := Low(TLoincPropertyType) To High(TLoincPropertyType) Do - FProperties[aLoop] := oRead.ReadInteger; - t := oread.ReadInteger; - SetLength(FHeirarchyRoots, t); - for i := 0 to t - 1 do - FHeirarchyRoots[i] := oread.ReadInteger; - For a := Low(TLoincSubsetId) To High(TLoincSubsetId) Do - FSubsets[a] := oRead.ReadInteger; - Finally - oread.free; - End; - Finally - oFile.free; - End; - Loaded := true; -end; - -class function TLOINCServices.checkFile(const sFilename: String): String; -var - oFile : Tfilestream; - oread : TReader; - v : String; - function readBytes : TBytes; - begin - SetLength(result, oRead.ReadInteger); - if length(result) > 0 then - oread.Read(result[0], length(result)); - end; -begin - try - oFile := TFileStream.Create(sFilename, fmOpenRead + fmShareDenyWrite); - try - oread := TReader.Create(oFile, 8192); - try - v := oRead.ReadString; - if (v = LOINC_CACHE_VERSION_CURRENT) then - begin - oRead.ReadInteger; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - oRead.ReadInteger; - result := 'Ok (version = '+oRead.ReadString+')'; - end - else - result := 'Needs rebuilding'; - Finally - oread.free; - End; - Finally - oFile.free; - End; - except - on e : Exception do - result := 'Error: '+e.message; - end; -end; - -procedure TLOINCServices.Save(const sFilename: String; statedDate : String); -var - oFile : Tfilestream; - oWrite : TWriter; - aLoop : TLoincPropertyType; - a : TLoincSubsetId; - i : integer; - v : String; - zip : TFslZipWriter; - procedure WriteBytes(b : TBytes); - begin - oWrite.WriteInteger(length(b)); - if length(b) > 0 then - oWrite.Write(b[0], length(b)); - end; -begin - if FileExists(sFilename) Then - begin - FileSetReadOnly(sFilename, False); - DeleteFile(sFilename); - End; - oFile := TFileStream.Create(sFilename, fmCreate); - try - oWrite := TWriter.Create(oFile, 8192); - try - oWrite.WriteString(LOINC_CACHE_VERSION_CURRENT); - oWrite.WriteInteger(FCode.CodeLength); - WriteBytes(FLang.FMaster); - WriteBytes(FCode.FMaster); - WriteBytes(FDesc.FMaster); - WriteBytes(FRefs.FMaster); - WriteBytes(FConcepts.FMaster); - WriteBytes(FWords.FMaster); - WriteBytes(FStems.FMaster); - WriteBytes(FEntries.FMaster); - WriteBytes(FAnswerLists.FMaster); - oWrite.writeInteger(FRoot); - oWrite.WriteString(FVersion); - For aLoop := Low(TLoincPropertyType) To High(TLoincPropertyType) Do - oWrite.WriteInteger(FProperties[aLoop]); - oWrite.WriteInteger(Length(FHeirarchyRoots)); - for i := 0 to Length(FHeirarchyRoots) - 1 do - oWrite.WriteInteger(FHeirarchyRoots[i]); - For a := Low(TLoincSubsetId) To High(TLoincSubsetId) Do - oWrite.WriteInteger(FSubsets[a]); - Finally - oWrite.free; - End; - Finally - oFile.free; - End; - // set up website upload - if FileExists('C:\work\com.healthintersections.fhir\website\FhirServer\loinc.inc') then - begin - v := FVersion.Replace('.', ''); - StringToFile(' '+#13#10+ - ' '+#13#10+ - ' '+#13#10, path([ExtractFileDir(sFilename), 'loinc.inc']), TEncoding.ASCII); - zip := TFslZipWriter.Create; - try - zip.Stream := TFslFile.create(path(['C:\work\com.healthintersections.fhir\website\FhirServer', 'loinc_'+v+'.zip']), fmCreate); - zip.addFile('loinc_'+v+'.cache', sFilename); - zip.WriteZip; - finally - zip.free; - end; - end; -end; - -function TLOINCServices.searchFilter(filter: TSearchFilterText; prep: TCodeSystemProviderFilterPreparationContext; sort: boolean): TCodeSystemProviderFilterContext; -var - matches : TMatchArray; - children : TConceptReferenceArray; - i : integer; -begin - matches := Search(filter.filter, true); - setLength(children, length(matches)); - for i := 0 to Length(matches) - 1 do - begin - children[i].index := matches[i].index; - children[i].kind := matches[i].kind; - end; - result := TLoincFilterHolder.Create; - TLoincFilterHolder(result).SetChildren(children); -end; - -function TLOINCServices.supportsLang(langList : THTTPLanguageList): boolean; -var - i : integer; - llang, country : string; -begin - if (lang = nil) then - result := false - else if (langList = nil) then - result := true - else - begin - for i := 0 to FLang.count - 1 do - begin - FLang.GetEntry(i, llang, country); - if (llang = langList.source) then - exit(true); - if (llang +'-'+country = langList.source) then - exit(true); - end; - result := false; - end; -end; - -type - TSearchWord = record - original : String; - stem : Cardinal; - End; - TSearchWordArray = array of TSearchWord; - -Procedure QuickSortArray(var a : TMatchArray); - - Procedure QuickSort(L, R: Integer); - Var - I, J, K : Integer; - t : TMatch; - Begin - // QuickSort routine (Recursive) - // * Items is the default indexed property that returns a pointer, subclasses - // specify these return values as their default type. - // * The Compare routine used must be aware of what this pointer actually means. - - Repeat - I := L; - J := R; - K := (L + R) Shr 1; - - Repeat - While a[I].Priority > a[K].Priority Do - Inc(I); - - While a[J].Priority < a[K].Priority Do - Dec(J); - - If I <= J Then - Begin - t := a[i]; - a[i] := a[j]; - a[j] := t; - - // Keep K as the index of the original middle element as it might get exchanged. - If I = K Then - K := J - Else If J = K Then - K := I; - - Inc(I); - Dec(J); - End; - Until I > J; - - If L < J Then - QuickSort(L, J); - - L := I; - Until I >= R; - End; - -Begin - If length(a) > 1 Then - QuickSort(0, length(a) - 1); -End; - - - - -function TLOINCServices.Search(sText: String; all: boolean): TMatchArray; - Function Match(const words : TSearchWordArray; s : String; iDepth : byte):Double; - var - i : integer; - Begin - result := 0; - s := lowercase(s); - for i := 0 to length(words) - 1 Do - if pos(words[i].original, s) > 0 Then - Begin - result := result + 10; - if s = words[i].original then - result := result + 12 - Else if StringStartsWith(s, words[i].original) Then - result := result + 3 - Else If s.EndsWith(words[i].original) Then - result := result + 1.5 - Else If (pos(' '+words[i].original+' ', s) > 0) Then - result := result + 0.6; - result := result + result / length(s); - if iDepth > 0 Then - result := result + result / iDepth; - End; - End; - - Procedure AddResult(var iCount : Integer; iindex : cardinal; sId : String; priority : Double; kind : TLoincProviderContextKind); - Begin - if iCount = length(result) then - SetLength(result, Length(result)+100); - result[iCount].index := iIndex; - result[iCount].code := sId; - result[iCount].kind := kind; - result[iCount].Priority := priority; - Inc(iCount); - End; - - Function FlagFactor(iFlag : Byte): double; - Begin - if iFlag and FLAG_LONG_COMMON > 0 then - result := 4 - Else - result := 1; - End; - - Procedure CheckCode(const words : TSearchWordArray; var iCount : Integer; iCodeIndex : Integer); - var - i, j : cardinal; - r1 : Double; - Desc : TCardinalArray; - iDescription, iStems, iCategories, iOtherNames : Cardinal; - iEntries : Cardinal; - sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - matches : integer; - ok : boolean; - lang : byte; - Begin - CodeList.GetInformation(iCodeIndex, nil, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - r1 := 0; - matches := 0; - Desc := Refs.GetRefs(iStems); - For i := 0 to length(words) - 1 do - begin - if words[i].stem <> 0 Then - begin - ok := false; - For j := 0 to length(Desc) - 1 do - if (words[i].stem = desc[j]) Then - begin - r1 := r1 + 20 + (20 / length(desc)); - ok := true; - end; - if ok then - begin - inc(matches); - end; - end; - end; - - if (not all or (matches = length(words))) and (r1 > 0) Then - begin - AddResult(iCount, iCodeIndex, sCode1, r1, lpckCode); - end; - End; - - Procedure CheckEntry(const words : TSearchWordArray; var iCount : Integer; index : Integer); - var - i, j : cardinal; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; - r1 : Double; - Desc : TCardinalArray; - matches : integer; - ok : boolean; - lang : byte; - sCode1 : String; - Begin - Entries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - r1 := 0; - Desc := Refs.GetRefs(stems); - sCode1 := FDesc.GetEntry(code, lang); - matches := 0; - For i := 0 to length(words) - 1 do - begin - if words[i].stem <> 0 Then - begin - ok := false; - For j := 0 to length(Desc) - 1 do - begin - if (words[i].stem = desc[j]) Then - begin - r1 := r1 + 20 + (20 / length(desc)); - ok := true; - end - end; - if ok then - begin - inc(matches); - end; - end; - end; - - if (not all or (matches = length(words))) and (r1 > 0) Then - begin - AddResult(iCount, index, sCode1, 1000000+r1, lpckPart); // these always come first - end; - End; - -var - iCount : Integer; - words : TSearchWordArray; - i : integer; - index : integer; - oStemmer : TFslWordStemmer; - st, s : String; - s1 : String; -begin - SetLength(words, 0); - st := LowerCase(sText); - oStemmer := TFslWordStemmer.create('english'); - Try - while (st <> '') Do - Begin - StringSplit(st, [',', ' ', ':', '.', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', '|', '\', ';', '"', '<', '>', '?', '/', '~', '`', '-', '_', '+', '='], s, st); - if (s <> '') Then - Begin - SetLength(words, length(words)+1); - words[length(words)-1].original := s; - s1 := oStemmer.Stem(s); - if FindStem(s1, index) Then - words[length(words)-1].stem := FStems.GetString(index); - End; - End; - Finally - oStemmer.free; - End; - - if Length(words) = 0 then - raise ETerminologyError.create('no usable search text found', itException); - - - iCount := 0; - SetLength(result, 100); - for i := 0 to FCode.Count - 1 Do - CheckCode(words, iCount, i); - for i := 0 to FEntries.Count - 1 Do - CheckEntry(words, iCount, i); - - SetLength(result, iCount); - QuickSortArray(result); -End; -(* -var - iCount : Integer; - i : cardinal; - iDescription, iOtherNames : Cardinal; - s, sCode1 : String; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iv2dt, iv3dt : Word; - iFlags : Byte; - oReg : TRegExpr; - bIncl : Boolean; - Procedure AddResult(iindex : cardinal); - Begin - if iCount = length(result) then - SetLength(result, Length(result)+100); - result[iCount] := iIndex; - Inc(iCount); - End; -begin - oReg := TRegExpr.Create; - Try - if false Then - oReg.Expression := sText - Else - sText := lowercase(sText); - iCount := 0; - SetLength(result, 100); - for i := 0 to Code.Count - 1 Do - Begin - Code.GetInformation(i, lang, sCode1, iDescription, iOtherNames, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iv2dt, iv3dt, iFlags); - - s := Desc.GetEntry(iDescription); - if false Then - bIncl := oReg.Exec(s) - Else - bIncl := (pos(sText, lowercase(Desc.GetEntry(iDescription))) > 0) or (sText = ''); - - if bIncl Then - Addresult(i); - End; - SetLength(result, iCount); - Finally - oReg.free; - End; -end; -*) - - -function TLOINCServices.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, FLang.sizeInBytes(magic)); - inc(result, FDesc.sizeInBytes(magic)); - inc(result, FCode.sizeInBytes(magic)); - inc(result, FRefs.sizeInBytes(magic)); - inc(result, FConcepts.sizeInBytes(magic)); - inc(result, FWords.sizeInBytes(magic)); - inc(result, FStems.sizeInBytes(magic)); - inc(result, FEntries.sizeInBytes(magic)); - inc(result, FAnswerLists.sizeInBytes(magic)); - inc(result, (FVersion.length * sizeof(char)) + 12); -end; - -{ TLOINCServiceList } - -destructor TLOINCServiceList.Destroy; -begin - FDefinition.free; - inherited; -end; - -function TLOINCServiceList.GetByKey(sKey: String): TLOINCServices; -var - i, k : integer; -begin - Result := nil; - i := 0; - k := StrToIntDef(sKey, 0); - While (i < Count) and (result = nil) do - Begin - if Service[i].Key = k then - result := Service[i]; - inc(i); - End; - if result = nil then - result := DefaultService; -end; - -function TLOINCServiceList.GetDefinition: TLOINCServices; -begin - if FDefinition = nil then - raise ETerminologyError.create('There is no default LOINC service', itException); - result := FDefinition; -end; - -function TLOINCServiceList.GetService(i: integer): TLOINCServices; -begin - result := TLOINCServices(ObjectByIndex[i]); -end; - -function TLOINCServiceList.GetServiceByName(sName: String): TLOINCServices; -var - i : integer; -begin - if sName = '' then - result := DefaultService - Else - Begin - Result := nil; - i := 0; - While (i < Count) and (result = nil) do - Begin - if SameText(Service[i].LOINCVersion, sName) then - result := Service[i]; - inc(i); - End; - End;end; - -function TLOINCServiceList.HasDefaultService: Boolean; -begin - result := FDefinition <> nil; -end; - -function TLOINCServiceList.ItemClass: TFslObjectClass; -begin - result := TLOINCServices; -end; - -procedure TLOINCServiceList.SetDefinition(const Value: TLOINCServices); -begin - FDefinition := Value; -end; - -function TLOINCServiceList.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, FDefinition.sizeInBytes(magic)); -end; - -{ TLoincWords } - -procedure TLoincWords.AddWord(index: Cardinal; Flags: Byte); -begin - FBuilder.AddCardinal(index); - FBuilder.Append(flags); -end; - -function TLoincWords.Count: Integer; -begin - result := FLength div 5; -end; - -procedure TLoincWords.DoneBuild; -begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster); - FBuilder.free; -end; - -procedure TLoincWords.GetEntry(iIndex: Cardinal; var index: Cardinal; var flags: Byte); -var - l : Cardinal; -begin - l := (iIndex * 5); - if l > FLength - 5 Then - raise ETerminologyError.create('invalid index', itException); - move(FMaster[l], index, 4); - move(FMaster[l+4], flags, 1); -end; - -function TLoincWords.GetString(iIndex: Cardinal): Cardinal; -var - f : byte; -begin - GetEntry(iIndex, result, f); -end; - -procedure TLoincWords.StartBuild; -begin - FBuilder := TFslBytesBuilder.Create; -end; - -function TLoincWords.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); -end; - -{ TLoincStems } - -procedure TLoincStems.AddStem(index : Cardinal); -begin - FBuilder.AddCardinal(index); -end; - -function TLoincStems.Count: Integer; -begin - result := FLength div 4; -end; - -procedure TLoincStems.DoneBuild; -begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster); - FBuilder.free; -end; - -procedure TLoincStems.GetEntry(iIndex: Cardinal; var index: Cardinal); -var - l : Cardinal; -begin - l := (iIndex * 4); - if l > FLength - 4 Then - raise ETerminologyError.create('invalid index', itException); - move(FMaster[l], index, 4); -end; - -function TLoincStems.GetString(iIndex: Cardinal): Cardinal; -begin - GetEntry(iIndex, result); -end; - -procedure TLoincStems.StartBuild; -begin - FBuilder := TFslBytesBuilder.Create; -end; - -function TLoincStems.sizeInBytesV(magic : integer) : cardinal; -begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); -end; - -function TLOINCServices.FindStem(s: String; var index: Integer): Boolean; -var - L, H, I, c: Integer; - lang : byte; -begin - Result := False; - L := 0; - H := FStems.Count - 1; - while L <= H do + result := (context as TLoincProviderContext).Desc; + if (langList <> nil) and not (langList.matches('en', true)) then begin - I := (L + H) shr 1; - C := CompareStr(FDesc.GetEntry(FStems.GetString(i), lang), s); - if C < 0 then L := I + 1 else - begin - H := I - 1; - if C = 0 then - begin - Result := True; - L := I; + displays := TFslList.create; + try + displays.add(TLoincDisplay.create('en-US', (context as TLoincProviderContext).Desc)); + + c := FDB.getConnection('Designations'); + try + displays.add(TLoincDisplay.create('en-US', (context as TLoincProviderContext).Desc)); + c.sql := 'Select Languages.Code as Lang, Value from Descriptions, Languages where CodeKey = '+inttostr((context as TLoincProviderContext).key)+' and Descriptions.DescriptionTypeKey in (1,2,5) and Descriptions.LanguageKey = Languages.LanguageKey order by DescriptionTypeKey'; + c.prepare; + c.execute; + while c.fetchNext do + displays.add(TLoincDisplay.create(c.ColStringByName['Lang'], c.ColStringByName['Value'])); + c.terminate; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; + end; end; + // now we have them all - iterate looking for a match + for ll in langList.langs do + for disp in displays do + if ll.matches(disp.language, true) then + exit(disp.value); + for ll in langList.langs do + for disp in displays do + if ll.matches(disp.language, false) then + exit(disp.value); + finally + displays.free; end; end; - index := L; -end; - - -procedure TLOINCServices.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); -var - b : TStringBuilder; - iIndex : Cardinal; - iDescription, iOtherNames, iCategories, iStems : Cardinal; - sCode1, s : String; - iEntries : Cardinal; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - iRefs : TCardinalArray; - i : integer; - first : boolean; - langs : TLangArray; - ll, ilang : byte; - ok : boolean; -begin - langs := langsForLang(langList); - b := TStringBuilder.Create; - try - iRefs := nil; - if not CodeList.FindCode(code, iIndex) Then - b.Append('* Error: Code '+code+' not known') - else - Begin - card.addLink('Further Detail', baseURL+'/loinc/doco/?type=loinc&code='+code); - - CodeList.GetInformation(iIndex, langs, sCode1, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - b.Append('LOINC Code '+code+' : '+Desc.GetEntry(iDescription, ll)+#13#10#13#10); - if iComponent <> 0 Then - b.Append('* Component: '+GetConceptDesc(iComponent, langs)+#13#10); - if iProperty <> 0 Then - b.Append('* Property: '+GetConceptDesc(iProperty, langs)+#13#10); - if iTimeAspect <> 0 Then - b.Append('* Time Aspect: '+GetConceptDesc(iTimeAspect, langs)+#13#10); - if iSystem <> 0 Then - b.Append('* System: '+GetConceptDesc(iSystem, langs)+#13#10); - if iScale <> 0 Then - b.Append('* Scale: '+GetConceptDesc(iScale, langs)+#13#10); - if iMethod <> 0 Then - b.Append('* Method: '+GetConceptDesc(iMethod, langs)+#13#10); - if iClass <> 0 Then - b.Append('* Class: '+GetConceptDesc(iClass, langs)+#13#10); - - b.Append('* Type: '); - if iFlags and FLAGS_CLIN > 0 Then - b.Append('Clinical'+#13#10) - Else if iFlags and FLAGS_ATT > 0 Then - b.Append('Attachment'+#13#10) - Else if iFlags and FLAGS_SURV > 0 Then - b.Append('Survey'+#13#10) - Else - b.Append('Lab'+#13#10); - - b.Append('* Status: '); - if iFlags and FLAGS_HOLD > 0 Then - b.Append('Not yet final'+#13#10) - Else - b.Append('Final'+#13#10); - - if iFlags and FLAGS_UNITS > 0 Then - b.Append('* Units are required'+#13#10); - - b.Append('* Order/Obs Status: '); - if (iFlags and FLAGS_ORDER> 0 ) and (iFlags and FLAGS_OBS> 0 ) Then - b.Append('Both'+#13#10) - Else if iFlags and FLAGS_ORDER > 0 Then - b.Append('Order'+#13#10) - Else if iFlags and FLAGS_OBS > 0 Then - b.Append('Observation'+#13#10) - else - b.Append(#13#10); - - if iOtherNames <> 0 Then - begin - first := true; - b.Append('* Other Names: '); - iRefs := Refs.GetRefs(iOtherNames); - for i := Low(iRefs) To High(iRefs) Do - if iRefs[i] <> 0 Then - begin - s := desc.GetEntry(iRefs[i], ll); - ok := false; - for ilang in langs do - if (ilang = ll) then - ok := true; - if ok then - begin - if first then - first := false - else - b.Append(', '); - b.Append(s); - end; - End; - b.Append(#13#10); - End; - End; - b.Append(#13#10+'This LOINC© content is copyright © 1995 Regenstrief Institute, Inc. and the LOINC Committee, and available at no cost under the license at '#13#10); - card.detail := b.ToString; - finally - b.free; - end; -end; - -function TLOINCServices.allLangs: TLangArray; -var - i : integer; -begin - SetLength(result, FLang.count); - for i := 0 to length(result) - 1 do - result[i] := i; end; -function TLOINCServices.buildValueSet(factory : TFHIRFactory; id: String): TFhirValueSetW; +procedure TLOINCServices.Designations(context: TCodeSystemProviderContext; list: TConceptDesignations); var - index : cardinal; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; - answers : TCardinalArray; - inc : TFhirValueSetComposeIncludeW; - filt : TFhirValueSetComposeIncludeFilterW; - i : integer; - cc : TFhirValueSetComposeIncludeConceptW; - lang : byte; + c : TFDBConnection; + ctxt : TLoincProviderContext; + cache : TFslList; + entry : TDescriptionCacheEntry; begin - result := nil; - if (id = '') then + ctxt := context as TLoincProviderContext; + if (ctxt <> nil) then begin - result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); + FLock.lock('Designations'); try - result.url := id; - result.status := psActive; - result.version := Version(nil); - result.name := 'LOINC Value Set - all LOINC codes'; - result.description := 'All LOINC codes'; - result.date := TFslDateTime.makeUTC; - inc := result.addInclude; - try - inc.systemUri := URI_LOINC; - finally - inc.free; - end; - result.link; + cache := ctxt.FDisplays; finally - result.free; + FLock.unlock; end; - end - else if (id.StartsWith('http://loinc.org/vs/') and FEntries.FindCode(id.Substring(20), index, FDesc)) then - begin - FEntries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - - result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); - try - result.url := id; - result.status := psActive; - result.version := Version(nil); - result.name := 'LOINC Value Set from Multi-Axial Heirarchy term '+id.Substring(20); - result.description := 'All LOINC codes for '+Desc.GetEntry(text, lang); - result.date := TFslDateTime.makeUTC; - inc := result.addInclude; + list.addDesignation(true, true, 'en-US', (context as TLoincProviderContext).Desc); + if (cache = nil) then + begin + cache := TFslList.create; try - inc.systemUri := URI_LOINC; - filt := inc.addFilter; + c := FDB.getConnection('Designations'); try - filt.prop := 'ancestor'; - filt.op := foEqual; - filt.value := id.Substring(20); - finally - filt.free; - end; - finally - inc.free; - end; - result.link; - finally - result.free; - end; - end - else if (id.StartsWith('http://loinc.org/vs/') and FAnswerLists.FindCode(id.Substring(20), index, FDesc)) then - begin - FAnswerLists.GetEntry(index, code, text, children); - result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); - try - result.url := id; - result.status := psActive; - result.version := Version(nil); - result.name := 'LOINC Answer List '+id.Substring(20); - result.description := 'LOINC Answer list for '+Desc.GetEntry(text, lang); - result.date := TFslDateTime.makeUTC; - inc := result.addInclude; - try - inc.systemUri := URI_LOINC; - answers := FRefs.GetRefs(children); - for i := 0 to Length(answers) - 1 do - begin - cc := inc.addConcept; - try - FAnswerLists.GetEntry(answers[i], code, text, children); - cc.code := Desc.GetEntry(code, lang); - cc.display := Desc.GetEntry(text, lang); - finally - cc.free; + c.sql := 'Select Languages.Code as Lang, DescriptionTypes.Description as DType, Value from Descriptions, Languages, DescriptionTypes where CodeKey = '+inttostr((context as TLoincProviderContext).key)+' and Descriptions.DescriptionTypeKey = DescriptionTypes.DescriptionTypeKey and Descriptions.LanguageKey = Languages.LanguageKey'; + c.prepare; + c.execute; + while c.fetchNext do + begin + list.addDesignation(false, 'LongCommonName' = c.ColStringByName['Type'], c.ColStringByName['Lang'], c.ColStringByName['Value']); + cache.add(TDescriptionCacheEntry.create('LongCommonName' = c.ColStringByName['Type'], c.ColStringByName['Lang'], c.ColStringByName['Value'])); + end; + c.terminate; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; end; end; + + FLock.lock('Designations#2'); + try + ctxt.FDisplays := cache.link; + finally + FLock.unlock; + end finally - inc.free; + cache.free; end; - result.link; - finally - result.free; + end + else + begin + for entry in cache do + list.addDesignation(false, entry.display, entry.lang, entry.value); end; end; end; -function TLOINCServices.getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; -var - ctxt : TLoincProviderContext; -begin - ctxt := context as TLoincProviderContext; - // no children in loinc - - if context = nil then - result := TCodeSystemIteratorContext.Create(nil, TotalCount) - else if ctxt.kind = lpckPart then - result := TCodeSystemIteratorContext.Create(nil, 0) - else - result := TCodeSystemIteratorContext.Create(nil, 0); -end; - -function TLOINCServices.getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; -begin - if (context.context = nil) then - result := TLoincProviderContext.Create(lpckCode, context.current) // offset from 0 to avoid ambiguity about nil contxt, and first entry - else - raise ETerminologyError.create('shouldn''t be here', itException); - context.next; -end; - -function TLOINCServices.Code(context: TCodeSystemProviderContext): string; -var - iDescription, iStems, iCategories, iOtherNames : Cardinal; - iEntries, iCode, iOther, iConcepts, iStem, iParents, iChildren, iDescendantConcepts : Cardinal; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - lang : byte; - ctxt : TLoincProviderContext; -begin - ctxt := context as TLoincProviderContext; - case ctxt.kind of - lpckCode: - begin - CodeList.GetInformation(ctxt.index, nil, result, iDescription, iOtherNames, iStems, iEntries, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - end; - lpckPart: - begin - FEntries.GetEntry(ctxt.index, iCode, iDescription, iParents, iChildren, iConcepts, iDescendantConcepts, iStem); - result := Desc.GetEntry(iCode, lang); - end; - lpckAnswer: - begin - FAnswerLists.GetEntry(ctxt.index, iCode, iDescription, iOther); - result := Desc.GetEntry(iCode, lang); - end; - end; -end; - -function TLOINCServices.Display(context: TCodeSystemProviderContext; langList : THTTPLanguageList): string; -var - iCode, iDescription, iStems, iCategories, iOtherNames, iOther : Cardinal; - iEntries, iParents, iChildren, iConcepts, iDescendantConcepts, iStem : Cardinal; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - ilang : byte; - ctxt : TLoincProviderContext; -begin - ctxt := context as TLoincProviderContext; - case ctxt.kind of - lpckCode: - begin - CodeList.GetInformation(ctxt.index, langsForLang(langList), result, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags) - end; - lpckPart: - begin - FEntries.GetEntry(ctxt.index, iCode, iDescription, iParents, iChildren, iConcepts, iDescendantConcepts, iStem); - end; - lpckAnswer: - begin - FAnswerLists.GetEntry(ctxt.index, iCode, iDescription, iOther) - end; - end; - result := Desc.GetEntry(iDescription, ilang); -end; - -procedure TLOINCServices.Designations(context: TCodeSystemProviderContext; list: TConceptDesignations); -begin - GetDisplaysByName(Code(context), allLangs, list); -end; - procedure TLOINCServices.extendLookup(factory : TFHIRFactory; ctxt: TCodeSystemProviderContext; langList : THTTPLanguageList; props: TArray; resp: TFHIRLookupOpResponseW); var - iDescription, iStems, iCategories, iOtherNames : Cardinal; - iEntries : Cardinal; - iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass : Cardinal; - iFlags : Byte; - s : String; - langs : TLangArray; - ll : byte; - {$IFNDEF FHIR2} - iRefs : TCardinalArray; - i : integer; - p : TFHIRLookupOpRespPropertyW; - {$ENDIF} - ctx : TLoincProviderContext; + c : TFDBConnection; begin - langs := langsForLang(langList); - ctx := ctxt as TLoincProviderContext; - if ctx.FKind = lpckCode then - begin - CodeList.GetInformation(ctx.FIndex, langs, s, iDescription, iOtherNames, iEntries, iStems, iComponent, iProperty, iTimeAspect, iSystem, iScale, iMethod, iClass, iFlags); - - {$IFNDEF FHIR2} - if hasProp(props, 'COMPONENT', true) and (iComponent <> 0) Then - resp.AddProp('COMPONENT').description := GetConceptDesc(iComponent, langs); - if hasProp(props, 'PROPERTY', true) and (iProperty <> 0) Then - resp.AddProp('PROPERTY').description := GetConceptDesc(iProperty, langs); - if hasProp(props, 'TIME_ASPCT', true) and (iTimeAspect <> 0) Then - resp.AddProp('TIME_ASPCT').description := GetConceptDesc(iTimeAspect, langs); - if hasProp(props, 'SYSTEM', true) and (iSystem <> 0) Then - resp.AddProp('SYSTEM').description := GetConceptDesc(iSystem, langs); - if hasProp(props, 'SCALE_TYP', true) and (iScale <> 0) Then - resp.AddProp('SCALE_TYP').description := GetConceptDesc(iScale, langs); - if hasProp(props, 'METHOD_TYP', true) and (iMethod <> 0) Then - resp.AddProp('METHOD_TYP').description := GetConceptDesc(iMethod, langs); - if hasProp(props, 'CLASS', true) and (iClass <> 0) Then - resp.AddProp('CLASS').description := GetConceptDesc(iClass, langs); - if hasProp(props, 'CLASSTYPE', true) Then - Begin - p := resp.AddProp('CLASSTYPE'); - if iFlags and FLAGS_CLIN > 0 Then - p.description := 'Clinical' - Else if iFlags and FLAGS_ATT > 0 Then - p.description := 'Attachment' - Else if iFlags and FLAGS_SURV > 0 Then - p.description := 'Survey' - Else - p.description := 'Lab'; - end; - - if hasProp(props, 'STATUS', true) Then - Begin - p := resp.AddProp('STATUS'); - if iFlags and FLAGS_HOLD > 0 Then - p.description := 'Not yet final' - Else - p.description := 'Final'; + resp.isAbstract := false; + c := FDB.getConnection('extendLookup'); + try + c.sql := 'Select RelationshipTypes.Description as Relationship, Codes.Code, Codes.Description as Value from Relationships, RelationshipTypes, Codes where Relationships.SourceKey = '+inttostr((ctxt as TLoincProviderContext).key)+' and Relationships.RelationshipTypeKey = RelationshipTypes.RelationshipTypeKey and Relationships.TargetKey = Codes.CodeKey'; + c.prepare; + c.execute; + while c.fetchNext do + begin + resp.AddProp(c.colStringByName['Relationship']).value := Factory.makeCode(c.colStringByName['Code']); end; - - if hasProp(props, 'Root', true) Then - Begin - if iFlags and FLAGS_ROOT > 0 Then - Begin - resp.AddProp('Root').description := 'This is a root of a set'; - End; + c.terminate; + + c.sql := 'Select Description, Value from Properties, PropertyTypes, PropertyValues where CodeKey = '+inttostr((ctxt as TLoincProviderContext).key)+' and Properties.PropertyTypeKey = PropertyTypes.PropertyTypeKey and Properties.PropertyValueKey = PropertyValues.PropertyValueKey'; + c.prepare; + c.execute; + while c.fetchNext do + resp.AddProp(c.colStringByName['Description']).value := Factory.makeString(c.colStringByName['Value']); + c.terminate; + + c.sql := 'Select StatusCodes.Description from Codes, StatusCodes where CodeKey = '+inttostr((ctxt as TLoincProviderContext).key)+' and Codes.StatusKey != 0 and Codes.StatusKey = StatusCodes.StatusKey'; + c.prepare; + c.execute; + while c.fetchNext do + resp.AddProp('STATUS').value := Factory.makeString(c.colStringByName['Description']); + c.terminate; + + case (ctxt as TLoincProviderContext).Kind of + lpckCode: resp.addDesignation('en-US', 'http://loinc.org', 'LONG_COMMON_NAME', 'LONG_COMMON_NAME', (ctxt as TLoincProviderContext).desc); + lpckPart: resp.addDesignation('en-US', 'http://loinc.org', 'PartDisplayName', 'PartDisplayName', (ctxt as TLoincProviderContext).desc); + lpckList: resp.addDesignation('en-US', 'http://loinc.org', 'LONG_COMMON_NAME', 'LONG_COMMON_NAME', (ctxt as TLoincProviderContext).desc); + lpckAnswer: resp.addDesignation('en-US', 'http://loinc.org', 'LONG_COMMON_NAME', 'LONG_COMMON_NAME', (ctxt as TLoincProviderContext).desc); end; - if hasProp(props, 'UNITSREQUIRED', true) Then - Begin - if iFlags and FLAGS_UNITS > 0 Then - Begin - resp.AddProp('UNITSREQUIRED').description := 'Units are required'; - End; - end; - if hasProp(props, 'ORDER_OBS', true) Then - Begin - p := resp.AddProp('ORDER_OBS'); - if (iFlags and FLAGS_ORDER> 0 ) and (iFlags and FLAGS_OBS> 0 ) Then - p.description := 'Both' - Else if iFlags and FLAGS_ORDER > 0 Then - p.description := 'Order' - Else if iFlags and FLAGS_OBS > 0 Then - p.description := 'Observation' - else - p.description := 'Neither'; - end; + c.sql := 'Select Languages.Code as Lang, DescriptionTypes.Description as DType, Value from Descriptions, Languages, DescriptionTypes where CodeKey = '+inttostr((ctxt as TLoincProviderContext).key)+' and Descriptions.DescriptionTypeKey != 4 and Descriptions.DescriptionTypeKey = DescriptionTypes.DescriptionTypeKey and Descriptions.LanguageKey = Languages.LanguageKey'; + c.prepare; + c.execute; + while c.fetchNext do + resp.addDesignation(c.ColStringByName['Lang'], 'http://loinc.org', c.ColStringByName['DType'], c.ColStringByName['DType'], c.ColStringByName['Value']); + c.terminate; - if iOtherNames <> 0 Then - Begin - iRefs := Refs.GetRefs(iOtherNames); - for i := Low(iRefs) To High(iRefs) Do - if iRefs[i] <> 0 Then - begin - s := Desc.GetEntry(iRefs[i], ll); - if useLang(ll, langs, false) then - resp.addDesignation(langDesc(ll), URI_SNOMED, '446211000124102', 'Alias name', s); - end; - End; - {$ENDIF} - End; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; + end; + end; end; @@ -2306,10 +915,14 @@ function TLOINCServices.getDefinition(code: String): String; end; function TLOINCServices.getDisplay(code: String; langList : THTTPLanguageList): String; +var + ctxt : TLoincProviderContext; begin - result := GetDisplayByName(code, langsForLang(langList)); - if result = '' then - raise ETerminologyError.create('unable to find '+code+' in '+systemUri(nil), itInvalid); + ctxt := FCodes[code]; + if (ctxt = nil) then + result := '' + else + result := Display(ctxt, langList); end; function TLOINCServices.IsAbstract(context: TCodeSystemProviderContext): boolean; @@ -2318,398 +931,181 @@ function TLOINCServices.IsAbstract(context: TCodeSystemProviderContext): boolean end; function TLOINCServices.locate(code: String; altOpt : TAlternateCodeOptions; var message: String): TCodeSystemProviderContext; -var - i : Cardinal; begin - if CodeList.FindCode(code, i) then - result := TLoincProviderContext.Create(lpckCode, i) - else if Entries.FindCode(code, i, FDesc) then - result := TLoincProviderContext.Create(lpckPart, i) - else if AnswerLists.FindCode(code, i, FDesc) then - result := TLoincProviderContext.Create(lpckAnswer, i) - else - result := nil;//raise ETerminologyError.create('unable to find '+code+' in '+system); + result := FCodes[code].link; end; -function TLOINCServices.systemUri(context: TCodeSystemProviderContext): String; +function TLOINCServices.sameContext(a, b: TCodeSystemProviderContext): boolean; begin - result := URI_LOINC; + Result:=inherited sameContext(a, b); end; -function TLOINCServices.TotalCount: integer; +function TLOINCServices.systemUri: String; begin - result := CodeList.Count; + result := URI_LOINC; end; -function TLOINCServices.useLang(lang: byte; langs: TLangArray; incLast : boolean): boolean; -var - b: byte; +function TLOINCServices.TotalCount: integer; begin - result := false; - for b := 0 to length(langs) - 1 do - if (langs[b] = lang) and (inclast or ((b = 0) or (b < length(langs) - 1))) then - exit(true); + result := FCodes.Count; end; -function TLOINCServices.version(context: TCodeSystemProviderContext): String; +function TLOINCServices.version: String; begin result := FVersion; end; -function TLOINCServices.InFilter(ctxt: TCodeSystemProviderFilterContext; - concept: TCodeSystemProviderContext): Boolean; +function TLOINCServices.InFilter(ctxt: TCodeSystemProviderFilterContext; concept: TCodeSystemProviderContext): Boolean; begin - result := TLoincFilterHolder(ctxt).HasChild(lpckCode, integer(concept)-1); + result := (ctxt as TLoincFilterHolder).HasKey((concept as TLoincProviderContext).Key); end; -function TLOINCServices.FilterByPropertyId(prop: TLoincPropertyType; - op: TFhirFilterOperator; value: String): TCodeSystemProviderFilterContext; - function getProp(i : integer) : String; - var - langs : TLangArray; - code : String; - idesc, names, iEntries, iCategories, stems : Cardinal; - comp, iprop, time, system, scale, method, clss : Cardinal; - flags : Byte; - begin - CodeList.GetInformation(i, langs, code, idesc, names, iEntries, stems, comp, iprop, time, system, scale, method, clss, flags); - case prop of - lptComponents: result := GetConceptDesc(comp, langs); - lptProperties: result := GetConceptDesc(iprop, langs); - lptTimeAspects: result := GetConceptDesc(time, langs); - lptSystems: result := GetConceptDesc(system, langs); - lptScales: result := GetConceptDesc(scale, langs); - lptMethods: result := GetConceptDesc(method, langs); - lptClasses: result := GetConceptDesc(clss, langs); - else - result := ''; - end; - end; +function TLOINCServices.filterBySQL(c : TFDBConnection; sql, lsql: String): TCodeSystemProviderFilterContext; var - id, offset: Cardinal; - iName, iChildren, iCodes : Cardinal; - aMatches : TConceptReferenceArray; - aChildren : ftx_loinc_services.TCardinalArray; - p : TArray; - v : String; - regex : TRegularExpression; - i, t : integer; + keys : TKeyArray; + l : integer; begin - if not (op in [foEqual, foIn, foRegex]) then - raise ETerminologyError.create('Unsupported operator type '+CODES_TFhirFilterOperator[op], itInvalid); - - if op = foRegex then - begin - SetLength(aMatches, CodeList.Count); - t := 0; - regex := TRegularExpression.Create(value); - try - for i := 0 to CodeList.Count - 1 do - begin - v := getProp(i); - if regex.IsMatch(v) then - begin - aMatches[t].index := i; - aMatches[t].kind := lpckCode; - inc(t); - end; - end; - finally - regex.free; - end; - SetLength(aMatches, t); - result := TLoincFilterHolder.Create; - TLoincFilterHolder(result).SetChildren(aMatches); - end - else + SetLength(keys, 1000); + l := 0; + c.select(sql); + while c.fetchnext do begin - if op = foEqual then - p := value.Split([#1]) - else - p := value.Split([',']); - result := TLoincFilterHolder.Create; - try - SetLength(aMatches, 0); - for v in p do - begin - id := GetPropertyId(prop, noLang, v); - if (id <> 0) then - begin - Concepts.GetConcept(id, noLang, iName, iChildren, iCodes); - aChildren := Refs.GetRefs(iCodes); - if length(aChildren) > 0 then - begin - offset := length(aMatches); - SetLength(aMatches, offset + length(aChildren)); - for i := 0 to length(aMatches) - 1 do - begin - aMatches[offset+i].index := aChildren[i]; - aMatches[offset+i].kind := lpckCode; - end; - end; - end; - end; - TLoincFilterHolder(result).SetChildren(aMatches); - result.link; - finally - result.free; + if (c.ColKeyByName['Key'] <> 0) then + begin + if (l = length(keys)) then + SetLength(keys, l + 1000); + keys[l] := c.ColKeyByName['Key']; + inc(l); end; end; + c.terminate; + SetLength(keys, l); + result := TLoincFilterHolder.create; + TLoincFilterHolder(result).FKeys := keys; + TLoincFilterHolder(result).lsql := lsql; end; -// this is a rare operation. But even so, is it worth pre-calculating this one on import? -function TLOINCServices.FilterBySubset(op: TFhirFilterOperator; subset: TLoincSubsetId): TCodeSystemProviderFilterContext; -var - refs : TCardinalArray; - children : TConceptReferenceArray; - i : integer; -begin - if op <> foEqual then - raise ETerminologyError.Create('Unsupported operator type '+CODES_TFhirFilterOperator[op], itInvalid); - - refs := FRefs.GetRefs(FSubsets[subset]); - setLength(children, length(refs)); - for i := 0 to length(refs)-1 do - begin - children[i].index := refs[i]; - children[i].kind := lpckCode; - end; - result := TLoincFilterHolder.Create; - TLoincFilterHolder(result).SetChildren(children); -end; - -Function SubSetForOrderObs(value : String): TLoincSubsetId; -begin - if sameText(value, 'Both') Then - result := lsiOrderObs - else if sameText(value, 'Observation') Then - result := lsiObs - else if sameText(value, 'Order') Then - result := lsiOrder - else - result := lsiNull; -end; - -Function SubSetForClassType(value : String): TLoincSubsetId; -begin - if sameText(value, '1') Then - result := lsiTypeObservation - else if sameText(value, '2') Then - result := lsiTypeClinical - else if sameText(value, '3') Then - result := lsiTypeAttachment - else if sameText(value, '4') Then - result := lsiTypeSurvey - else - result := lsiNull; -end; - -Function SubSetForCopyright(value : String): TLoincSubsetId; -begin - if sameText(value, 'LOINC') Then - result := lsiInternal - else if sameText(value, '3rdParty') Then - result := lsi3rdParty - else if sameText(value, 'All') Then - result := lsiAll - else - result := lsiNull; -end; - -Function SubSetForStatus(value : String): TLoincSubsetId; -begin - if sameText(value, 'ACTIVE') Then - result := lsiActive - else if sameText(value, 'DEPRECATED') Then - result := lsiDeprecated - else if sameText(value, 'DISCOURAGED') Then - result := lsiDiscouraged - else if sameText(value, 'TRIAL') Then - result := lsiTrial - else - result := lsiNull; -end; -function TLOINCServices.FilterByHeirarchy(op: TFhirFilterOperator; - value: String; transitive: boolean): TCodeSystemProviderFilterContext; +function TLOINCServices.filter(forIteration : boolean; prop: String; op: TFhirFilterOperator; value: String; prep: TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; var - index : Cardinal; - aChildren : TConceptReferenceArray; - c : ftx_loinc_services.TCardinalArray; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; - s : String; - i : integer; -begin - result := TLoincFilterHolder.Create; + c : TFDBConnection; + ts : TStringList; + reg : TRegularExpression; +begin + c := FDB.getConnection('filterBySQL'); try - if (op = foEqual) and (value.Contains(',')) then - raise ETerminologyError.create('Value is illegal - no commas', itInvalid); - if (not (op in [foEqual, foIn])) then - raise ETerminologyError.create('Unsupported operator type '+CODES_TFhirFilterOperator[op], itInvalid); - - while (value <> '') do + if (FRelationships.ContainsKey(prop) and (op = foEqual)) then + if FCodes.ContainsKey(value) then + result := FilterBySQL(c, 'select SourceKey as Key from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in (select CodeKey from Codes where Code = '''+sqlwrapString(value)+''') order by SourceKey ASC', + 'select count(SourceKey) from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in (select CodeKey from Codes where Code = '''+sqlwrapString(value)+''') and SourceKey = ') + else + result := FilterBySQL(c, 'select SourceKey as Key from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in (select CodeKey from Codes where Description = '''+sqlwrapString(value)+''' COLLATE NOCASE) order by SourceKey ASC', + 'select count(SourceKey) from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in (select CodeKey from Codes where Description = '''+sqlwrapString(value)+''' COLLATE NOCASE) and SourceKey = ') + else if (FProperties.ContainsKey(prop) and (op = foEqual)) then + result := FilterBySQL(c, 'select CodeKey as Key from Properties, PropertyValues where Properties.PropertyTypeKey = '+FProperties[prop]+' and Properties.PropertyValueKey = PropertyValues.PropertyValueKey and PropertyValues.Value = '''+SQLWrapString(value)+''' COLLATE NOCASE order by CodeKey ASC', + 'select count(CodeKey) from Properties, PropertyValues where Properties.PropertyTypeKey = '+FProperties[prop]+' and Properties.PropertyValueKey = PropertyValues.PropertyValueKey and PropertyValues.Value = '''+SQLWrapString(value)+''' COLLATE NOCASE and CodeKey = ') + else if (FRelationships.ContainsKey(prop) and (op = foExists)) then + if FCodes.ContainsKey(value) then + result := FilterBySQL(c, 'select SourceKey as Key from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and exists (select CodeKey from Codes where (Code = '''+sqlwrapString(value)+''')) order by SourceKey ASC', + 'select count(SourceKey) from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and exists (select CodeKey from Codes where (Code = '''+sqlwrapString(value)+''')) and SourceKey = ') + else + result := FilterBySQL(c, 'select SourceKey as Key from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and exists (select CodeKey from Codes where (Description = '''+sqlwrapString(value)+''' COLLATE NOCASE)) order by SourceKey ASC', + 'select count(SourceKey) from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and exists (select CodeKey from Codes where (Description = '''+sqlwrapString(value)+''' COLLATE NOCASE)) and SourceKey = ') + else if (FProperties.ContainsKey(prop) and (op = foExists)) then + result := FilterBySQL(c, 'select distinct CodeKey as Key from Properties where Properties.PropertyTypeKey = '+FProperties[prop]+' order by CodeKey ASC', + 'select count(CodeKey) from Properties where Properties.PropertyTypeKey = '+FProperties[prop]+' and CodeKey = ') + else if (prop = 'STATUS') and (op = foEqual)and (FStatusKeys.ContainsKey(value)) then + result := FilterBySQL(c, 'select CodeKey as Key from Codes where StatusKey = '+FStatusKeys[value]+' order by CodeKey ASC', + 'select count(CodeKey) from Codes where StatusKey = '+FStatusKeys[value]+' and CodeKey = ') + else if (prop = 'LIST') and (op = foEqual) and (FCodes.ContainsKey(value)) then + result := FilterBySQL(c, 'select TargetKey as Key from Relationships where RelationshipTypeKey = '+FRelationships['Answer']+' and SourceKey in (select CodeKey from Codes where (Code = '''+sqlwrapString(value)+''')) order by SourceKey ASC', + 'select count(TargetKey) from Relationships where RelationshipTypeKey = '+FRelationships['Answer']+' and SourceKey in (select CodeKey from Codes where (Code = '''+sqlwrapString(value)+''')) and TargetKey = ') + else if (FRelationships.ContainsKey(prop)) and (op = foRegex) then begin - StringSplit(value, ',', s, value); - if (FEntries.FindCode(s, index, FDesc)) then - begin - FEntries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - if transitive then - c := Refs.GetRefs(descendentConcepts) - else - c := Refs.GetRefs(concepts); - if (length(c) > 0) then - begin - setLength(aChildren, length(aChildren) + length(c)); - for i := 0 to length(c) - 1 do - begin - aChildren[length(aChildren) - length(c) + i].index := c[i]; - aChildren[length(aChildren) - length(c) + i].kind := lpckCode; - end; + reg := TRegularExpression.Create(value); + try + ts := TStringList.create; + try + c.select('Select CodeKey as Key, Description from Codes where CodeKey in (select TargetKey from Relationships where RelationshipTypeKey = '+FRelationships[prop]+')'); + while c.FetchNext do + if reg.IsMatch(c.ColStringByName['Description']) then + ts.add(c.ColStringByName['Key']); + c.terminate; + result := FilterBySQL(c, 'select SourceKey as Key from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in ('+ts.CommaText+') order by SourceKey ASC', + 'select count(SourceKey) from Relationships where RelationshipTypeKey = '+FRelationships[prop]+' and TargetKey in ('+ts.CommaText+') and SourceKey = ') + finally + ts.free; end; + finally + reg.free; end; - end; - - TLoincFilterHolder(result).SetChildren(aChildren); - result.link; - finally - result.free; - end; -end; - -function TLOINCServices.FilterByIsA(value: String; this: boolean - ): TCodeSystemProviderFilterContext; -var - index, i: Cardinal; - aChildren : TConceptReferenceArray; - c : ftx_loinc_services.TCardinalArray; - code, text, parents, children, concepts, descendentConcepts, stems: Cardinal; - s : String; -begin - result := TLoincFilterHolder.Create; - try - setLength(aChildren, 0); - - while (value <> '') do + end + else if (FProperties.ContainsKey(prop)) and (op = foRegex) then begin - StringSplit(value, ',', s, value); - if (FEntries.FindCode(s, index, FDesc)) then - begin - if this then - begin - setLength(aChildren, length(aChildren)+1); - aChildren[length(aChildren)-1].index := CodeList.Count + AnswerLists.Count + index; - aChildren[length(aChildren)-1].kind := lpckPart; - end; - FEntries.GetEntry(index, code, text, parents, children, concepts, descendentConcepts, stems); - - // todo: make it recursive - c := Refs.GetRefs(children); - if (length(c) > 0) then - begin - setLength(aChildren, length(aChildren) + length(c)); - for i := 0 to length(c) - 1 do - begin - aChildren[length(aChildren) - length(c) + i].index := c[i] + CodeList.Count + AnswerLists.Count; - aChildren[length(aChildren) - length(c) + i].kind := lpckPart; - end; - end; - c := Refs.GetRefs(descendentConcepts); - if (length(c) > 0) then - begin - setLength(aChildren, length(aChildren) + length(c)); - for i := 0 to length(c) - 1 do - begin - aChildren[length(aChildren) - length(c) + i].index := c[i]; - aChildren[length(aChildren) - length(c) + i].kind := lpckPart; - end; + reg := TRegularExpression.Create(value); + try + ts := TStringList.create; + try + c.select('Select PropertyValueKey, Value from PropertyValues where PropertyValueKey in (select PropertyValueKey from Properties where PropertyTypeKey = '+FProperties[prop]+')'); + while c.FetchNext do + if reg.IsMatch(c.ColStringByName['Value']) then + ts.add(c.ColStringByName['PropertyValueKey']); + c.terminate; + result := FilterBySQL(c, 'select CodeKey as Key from Properties where PropertyTypeKey = '+FProperties[prop]+' and PropertyValueKey in ('+ts.CommaText+') order by CodeKey ASC', + 'select count(CodeKey) from Properties where PropertyTypeKey = '+FProperties[prop]+' and PropertyValueKey in ('+ts.CommaText+') and CodeKey = ') + finally + ts.free; end; + finally + reg.free; end; + end + else if (prop = 'concept') and (op in [foIsA, foDescendentOf]) then + result := FilterBySQL(c, 'select DescendentKey as Key from Closure where AncestorKey in (select CodeKey from Codes where Code = '''+sqlwrapString(value)+''') order by DescendentKey ASC', + 'select count(DescendentKey) from Closure where AncestorKey in (select CodeKey from Codes where Code = '''+sqlwrapString(value)+''') and DescendentKey = ') + else if (prop = 'copyright') and (op = foEqual) and (value = 'LOINC') then + result := FilterBySQL(c, 'select CodeKey as Key from Codes where not CodeKey in (select CodeKey from Properties where PropertyTypeKey = 9) order by CodeKey ASC', + 'select count(CodeKey) from Codes where not CodeKey in (select CodeKey from Properties where PropertyTypeKey = 9) and CodeKey = ' ) + else if (prop = 'copyright') and (op = foEqual) and (value = '3rdParty') then + result := FilterBySQL(c, 'select CodeKey as Key from Codes where CodeKey in (select CodeKey from Properties where PropertyTypeKey = 9) order by CodeKey ASC', + 'select count(CodeKey) from Codes where CodeKey in (select CodeKey from Properties where PropertyTypeKey = 9) and CodeKey = ') + else + result := nil; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; end; - - TLoincFilterHolder(result).SetChildren(aChildren); - result.link; - finally - result.free; end; end; -function TLOINCServices.FilterByList(op: TFhirFilterOperator; list: String): TCodeSystemProviderFilterContext; +function TLOINCServices.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TCodeSystemProviderContext; var - index : Cardinal; - text : Cardinal; - children : Cardinal; - code : Cardinal; - refs : TCardinalArray; - matches : TConceptReferenceArray; - i : integer; -begin - if FAnswerLists.FindCode(list, index, FDesc) then - begin - FAnswerLists.GetEntry(index, code, text, children); - result := TLoincFilterHolder.Create; - refs := FRefs.GetRefs(children); - setLength(matches, length(refs)); - for i := 0 to length(refs) - 1 do - begin - matches[i].index := refs[i]; - matches[i].kind := lpckAnswer; - end; - TLoincFilterHolder(result).SetChildren(matches); - end - else - result := nil; -end; - -function TLOINCServices.filter(forIteration : boolean; prop: String; op: TFhirFilterOperator; value: String; prep: TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; + ndx : integer; + context : TLoincFilterHolder; begin - if prop = 'SCALE_TYP' then - result := FilterByPropertyId(lptScales, op, value) - else if prop = 'CLASS' then - result := FilterByPropertyId(lptClasses, op, value) - else if prop = 'COMPONENT' then - result := FilterByPropertyId(lptComponents, op, value) - else if prop = 'PROPERTY' then - result := FilterByPropertyId(lptProperties, op, value) - else if prop = 'TIME_ASPCT' then - result := FilterByPropertyId(lptTimeAspects, op, value) - else if prop = 'SYSTEM' then - result := FilterByPropertyId(lptSystems, op, value) - else if prop = 'METHOD_TYP' then - result := FilterByPropertyId(lptMethods, op, value) - else if prop = 'ORDER_OBS' then - result := FilterBySubset(op, SubSetForOrderObs(value)) - else if prop = 'CLASSTYPE' then - result := FilterBySubset(op, SubSetForClassType(value)) - else if prop = 'STATUS' then - result := FilterBySubset(op, SubSetForStatus(value)) - else if prop = 'copyright' then - result := FilterBySubset(op, SubSetForCopyright(value)) - else if prop = 'parent' then - result := FilterByHeirarchy(op, value, false) - else if prop = 'ancestor' then - result := FilterByHeirarchy(op, value, true) - else if (prop = 'concept') and (op in [foIsA, foDescendentOf]) then - result := FilterByIsA(value, op = foIsA) - else if (prop = 'LIST') and (op = foEqual) then - result := FilterByList(op, value) - else if prop = 'Type' then - result := TLoincFilterHolder.create - else - result := nil; + context := ctxt as TLoincFilterHolder; + ndx := context.FKeys[context.FCursor-1]; + result := FCodeList[ndx].link; end; -function TLOINCServices.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TCodeSystemProviderContext; +function TLOINCServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boolean; var - ref : TConceptReference; + context : TLoincFilterHolder; begin - ref := TLoincFilterHolder(ctxt).FChildren[TLoincFilterHolder(ctxt).FIndex-1]; - result := TLoincProviderContext.create(ref.kind, ref.index); + context := ctxt as TLoincFilterHolder; + inc(context.FCursor); + result := context.FCursor <= Length(context.FKeys); end; -function TLOINCServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boolean; +function TLOINCServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +var + context : TLoincFilterHolder; begin - inc(TLoincFilterHolder(ctxt).FIndex); - result := TLoincFilterHolder(ctxt).FIndex <= length(TLoincFilterHolder(ctxt).FChildren); + context := ctxt as TLoincFilterHolder; + result := Length(context.FKeys); end; function TLOINCServices.locateIsA(code, parent: String; disallowParent : boolean = false): TCodeSystemProviderContext; @@ -2722,326 +1118,196 @@ function TLOINCServices.name(context: TCodeSystemProviderContext): String; result := 'LOINC'; end; -function TLOINCServices.sameContext(a, b: TCodeSystemProviderContext): boolean; -begin - result := (a is TLoincProviderContext) and (b is TLoincProviderContext) - and ((a as TLoincProviderContext).FKind = (b as TLoincProviderContext).FKind) - and ((a as TLoincProviderContext).FIndex = (b as TLoincProviderContext).FIndex); -end; - function TLOINCServices.filterLocate(ctxt: TCodeSystemProviderFilterContext; code: String; var message: String): TCodeSystemProviderContext; var - i : Cardinal; - holder : TLoincFilterHolder; + ci : TLoincProviderContext; + fi : TLoincFilterHolder; + c : TFDBConnection; begin - if (ctxt = nil) then - result := nil + fi := ctxt as TLoincFilterHolder; + result := nil; + + ci := FCodes[code]; + if (ci = nil) then + message := 'Not a valid code: '+code + else if fi.lsql = '' then + message := 'Filter not understood' else begin - holder := TLoincFilterHolder(ctxt); - if CodeList.FindCode(code, i) and holder.hasChild(lpckCode, i) then - result := TLoincProviderContext.create(lpckCode, i) - else if AnswerLists.FindCode(code, i, FDesc) and holder.hasChild(lpckAnswer, i) then - result := TLoincProviderContext.create(lpckAnswer, i) - else - result := nil; + c := FDB.getConnection('filterLocate'); + try + if c.CountSQL(fi.lsql+inttostr(ci.key)) > 0 then + result := ci.link; + c.release; + except + on e : Exception do + begin + c.error(e); + raise; + end; + end; end; end; -function TLOINCServices.findMAConcept(code: String): Cardinal; -begin - if not Entries.FindCode(code, result, FDesc) then - result := 0; -end; - -{ TLOINCHeirarchyEntryList } +{ TLoincFilterHolder } -procedure TLOINCHeirarchyEntryList.SetStems(iIndex, iValue: Cardinal); +function TLoincFilterHolder.HasKey(key : cardinal) : boolean; +var + i : integer; begin - Move(iValue, FMaster[iIndex*(28)+24], 4); + result := false; + for i := 0 to Length(FKeys) - 1 do + begin + if (FKeys[i] = key) then + exit(true); + end; end; -procedure TLOINCHeirarchyEntryList.StartBuild; -begin - FBuilder := TFslBytesBuilder.Create; -end; +{ TDescriptionCacheEntry } -function TLOINCHeirarchyEntryList.AddEntry(code, text, parents, children, concepts, descendentConcepts: Cardinal): Cardinal; +constructor TDescriptionCacheEntry.create(display: boolean; lang: String; value: String); begin - Result := FBuilder.Length div 28; - FBuilder.AddCardinal(code); - FBuilder.AddCardinal(text); - FBuilder.AddCardinal(children); - FBuilder.AddCardinal(concepts); - FBuilder.AddCardinal(descendentConcepts); - FBuilder.AddCardinal(parents); - FBuilder.AddCardinal(0); // stems, fill out later + inherited create; + FDisplay := display; + FLang := lang; + FValue := value; end; -function TLOINCHeirarchyEntryList.Count: Integer; -begin - result := Length(FMaster) div 28; -end; -procedure TLOINCHeirarchyEntryList.DoneBuild; +{ TLoincProviderContext } + +procedure TLoincProviderContext.addChild(key: Integer); begin - FMaster := FBuilder.AsBytes; - FBuilder.free; + if FChildren = nil then + FChildren := TKeySet.create; + FChildren.addKey(key); end; -function TLOINCHeirarchyEntryList.FindCode(sCode: String; var iIndex: Cardinal; Strings : TLoincStrings): Boolean; -var - L, H, I, d : Cardinal; - C: Integer; - s : String; - lang : byte; +constructor TLoincProviderContext.Create(key: cardinal; + kind: TLoincProviderContextKind; code, desc: String); begin - if Length(FMaster) = 0 Then - Result := False - Else - Begin - Result := False; - L := 0; - H := (Length(FMaster) div (28)) - 1; - while L <= H do - begin - I := (L + H) shr 1; - Move(FMaster[i*28], d, 4); - s := Strings.GetEntry(d, lang); - C := CompareStr(s, sCode); - if C < 0 then - L := I + 1 - else - begin - if i = 0 then - break; - H := I - 1; - if C = 0 then - begin - Result := True; - L := I; - end; - end; - end; - iIndex := L; - End; + inherited Create; + FKey := key; + FCode := code; + FKind := kind; + FDesc := desc; + FDisplays := TFslList.create; end; -procedure TLOINCHeirarchyEntryList.GetEntry(iIndex: Cardinal; var code, text, parents, children, concepts, descendentConcepts, stems: Cardinal); +destructor TLoincProviderContext.Destroy; begin - if iIndex >= (Length(FMaster) div 28) Then - raise ETerminologyError.create('Attempt to access invalid LOINC Entry index', itException); - Move(FMaster[(iIndex*28)+0], code, 4); - Move(FMaster[(iIndex*28)+4], text, 4); - Move(FMaster[(iIndex*28)+8], children, 4); - Move(FMaster[(iIndex*28)+12], concepts, 4); - Move(FMaster[(iIndex*28)+16], descendentConcepts, 4); - Move(FMaster[(iIndex*28)+20], parents, 4); - Move(FMaster[(iIndex*28)+24], stems, 4); + FDisplays.free; + FChildren.free; + inherited Destroy; end; - - -function TLOINCHeirarchyEntryList.sizeInBytesV(magic : integer) : cardinal; +function TLoincProviderContext.link : TLoincProviderContext; begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); + result := TLoincProviderContext(inherited link); end; -{ TLOINCAnswersList } +{ TLOINCServiceList } -function TLOINCAnswersList.AddEntry(code, description, answers: Cardinal): Cardinal; +destructor TLOINCServiceList.Destroy; begin - Result := FBuilder.Length div 12; - FBuilder.AddCardinal(code); - FBuilder.AddCardinal(description); - FBuilder.AddCardinal(answers); + FDefinition.free; + inherited; end; -function TLOINCAnswersList.Count: cardinal; +function TLOINCServiceList.GetDefinition: TLOINCServices; begin - result := cLength(FMaster) div 12; + if FDefinition = nil then + raise ETerminologyError.create('There is no default LOINC service', itException); + result := FDefinition; end; -procedure TLOINCAnswersList.DoneBuild; +function TLOINCServiceList.GetService(i: integer): TLOINCServices; begin - FMaster := FBuilder.AsBytes; - FBuilder.free; + result := TLOINCServices(ObjectByIndex[i]); end; -function TLOINCAnswersList.FindCode(sCode: String; var iIndex: Cardinal; Strings: TLoincStrings): Boolean; +function TLOINCServiceList.GetServiceByName(sName: String): TLOINCServices; var - L, H, I, d : integer; - C : Integer; - s : String; - lang : byte; + i : integer; begin - if Length(FMaster) = 0 Then - Result := False + if sName = '' then + result := DefaultService Else Begin - Result := False; - L := 0; - H := (Length(FMaster) div (12)) - 1; - while L <= H do - begin - I := (L + H) shr 1; - if ((i * 12) > length(FMaster) - 4) and DebugConsoleMessages then - writeln('err'); - Move(FMaster[i*12], d, 4); - s := Strings.GetEntry(d, lang); - C := CompareStr(s, sCode); - if C < 0 then L := I + 1 else - begin - H := I - 1; - if C = 0 then - begin - Result := True; - L := I; - end; - end; - end; - iIndex := L; - End; - if not result then - begin - for i := 0 to (Length(FMaster) div (12)) - 1 do - begin - Move(FMaster[i*12], d, 4); - s := Strings.GetEntry(d, lang); - C := CompareStr(s, sCode); - if (c = 0) then - begin - iIndex := i; - exit(true); - end; - end; - end; -end; - -procedure TLOINCAnswersList.GetEntry(iIndex: Cardinal; var code, description, answers: Cardinal); -begin - if iIndex > (Length(FMaster) div 12) Then - raise ETerminologyError.create('Attempt to access invalid LOINC Entry index', itException); - Move(FMaster[(iIndex*12)+0], code, 4); - Move(FMaster[(iIndex*12)+4], description, 4); - Move(FMaster[(iIndex*12)+8], answers, 4); -end; + Result := nil; + i := 0; + While (i < Count) and (result = nil) do + Begin + if SameText(Service[i].FVersion, sName) then + result := Service[i]; + inc(i); + End; + End;end; -procedure TLOINCAnswersList.StartBuild; +function TLOINCServiceList.HasDefaultService: Boolean; begin - FBuilder := TFslBytesBuilder.Create; + result := FDefinition <> nil; end; -function TLOINCAnswersList.sizeInBytesV(magic : integer) : cardinal; +function TLOINCServiceList.ItemClass: TFslObjectClass; begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); + result := TLOINCServices; end; -function TLOINCServices.GetConceptDesc(iConcept : cardinal; langs : TLangArray):String; -var - iName : Cardinal; - iChildren : Cardinal; - iCodes : Cardinal; - lang : byte; -Begin - if iConcept = 0 then - result := '' - Else - Begin - Concepts.GetConcept(iConcept, langs, iName, iChildren, iCodes); - result := Desc.GetEntry(iname, lang); - End; -End; - - -{ TLoincLanguages } - -function TLoincLanguages.AddEntry(lang, country: String): byte; +procedure TLOINCServiceList.SetDefinition(const Value: TLOINCServices); begin - if Length(lang) <> 2 Then - raise ETerminologyError.create('LOINC Language code too long: '+lang, itException); - if Length(country) <> 2 Then - raise ETerminologyError.create('LOINC Language code too long: '+country, itException); - assert(FBuilder.Length mod 10 = 0); - result := FBuilder.Length div 10; - FBuilder.AddString2Byte(lang+'-'+country); + FDefinition := Value; end; -function TLoincLanguages.count: integer; +function TLOINCServiceList.sizeInBytesV(magic : integer) : cardinal; begin - result := FLength div 10; + result := inherited sizeInBytesV(magic); + inc(result, FDefinition.sizeInBytes(magic)); end; -procedure TLoincLanguages.DoneBuild; -begin - FMaster := FBuilder.AsBytes; - FLength := Length(FMaster); - FBuilder.free; -end; + +{ TLoincDisplay } -procedure TLoincLanguages.GetEntry(iIndex: byte; var lang, country: String); -var - s : String; +constructor TLoincDisplay.create(lang, v : String); begin - if ((iIndex +1 ) * 10 > FLength) then - raise ETerminologyError.create('Wrong length index getting LOINC language code', itException); - s := memU16ToString(FMaster, iIndex*10, 5); - StringSplit(s, '-', lang, country); + inherited Create; + FLanguage := lang; + FValue := v; end; -procedure TLoincLanguages.StartBuild; -begin - FBuilder := TFslBytesBuilder.Create; -end; +{ TLoincIteratorContext } -function nolang : TLangArray; +constructor TLoincIteratorContext.create(ctxt: TLoincProviderContext; keys: TKeyArray); begin - SetLength(result, 1); - result[0] := 0; + inherited create(ctxt, length(keys)); + FKeys := keys; end; -function TLoincLanguages.sizeInBytesV(magic : integer) : cardinal; +function TLoincIteratorContext.more: boolean; begin - result := inherited sizeInBytesV(magic); - inc(result, length(FMaster)); - inc(result, FBuilder.sizeInBytes(magic)); + Result := inherited more; end; -{ TLoincFilterHolder } - -procedure TLoincFilterHolder.SetChildren(children : TConceptReferenceArray); -begin - FChildren := children; -end; +{ TKeySet } -function TLoincFilterHolder.HasChild(kind : TLoincProviderContextKind; v : integer) : boolean; +function TKeySet.addKey(key: integer) : boolean; var i : integer; begin - result := false; - for i := 0 to Length(FChildren) - 1 do - begin - if (FChildren[i].index = Cardinal(v)) and (FChildren[i].kind = kind) then - begin - result := true; - exit; - end; - end; + for i := low(FKeys) to High(FKeys) do + if FKeys[i] = key then + exit(false); + if (FCount = length(FKeys)) then + SetLength(FKeys, length(FKeys) + KEY_INCREMENT); + FKeys[FCount] := key; + inc(FCount); + result := true; end; - -{ TLoincProviderContext } - -constructor TLoincProviderContext.create(kind: TLoincProviderContextKind; index: cardinal); +procedure TKeySet.close; begin - inherited Create; - FKind := kind; - FIndex := index; + SetLength(FKeys, FCount); end; End. diff --git a/library/ftx/ftx_sct_analysis.pas b/library/ftx/ftx_sct_analysis.pas index 146a9e63f..f25e9ac18 100644 --- a/library/ftx/ftx_sct_analysis.pas +++ b/library/ftx/ftx_sct_analysis.pas @@ -249,8 +249,7 @@ procedure TSnomedAnalysis.assess(b: TFslStringBuilder; id: String); constructor TSnomedAnalysis.Create(snomed: TSnomedServices); begin Create; - FSnomed := TSnomedProvider.create(snomed.link, nil); - snomed.checkLoaded; + FSnomed := TSnomedProvider.create(snomed.link, nil, nil); end; //function TSnomedAnalysis.CreateCC(index: Cardinal): TFhirCodeableConcept; diff --git a/library/ftx/ftx_sct_expressions.pas b/library/ftx/ftx_sct_expressions.pas index 0ac044681..ad5c268d1 100644 --- a/library/ftx/ftx_sct_expressions.pas +++ b/library/ftx/ftx_sct_expressions.pas @@ -35,7 +35,7 @@ interface uses SysUtils, Classes, Generics.Defaults, - fsl_base, + fsl_base, fsl_utilities, fhir_objects, ftx_service; @@ -354,13 +354,13 @@ constructor TSnomedExpression.Create; function TSnomedExpression.describe: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; concept : TSnomedConcept; refinement : TSnomedRefinement; refinementGroup : TSnomedRefinementGroup; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try case status of SnomedExpressionStatusEquivalent:b.Append('==='); @@ -624,11 +624,11 @@ constructor TSnomedRefinementGroup.Create; function TSnomedRefinementGroup.describe: String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; refinement : TSnomedRefinement; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for refinement in refinements do @@ -1009,11 +1009,15 @@ function TSnomedExpressionParser.stringConstant: String; SetLength(result, MAX_TERM_LENGTH); fixed('"'); i := 0; - while peek <> '"' do + while (peek <> '"') and (peek <> #0) do begin inc(i); + if (i > MAX_TERM_LENGTH) then + raise ETerminologyError.Create('Constant too long (>'+inttostr(MAX_TERM_LENGTH)+' chars) at character '+inttostr(cursor), itInvalid); result[i] := next; end; + if (peek = #0) then + raise ETerminologyError.Create('Unterminated Constant at character '+inttostr(cursor), itInvalid); fixed('"'); SetLength(result, i); end; diff --git a/library/ftx/ftx_sct_publisher.pas b/library/ftx/ftx_sct_publisher.pas index 18f0f0168..f33d575b6 100644 --- a/library/ftx/ftx_sct_publisher.pas +++ b/library/ftx/ftx_sct_publisher.pas @@ -40,6 +40,7 @@ Const MAX_ROWS = 100; + DOING_REFSETS_FOR_DESCS = false; Type TIdArray = array of cardinal; @@ -47,12 +48,16 @@ TConceptDisplayType = (cdDesc, cdConceptId, cdBoth); + { TSnomedPublisher } + TSnomedPublisher = class (TFslObject) Private FSnomed : TSnomedServices; Lock : TFslLock; FSearchCache : TStringList; - FFHIRPath : String; + FFHIRPath : String; + FStart : UInt64; + procedure deadCheck; Function GetPaths(iIndex : Cardinal) : TArrayofIdArray; Function ConceptForDesc(iDesc : Cardinal; var iDescs : Cardinal):Cardinal; Procedure ConceptRef(html : THtmlPublisher; const sPrefix : String; iIndex : cardinal; show : TConceptDisplayType; rRating : Double); @@ -71,8 +76,9 @@ TSnomedPublisher = class (TFslObject) Procedure ProcessMap(Const sPath : String; oMap : TFslStringMatch); Procedure PublishDictInternal(oMap : TFslStringMatch; Const sPrefix : String; html : THtmlPublisher); + Public - constructor Create(oSnomed : TSnomedServices; FHIRPathEngine : String); + constructor Create(oSnomed : TSnomedServices; FHIRPathEngine : String; start : UInt64); destructor Destroy; Override; Procedure PublishDict(Const sPath, sPrefix : String; html : THtmlPublisher); Overload; Virtual; Procedure PublishDict(oMap : TFslStringMatch; Const sPrefix : String; html : THtmlPublisher); Overload; Virtual; @@ -82,16 +88,6 @@ TSnomedPublisher = class (TFslObject) Implementation - -Function Screen(Const s, s2: String):String; -Begin - result := s; -// wtf is this code thinking it's doing? -// result := StringReplace(s, 'B', ''); -// if (s2 <> '') And StringEndsWith(result, s2) Then -// delete(result, length(result) - length(s2) + 1, length(s)); -End; - function StringToBoolDef(s : String; def : boolean):boolean; begin s := lowercase(s); @@ -115,7 +111,8 @@ function StringToBoolDef(s : String; def : boolean):boolean; result := def; end; -Procedure TSnomedPublisher.PublishDictInternal(oMap : TFslStringMatch; Const sPrefix : String; html : THtmlPublisher); +procedure TSnomedPublisher.PublishDictInternal(oMap: TFslStringMatch; + const sPrefix: String; html: THtmlPublisher); Var sURL : String; sId : String; @@ -136,7 +133,8 @@ function StringToBoolDef(s : String; def : boolean):boolean; PublishHome(sURL, html) End; -Procedure TSnomedPublisher.ProcessMap(Const sPath : String; oMap : TFslStringMatch); +procedure TSnomedPublisher.ProcessMap(const sPath: String; oMap: TFslStringMatch + ); Var sLeft, sRight : String; sName, sValue : String; @@ -155,7 +153,8 @@ function StringToBoolDef(s : String; def : boolean):boolean; End; -Procedure TSnomedPublisher.PublishDict(Const sPath, sPrefix : String; html : THtmlPublisher); +procedure TSnomedPublisher.PublishDict(const sPath, sPrefix: String; + html: THtmlPublisher); Var oMap : TFslStringMatch; Begin @@ -200,98 +199,90 @@ procedure TSnomedPublisher.PublishHome(const sPrefix: String; html: THtmlPublish } html.Heading(1, 'Snomed-CT Definitions (e: '+FSnomed.EditionName+', v: '+FSnomed.VersionDate+')'); - if Not FSnomed.Loaded Then - Begin + html.StartForm('GET', sPrefix); + html.StartParagraph; + html.AddTextPlain('Search: '); + html.textInput('srch'); + html.submit('Go'); + html.AddTextPlain(' '); + html.checkbox('all', false, 'Tight'); + html.endForm; + + html.StartList; + html.StartListItem; + html.URL('Browse All Concepts', sPrefix+'id=*'); + html.EndListItem; + html.EndList; + + if Length(FSnomed.ActiveRoots) = 1 Then + begin html.StartParagraph; - html.AddText('Snomed Definitions are not loaded', true, false); + html.AddText('Snomed Root Concept', true, false); html.EndParagraph; + PublishConcept(true, true, sPrefix, inttostr(FSnomed.Activeroots[0]), 0, html) End Else Begin - html.StartForm('GET', sPrefix); - html.StartParagraph; - html.AddTextPlain('Search: '); - html.textInput('srch'); - html.submit('Go'); - html.AddTextPlain(' '); - html.checkbox('all', false, 'Tight'); - html.endForm; - - html.StartList; - html.StartListItem; - html.URL('Browse All Concepts', sPrefix+'id=*'); - html.EndListItem; - html.EndList; - - if Length(FSnomed.ActiveRoots) = 1 Then - begin - html.StartParagraph; - html.AddText('Snomed Root Concept', true, false); - html.EndParagraph; - PublishConcept(true, true, sPrefix, inttostr(FSnomed.Activeroots[0]), 0, html) - End - Else - Begin - html.StartParagraph; - html.AddText('Snomed Root Concepts ('+inttostr(Length(FSnomed.ActiveRoots))+')', true, false); - html.EndParagraph; - html.StartList; - for i := 0 to min(Length(FSnomed.ActiveRoots) - 1, 1000) Do - Begin - html.StartListItem; - if FSnomed.Concept.FindConcept(FSnomed.ActiveRoots[i], iRef) Then - ConceptRef(html, sPrefix, iRef, cdBoth, 0); - html.EndListItem; - End; - html.EndList; - End; - - html.Line; html.StartParagraph; - html.AddText('Reference Sets', true, false); + html.AddText('Snomed Root Concepts ('+inttostr(Length(FSnomed.ActiveRoots))+')', true, false); html.EndParagraph; - SetLength(aRefs, FSnomed.RefSetIndex.Count); - for i := 0 to FSnomed.RefSetIndex.Count - 1 Do - aRefs[i] := i; - SortRefsets(aRefs); - if FSnomed.RefSetIndex.Count = 0 Then - Begin - html.StartParagraph; - html.AddText('No Reference Sets defined', false, true); - html.EndParagraph; - End; html.StartList; - for i := 0 to FSnomed.RefSetIndex.Count - 1 Do + for i := 0 to min(Length(FSnomed.ActiveRoots) - 1, 1000) Do Begin html.StartListItem; - RefsetRef(html, sPrefix, aRefs[i]); + if FSnomed.Concept.FindConcept(FSnomed.ActiveRoots[i], iRef) Then + ConceptRef(html, sPrefix, iRef, cdBoth, 0); html.EndListItem; End; html.EndList; + End; + deadCheck(); - html.Line; - Lock.Lock; - Try - if FSearchCache.Count <> 0 Then - Begin - html.AddParagraph('Past Searches:'); - html.StartList(false); - For i := 0 to FSearchCache.Count - 1 Do - begin - html.StartListItem; - html.ParaURL('Search for "'+FSearchCache[i]+'"', sPrefix+'srch='+FSearchCache[i]+'&caption=Search Snomed Concepts&prompt=Text'); - html.EndListItem; - end; - html.EndList(false); - End; - Finally - Lock.UnLock; + html.Line; + html.StartParagraph; + html.AddText('Reference Sets', true, false); + html.EndParagraph; + SetLength(aRefs, FSnomed.RefSetIndex.Count); + for i := 0 to FSnomed.RefSetIndex.Count - 1 Do + aRefs[i] := i; + SortRefsets(aRefs); + if FSnomed.RefSetIndex.Count = 0 Then + Begin + html.StartParagraph; + html.AddText('No Reference Sets defined', false, true); + html.EndParagraph; + End; + html.StartList; + for i := 0 to FSnomed.RefSetIndex.Count - 1 Do + Begin + html.StartListItem; + RefsetRef(html, sPrefix, aRefs[i]); + html.EndListItem; + End; + html.EndList; + + html.Line; + Lock.Lock('PublishHome'); + Try + if FSearchCache.Count <> 0 Then + Begin + html.AddParagraph('Past Searches:'); + html.StartList(false); + For i := 0 to FSearchCache.Count - 1 Do + begin + html.StartListItem; + html.ParaURL('Search for "'+FSearchCache[i]+'"', sPrefix+'srch='+FSearchCache[i]+'&caption=Search Snomed Concepts&prompt=Text'); + html.EndListItem; + end; + html.EndList(false); End; + Finally + Lock.UnLock; End; html.done; End; -Procedure TSnomedPublisher.SortRefsets(var a : TCardinalArray); +procedure TSnomedPublisher.SortRefsets(var a: TCardinalArray); Procedure QuickSort(L, R: Integer); Var @@ -345,7 +336,7 @@ procedure TSnomedPublisher.PublishHome(const sPrefix: String; html: THtmlPublish End; -Function TSnomedPublisher.GetPaths(iIndex : Cardinal): TArrayofIdArray; +function TSnomedPublisher.GetPaths(iIndex: Cardinal): TArrayofIdArray; var iParentIndex : Cardinal; iParents : TCardinalArray; @@ -389,19 +380,23 @@ procedure TSnomedPublisher.PublishHome(const sPrefix: String; html: THtmlPublish result := inttostr(iGroup); End; -Procedure TSnomedPublisher.ConceptRef(html : THtmlPublisher; const sPrefix : String; iIndex : cardinal; show : TConceptDisplayType; rRating : Double); +procedure TSnomedPublisher.ConceptRef(html: THtmlPublisher; + const sPrefix: String; iIndex: cardinal; show: TConceptDisplayType; + rRating: Double); Begin if show = cdBoth Then - html.URL(inttostr(FSnomed.Concept.GetIdentity(iIndex))+' '+Screen(FSnomed.GetPNForConcept(iIndex), ''), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) + html.URL(inttostr(FSnomed.Concept.GetIdentity(iIndex))+' '+FSnomed.GetPNForConcept(iIndex), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) Else if show = cdDesc then - html.URL(Screen(FSnomed.GetPNForConcept(iIndex), ''), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) + html.URL(FSnomed.GetPNForConcept(iIndex), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) else - html.URL(inttostr(FSnomed.Concept.GetIdentity(iIndex)), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex)), Screen(FSnomed.GetPNForConcept(iIndex), '')); + html.URL(inttostr(FSnomed.Concept.GetIdentity(iIndex)), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex)), FSnomed.GetPNForConcept(iIndex)); if rRating > 0 then html.AddTextPlain(' '+inttostr(Trunc(rRating * 10))); End; -Procedure TSnomedPublisher.CellConceptRef(html : THtmlPublisher; const sPrefix : String; iIndex : cardinal; show : TConceptDisplayType; iDesc : Cardinal = 0); +procedure TSnomedPublisher.CellConceptRef(html: THtmlPublisher; + const sPrefix: String; iIndex: cardinal; show: TConceptDisplayType; + iDesc: Cardinal); var s : String; Begin @@ -411,11 +406,11 @@ procedure TSnomedPublisher.PublishHome(const sPrefix: String; html: THtmlPublish s := FSnomed.GetPNForConcept(iIndex); if show = cdBoth Then - html.AddTableCellURL(inttostr(FSnomed.Concept.GetIdentity(iIndex))+' '+Screen(s, ''), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) + html.AddTableCellURL(inttostr(FSnomed.Concept.GetIdentity(iIndex))+' '+s, sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) Else if show = cdDesc then - html.AddTableCellURL(Screen(s, ''), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) + html.AddTableCellURL(s, sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex))) Else - html.AddTableCellURL(inttostr(FSnomed.Concept.GetIdentity(iIndex)), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex)), Screen(s, '')) + html.AddTableCellURL(inttostr(FSnomed.Concept.GetIdentity(iIndex)), sPrefix+'id='+inttostr(FSnomed.Concept.GetIdentity(iIndex)), s) End; Function ComparePaths(p1, p2: TIdArray) : Integer; @@ -450,7 +445,9 @@ procedure TSnomedPublisher.PublishHome(const sPrefix: String; html: THtmlPublish Until not bSwap; End; -procedure TSnomedPublisher.PublishPaths(html: THtmlPublisher; Const sPrefix : String; aPaths : TArrayofIdArray; iFocus : Cardinal; iIndent, iStart, iLow, iHigh : Integer); +procedure TSnomedPublisher.PublishPaths(html: THtmlPublisher; + const sPrefix: String; aPaths: TArrayofIdArray; iFocus: Cardinal; iIndent, + iStart, iLow, iHigh: Integer); var iCommon, iLoop, i, j : Integer; iValue : Cardinal; @@ -490,7 +487,7 @@ procedure TSnomedPublisher.PublishPaths(html: THtmlPublisher; Const sPrefix : St if j > 0 Then html.AddTextPlain('\'); if aPaths[iLow][j] = iFocus Then - html.AddText(Screen(FSnomed.GetPNForConcept(iFocus), ''), false, true) + html.AddText(FSnomed.GetPNForConcept(iFocus), false, true) Else ConceptRef(html, sPrefix, aPaths[iLow][j], cdDesc, 0); End; @@ -519,7 +516,7 @@ procedure TSnomedPublisher.PublishPaths(html: THtmlPublisher; Const sPrefix : St if j > 0 Then html.AddTextPlain('\'); if aPaths[i][j] = iFocus Then - html.AddText(Screen(FSnomed.GetPNForConcept(iFocus), ''), false, true) + html.AddText(FSnomed.GetPNForConcept(iFocus), false, true) Else ConceptRef(html, sPrefix, aPaths[i][j], cdDesc, 0); End; @@ -611,7 +608,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c FSN := FSnomed.GetFSN(Descriptions); PN := FSnomed.GetPN(Descriptions); if Not bRoot then - html.Heading(1, inttostr(Identity)+': '+screen(FSN, '')); + html.Heading(1, inttostr(Identity)+': '+FSN); if not bRoot Then Begin FPaths := GetPaths(iIndex); @@ -647,7 +644,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c html.AddTableCell('Status', true); html.AddTableCell('Case?', true); html.AddTableCell('Module', true); - if FSnomed.RefSetIndex.Count > 0 Then + if DOING_REFSETS_FOR_DESCS and (FSnomed.RefSetIndex.Count > 0) Then html.AddTableCell('Reference Sets', true); html.EndTableRow; for i := Low(Descriptions) To High(Descriptions) Do @@ -657,7 +654,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c Begin html.StartRow(); html.AddTableCell(inttostr(iId)); - html.AddTableCell(Screen(FSnomed.Strings.GetEntry(iWork), '')); + html.AddTableCell(FSnomed.Strings.GetEntry(iWork)); html.AddTableCell(codeForLang(lang)); CellConceptRef(html, sPrefix, kind, cdDesc); if (active) then @@ -669,7 +666,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c CellConceptRef(html, sPrefix, module, cdDesc) else html.AddTableCell(''); - if FSnomed.RefSetIndex.Count > 0 Then + if DOING_REFSETS_FOR_DESCS and (FSnomed.RefSetIndex.Count > 0) Then Begin iList := FSnomed.GetDescRefsets(Descriptions[i]); if Length(ilist) = 0 Then @@ -696,6 +693,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c End; html.EndTable; html.Line; + deadCheck(); iRefSet := FSnomed.GetConceptRefSet(iIndex, true, iName, iMembers, itypes, iFields); allDesc := FSnomed.Refs.GetReferences(FSnomed.Concept.GetAllDesc(iIndex)); @@ -760,7 +758,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c html.StartRow('#EFEFEF') else html.StartRow(); - html.AddTableCellHint(Screen(PN, ''), inttostr(did)); + html.AddTableCellHint(PN, inttostr(did)); CellConceptRef(html, sPrefix, iWork3, cdDesc); CellConceptRef(html, sPrefix, iWork2, cdDesc); if (active) then @@ -777,6 +775,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c html.EndTable; html.Line; End; + deadCheck(); if iRefset <> 0 Then Begin @@ -827,7 +826,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c end; html.EndTableRow; End; - html.EndTable; + html.EndTable; if (iStart > 0) or (iStart+MAX_ROWS < High(aMembers)) Then Begin html.StartParagraph; @@ -853,7 +852,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c html.URL('End', sPrefix+'id='+sId+'&start='+inttostr(MAX_ROWS * (High(aMembers) div MAX_ROWS))); End; html.EndParagraph; - End; + End; End Else Begin @@ -880,14 +879,14 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c CellConceptRef(html, sPrefix, iWork, cdDesc); CellConceptRef(html, sPrefix, iWork3, cdDesc); html.AddTableCell(BooleanToString(active)); - html.AddTableCellHint(Screen(PN, ''), inttostr(did)); + html.AddTableCellHint(PN, inttostr(did)); CellConceptRef(html, sPrefix, kind, cdDesc); CellConceptRef(html, sPrefix, modifier, cdDesc); html.AddTableCell(' '+GetRelGroup(Group)); html.EndTableRow; End; End; - html.EndTable; + html.EndTable; if (iStart > 0) or (iStart+MAX_ROWS < High(Inbounds)) Then Begin html.StartParagraph; @@ -914,7 +913,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c End; html.EndParagraph; End; - End; + End; if FSnomed.RefSetIndex.count > 0 Then Begin iList := FSnomed.GetConceptRefsets(iIndex); @@ -932,7 +931,7 @@ procedure TSnomedPublisher.PublishConcept(bRoot : Boolean; showhist : boolean; c ConceptRef(html, sPrefix, iList[i].refset, cdDesc, 0); html.EndParagraph; End; - End; + End; if not bRoot then begin html.ParaURL('Back to Start', sPrefix); @@ -1461,9 +1460,10 @@ procedure TSnomedPublisher.PublishSearch(const sPrefix, sText: String; iStart: I end; *) -constructor TSnomedPublisher.Create(oSnomed : TSnomedServices; FHIRPathEngine : String); +constructor TSnomedPublisher.Create(oSnomed : TSnomedServices; FHIRPathEngine : String; start : UInt64); begin inherited Create; + FStart := start; Lock := TFslLock.Create('SCT Publisher'); FSearchCache := TStringList.Create; FSearchCache.Sorted := true; @@ -1508,6 +1508,7 @@ procedure TSnomedPublisher.PublishConcepts(const sPrefix: String; iStart: Intege iTotal := FSnomed.Concept.Count; For i := iStart to Min(iStart+MAX_ROWS, iTotal) Do Begin + deadCheck(); if not b2 And ((i - iStart) / Min(MAX_ROWS, iTotal) > 0.5) Then Begin html.EndList; @@ -1563,10 +1564,9 @@ procedure TSnomedPublisher.PublishSearch(const sPrefix, sText, sContext: String; // iDummy : Cardinal; b2 : Boolean; icontext : UInt64; - begin iContext := StrToUInt64Def(sContext, 0); - Lock.Lock; + Lock.Lock('PublishSearch'); Try if FSearchCache.Find(sText+#0+sContext, i) Then a := TSearchCache(FSearchCache.Objects[i]).a @@ -1587,6 +1587,7 @@ procedure TSnomedPublisher.PublishSearch(const sPrefix, sText, sContext: String; html.Heading(1, 'Search for '+sText+' in all of Snomed'); b2 := false; + deadCheck(); html.StartTable(false, 'bare'); html.StartTableRow; @@ -1707,7 +1708,7 @@ procedure TSnomedPublisher.PublishTermConcept(bRoot : Boolean; const sPrefix, sI html.StartParagraph; html.AddText(sId, true, true); - html.AddText(': '+screen(PN, ''), true, false); + html.AddText(': '+PN, true, false); html.EndParagraph; html.AddParagraph(FSN); @@ -1768,7 +1769,7 @@ procedure TSnomedPublisher.RefsetRef(html: THtmlPublisher; const sPrefix: String begin FSnomed.RefSetIndex.GetReferenceSet(iIndex, iFilename, iName, iDefinition, iMembersByName, iMembersByRef, iTypes, iFields); id := inttostr(FSnomed.Concept.GetIdentity(iDefinition)); - html.URL(Screen(id+' '+FSnomed.GetPNForConcept(iDefinition), ' reference set'), sPrefix+'id='+id); + html.URL(id+' '+FSnomed.GetPNForConcept(iDefinition), sPrefix+'id='+id); html.AddTextPlain('('); html.AddTextPlain(inttostr(FSnomed.RefSetMembers.GetMemberCount(iMembersByRef))+' members)'); if iTypes <> 0 then @@ -1803,6 +1804,11 @@ function TSnomedPublisher.GetConceptForRefset(iRefset: Cardinal): Cardinal; FSnomed.RefSetIndex.GetReferenceSet(iRefset, iDummy, iDummy, result, iDummy, iDummy, iDummy, iDummy); end; + +procedure TSnomedPublisher.deadCheck; +begin + // nothing +end; End. diff --git a/library/ftx/ftx_sct_services.pas b/library/ftx/ftx_sct_services.pas index 8dcc034e5..b7729fe2f 100644 --- a/library/ftx/ftx_sct_services.pas +++ b/library/ftx/ftx_sct_services.pas @@ -59,7 +59,7 @@ Uses SysUtils, Classes, Generics.Collections, Character, - fsl_base, fsl_utilities, fsl_collections, fsl_http, fsl_fpc, fsl_threads, fsl_lang, + fsl_base, fsl_utilities, fsl_collections, fsl_http, fsl_fpc, fsl_threads, fsl_lang, fsl_logging, fsl_i18n, fhir_objects, fhir_common, fhir_factory, fhir_utilities, fhir_features, fhir_uris, fhir_cdshooks, ftx_sct_expressions, ftx_service; @@ -70,7 +70,6 @@ IS_A_MAGIC : UInt64 = 116680003; ALL_DISPLAY_NAMES = $FF; ASSUME_CLASSIFIED = true; - LOAD_PERIOD = 0; // never unload for now... DATETIME_MINUTE_ONE * 30; var SNOMED_DATE_FORMAT : TFormatSettings; @@ -512,11 +511,9 @@ TSnomedServices = class (TFslObject) Private FLock : TFslLock; FLanguages : TIETFLanguageDefinitions; - FLoaded : TDateTime; FLastUse : TDateTime; FSourceFile : String; FBuilding : boolean; - FLoading : boolean; FUseCount : integer; FEdition : String; @@ -558,13 +555,13 @@ TSnomedServices = class (TFslObject) procedure checkExpr(concept : TSnomedConcept); overload; procedure checkExpr(refinement : TSnomedRefinement); overload; - procedure renderExpr(b : TStringBuilder; expr : TSnomedExpression; option : TSnomedServicesRenderOption); overload; - procedure renderExpr(b : TStringBuilder; expr : TSnomedConcept; option : TSnomedServicesRenderOption); overload; - procedure renderExpr(b : TStringBuilder; expr : TSnomedRefinement; option : TSnomedServicesRenderOption); overload; + procedure renderExpr(b : TFslStringBuilder; expr : TSnomedExpression; option : TSnomedServicesRenderOption); overload; + procedure renderExpr(b : TFslStringBuilder; expr : TSnomedConcept; option : TSnomedServicesRenderOption); overload; + procedure renderExpr(b : TFslStringBuilder; expr : TSnomedRefinement; option : TSnomedServicesRenderOption); overload; - procedure displayExpr(b : TStringBuilder; expr : TSnomedExpression); overload; - procedure displayExpr(b : TStringBuilder; expr : TSnomedConcept); overload; - procedure displayExpr(b : TStringBuilder; expr : TSnomedRefinement); overload; + procedure displayExpr(b : TFslStringBuilder; expr : TSnomedExpression); overload; + procedure displayExpr(b : TFslStringBuilder; expr : TSnomedConcept); overload; + procedure displayExpr(b : TFslStringBuilder; expr : TSnomedRefinement); overload; // function findRefinement(ref: cardinal; b : TSnomedExpression): TSnomedExpression; // procedure findRefinements(exp: TSnomedExpression; relationship, focus: Cardinal); @@ -585,7 +582,6 @@ TSnomedServices = class (TFslObject) function GetEditionId: String; function loadLang(iLang : cardinal) : TSnomedReferenceSetMemberArray; - procedure checkIsLoaded; function GetConcept: TSnomedConceptList; function GetDesc: TSnomedDescriptions; function GetDescRef: TSnomedDescriptionIndex; @@ -596,9 +592,7 @@ TSnomedServices = class (TFslObject) function GetStems: TSnomedStems; function GetStrings: TSnomedStrings; function GetWords: TSnomedWords; - function GetLoaded: Boolean; procedure LoadFromSource; - procedure InitialLoad; function GetActiveRoots: UInt64Array; function GetDefaultLanguage: Cardinal; function GetInActiveRoots: UInt64Array; @@ -609,12 +603,9 @@ TSnomedServices = class (TFslObject) constructor Create(languages : TIETFLanguageDefinitions); destructor Destroy; Override; Function Link : TSnomedServices; Overload; - Procedure Load(Const sFilename : String; immediate : boolean); + Procedure Load(Const sFilename : String); class function checkFile(Const sFilename : String) : String; Procedure Save(Const sFilename : String); - procedure checkLoaded; - procedure checkUnloadMe; - procedure UnloadMe; property Building : boolean read FBuilding write FBuilding; // helper functions @@ -678,14 +669,12 @@ TSnomedServices = class (TFslObject) function systemUri : String; // status stuff - Property Loaded : Boolean read GetLoaded; Property VersionUri : String read FVersionUri write SetVersionUri; Property EditionUri : String read FEditionUri; Property VersionDate : String read FVersionDate write FVersionDate; Property EditionName : String read GetEditionName; Property EditionId : String read GetEditionId; Property TotalCount : integer read FTotalCount; - function LoadStatus : String; function LastUseStatus : String; property UseCount : integer read FUseCount; procedure RecordUse(count : integer = 1); @@ -729,7 +718,7 @@ TSnomedProvider = class (TCodeSystemProvider) FSct : TSnomedServices; FSupplements : TFslList; public - constructor Create(sct : TSnomedServices; supplements : TFslList); + constructor Create(sct : TSnomedServices; i18n : TI18nSupport; supplements : TFslList); destructor Destroy; override; @@ -737,8 +726,8 @@ TSnomedProvider = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -749,6 +738,7 @@ TSnomedProvider = class (TCodeSystemProvider) procedure Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); override; function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; @@ -762,12 +752,12 @@ TSnomedProvider = class (TCodeSystemProvider) procedure getCDSInfo(card : TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display : String); override; function IsInactive(context : TCodeSystemProviderContext) : boolean; override; function getCodeStatus(context : TCodeSystemProviderContext) : String; override; + function incompleteValidationMessage(context : TCodeSystemProviderContext; langs : THTTPLanguageList) : String; override; function defToThisVersion(specifiedVersion : String) : boolean; override; procedure defineFeatures(features : TFslList); override; property Services : TSnomedServices read FSct; - procedure checkReady; override; end; @@ -1424,7 +1414,6 @@ constructor TSnomedServices.Create(languages : TIETFLanguageDefinitions); function TSnomedServices.DebugDesc(index: cardinal): String; begin - checkIsLoaded; result := GetConceptId(index)+'|'+GetDisplayName(index, FDefaultLanguage)+'|'; end; @@ -1457,17 +1446,13 @@ destructor TSnomedServices.Destroy; inherited; end; -procedure TSnomedServices.Load(const sFilename: String; immediate : boolean); +procedure TSnomedServices.Load(const sFilename: String); begin - FLoaded := 0; FSourceFile := sFilename; if not FileExists(FSourceFile) then raise ETerminologySetup.create('The SNOMED CT Source File '+sFilename+' does not exist'); - if immediate or (LOAD_PERIOD = 0) then - LoadFromSource - else - InitialLoad; + LoadFromSource; end; class function TSnomedServices.checkFile(const sFilename: String): String; @@ -1504,27 +1489,33 @@ class function TSnomedServices.checkFile(const sFilename: String): String; end; end; -procedure TSnomedServices.InitialLoad; +procedure TSnomedServices.LoadFromSource; var oFile : Tfilestream; oread : TReader; + i : Integer; s : TArray; v : String; function readBytes : TBytes; - var - i : integer; begin - i := oRead.ReadInteger; - SetLength(result, i); + SetLength(result, oRead.ReadInteger); oread.Read(result[0], length(result)); end; + function ReadUInt64: UInt64; + begin + oread.Read(result, 8); + end; begin oFile := TFileStream.Create(FSourceFile, fmOpenread+fmShareDenyWrite); try oread := TReader.Create(oFile, 8192); try v := oRead.ReadString; - if (v <> SNOMED_CACHE_VERSION_CURRENT) and (v <> SNOMED_CACHE_VERSION_UTF16) then + if v = SNOMED_CACHE_VERSION_CURRENT Then + FStrings.IsUTF16 := false + else if v = SNOMED_CACHE_VERSION_UTF16 Then + FStrings.IsUTF16 := true + else raise ETerminologyError.create('The Snomed cache "'+FSourceFile+'" must be rebuilt using the server utilities', itException); VersionUri := oread.ReadString; VersionDate := oread.ReadString; @@ -1532,105 +1523,47 @@ procedure TSnomedServices.InitialLoad; FEdition := s[4]; FVersion := s[6]; FLock.Name := 'SCT '+FVersion; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; - ReadBytes; + + FStrings.FMaster := ReadBytes; + FStrings.FLength := Length(FStrings.FMaster); + FRefs.FMaster := ReadBytes; + FRefs.FLength := Length(FRefs.FMaster); + FDesc.FMaster := ReadBytes; + FDesc.FLength := Length(FDesc.FMaster); + FWords.FMaster := ReadBytes; + FWords.FLength := Length(FWords.FMaster); + FStems.FMaster := ReadBytes; + FStems.FLength := Length(FStems.FMaster); FConcept.FMaster := ReadBytes; FConcept.FLength := Length(FConcept.FMaster); FTotalCount := FConcept.Count; - FConcept.Clear; + FRel.FMaster := ReadBytes; + FRel.FLength := Length(FRel.FMaster); + FRefSetIndex.FMaster := ReadBytes; + FRefSetIndex.FLength := Length(FRefSetIndex.FMaster); + FRefSetMembers.FMaster := ReadBytes; + FRefSetMembers.FLength := Length(FRefSetMembers.FMaster); + FDescRef.FMaster := ReadBytes; + FDescRef.FLength := Length(FDescRef.FMaster); + FIs_a_Index := oread.ReadInteger; + SetLength(FInactiveRoots, oRead.ReadInteger); + for i := 0 to Length(FInactiveRoots) - 1 Do + FInactiveRoots[i] := ReadUInt64; + SetLength(FActiveRoots, oRead.ReadInteger); + for i := 0 to Length(FActiveRoots) - 1 Do + FActiveRoots[i] := ReadUInt64; + FDefaultLanguage := oread.ReadInteger; Finally oread.free; End; Finally oFile.free; End; - FLoaded := 0; -end; - -procedure TSnomedServices.LoadFromSource; -var - oFile : Tfilestream; - oread : TReader; - i : Integer; - s : TArray; - v : String; - function readBytes : TBytes; - begin - SetLength(result, oRead.ReadInteger); - oread.Read(result[0], length(result)); - end; - function ReadUInt64: UInt64; - begin - oread.Read(result, 8); - end; -begin - FLoading := true; - try - oFile := TFileStream.Create(FSourceFile, fmOpenread+fmShareDenyWrite); - try - oread := TReader.Create(oFile, 8192); - try - v := oRead.ReadString; - if v = SNOMED_CACHE_VERSION_CURRENT Then - FStrings.IsUTF16 := false - else if v = SNOMED_CACHE_VERSION_UTF16 Then - FStrings.IsUTF16 := true - else - raise ETerminologyError.create('The Snomed cache "'+FSourceFile+'" must be rebuilt using the server utilities', itException); - VersionUri := oread.ReadString; - VersionDate := oread.ReadString; - s := VersionUri.split(['/']); - FEdition := s[4]; - FVersion := s[6]; - FLock.Name := 'SCT '+FVersion; - - FStrings.FMaster := ReadBytes; - FStrings.FLength := Length(FStrings.FMaster); - FRefs.FMaster := ReadBytes; - FRefs.FLength := Length(FRefs.FMaster); - FDesc.FMaster := ReadBytes; - FDesc.FLength := Length(FDesc.FMaster); - FWords.FMaster := ReadBytes; - FWords.FLength := Length(FWords.FMaster); - FStems.FMaster := ReadBytes; - FStems.FLength := Length(FStems.FMaster); - FConcept.FMaster := ReadBytes; - FConcept.FLength := Length(FConcept.FMaster); - FTotalCount := FConcept.Count; - FRel.FMaster := ReadBytes; - FRel.FLength := Length(FRel.FMaster); - FRefSetIndex.FMaster := ReadBytes; - FRefSetIndex.FLength := Length(FRefSetIndex.FMaster); - FRefSetMembers.FMaster := ReadBytes; - FRefSetMembers.FLength := Length(FRefSetMembers.FMaster); - FDescRef.FMaster := ReadBytes; - FDescRef.FLength := Length(FDescRef.FMaster); - FIs_a_Index := oread.ReadInteger; - SetLength(FInactiveRoots, oRead.ReadInteger); - for i := 0 to Length(FInactiveRoots) - 1 Do - FInactiveRoots[i] := ReadUInt64; - SetLength(FActiveRoots, oRead.ReadInteger); - for i := 0 to Length(FActiveRoots) - 1 Do - FActiveRoots[i] := ReadUInt64; - FDefaultLanguage := oread.ReadInteger; - Finally - oread.free; - End; - Finally - oFile.free; - End; - if not Concept.FindConcept(RF2_MAGIC_PREFERRED, FPreferredTerm) then - FPreferredTerm := 0; - if not Concept.FindConcept(RF2_MAGIC_FSN, FFSN) then - FFSN := 0; - FDefLangSet := FRefSetMembers.GetMembers(FDefaultLanguage); - FLoaded := now; - finally - FLoading := false; - end; + if not Concept.FindConcept(RF2_MAGIC_PREFERRED, FPreferredTerm) then + FPreferredTerm := 0; + if not Concept.FindConcept(RF2_MAGIC_FSN, FFSN) then + FFSN := 0; + FDefLangSet := FRefSetMembers.GetMembers(FDefaultLanguage); end; function TSnomedServices.loadLang(iLang: cardinal): TSnomedReferenceSetMemberArray; @@ -1641,21 +1574,10 @@ function TSnomedServices.loadLang(iLang: cardinal): TSnomedReferenceSetMemberArr result := FRefSetMembers.GetMembers(iLang); end; -function TSnomedServices.LoadStatus: String; -begin - if FLoading then - result := 'Loading Now' - else if FLoaded <> 0 then - result := 'Loaded for '+DescribePeriod(now - FLoaded) - else - result := 'Not Loaded'; -end; - function TSnomedServices.ReferenceSetExists(sid: String): Boolean; var iName, index, members, types, iFieldNames : Cardinal; begin - checkIsLoaded; result := FConcept.FindConcept(StringToId(sid), index); if result then result := GetConceptRefSet(index, true, iName, members, types, iFieldNames) > 0; @@ -1763,7 +1685,6 @@ function TSnomedServices.Subsumes(iParent, iChild: Cardinal): Boolean; iAllDesc : TCardinalArray; iIndex : integer; Begin - checkIsLoaded; if iParent = iChild then result := true else @@ -1962,7 +1883,6 @@ function TSnomedServices.Search(iRoot : UInt64; sText: String; iLang : Cardinal; s : String; s1 : String; begin - checkIsLoaded; SetLength(words, 0); SetLength(aMembers, 0); SetLength(aLangMembers, 0); @@ -2028,7 +1948,6 @@ function TSnomedServices.Subsumes(const sParent, sChild: String): Boolean; iParent : Cardinal; iChild : Cardinal; begin - checkIsLoaded; if not StringIsInteger64(sParent) or not StringIsInteger64(sChild) then exit(false); @@ -2106,7 +2025,6 @@ function TSnomedServices.GetDisplayName(const iConcept, iLang: Cardinal): String active : boolean; dlist : Array of TDescInfo; begin - checkIsLoaded; SetLength(aMembers, 0); result := ''; if iLang <> 0 then @@ -2159,7 +2077,6 @@ function TSnomedServices.GetDisplayName(const sTerm, sLangSet: String): String; var iTerm, iLang : Cardinal; begin - checkIsLoaded; iLang := CheckLangSet(sLangSet); if not Concept.FindConcept(StringToId(sTerm), iTerm) Then raise ETerminologyError.Create('Concept '+sTerm+' not found', itInvalid); @@ -2219,7 +2136,6 @@ function TSnomedServices.GetFSN(iDescriptions: TCardinalArray): String; date : TSnomedDate; lang : byte; begin - checkIsLoaded; result := ''; For iLoop := Low(iDescriptions) To High(iDescriptions) Do Begin @@ -2232,21 +2148,14 @@ function TSnomedServices.GetFSN(iDescriptions: TCardinalArray): String; function TSnomedServices.GetInActiveRoots: UInt64Array; begin - checkIsLoaded; Result := FInActiveRoots; end; function TSnomedServices.GetIs_a_Index: Cardinal; begin - checkIsLoaded; Result := FIs_a_Index; end; -function TSnomedServices.GetLoaded: Boolean; -begin - result := FLoaded <> 0; -end; - procedure TSnomedServices.ListDisplayNames(list: TConceptDesignations; const iConcept, iLang: Cardinal; FlagMask: Byte); var aMembers : TSnomedReferenceSetMemberArray; @@ -2260,7 +2169,6 @@ procedure TSnomedServices.ListDisplayNames(list: TConceptDesignations; const iCo iInt : Integer; date : TSnomedDate; begin - checkIsLoaded; if iLang <> 0 then aMembers := loadLang(iLang); Concept.GetConcept(iConcept, Identity, Flags, date, Parents, Descriptions, Inbounds, outbounds, refsets); @@ -2277,7 +2185,6 @@ procedure TSnomedServices.ListDisplayNames(list: TConceptDesignations; const sTe var iTerm, iLang : Cardinal; begin - checkIsLoaded; iLang := CheckLangSet(sLangSet); if not Concept.FindConcept(StringToId(sTerm), iTerm) Then raise ETerminologyError.Create('Concept '+sTerm+' not found', itInvalid); @@ -2298,7 +2205,6 @@ procedure TSnomedServices.GetMatchInfo(iConcept: Cardinal; var sTerm, sFSN, sPre date : TSnomedDate; active : boolean; begin - checkIsLoaded; sTerm := ''; sFSN := ''; sPreferred := ''; @@ -2327,7 +2233,6 @@ function TSnomedServices.GetPN(iDescriptions: TCardinalArray): String; fsn, v, d : String; active : boolean; begin - checkIsLoaded; result := ''; For iLoop := Low(iDescriptions) To High(iDescriptions) Do Begin @@ -2404,7 +2309,6 @@ function TSnomedServices.ConceptExists(conceptId: String): Boolean; var i : cardinal; begin - checkIsLoaded; result := FConcept.FindConcept(StringToIdOrZero(conceptId), i); end; @@ -2414,7 +2318,6 @@ function TSnomedServices.condenseExpression(exp: TSnomedExpression): TFslList.Create; try grps.AddAll(exp.refinementGroups); @@ -2471,7 +2374,6 @@ function TSnomedServices.FindStem(s: String; var index: Integer): Boolean; function TSnomedServices.GetActiveRoots: UInt64Array; begin - checkIsLoaded; Result := FActiveRoots; end; @@ -2485,7 +2387,13 @@ function TSnomedServices.LastUseStatus: String; procedure TSnomedServices.RecordUse(count: integer); begin - FUseCount := FUseCount + count; + FLock.lock('use'); + try + FUseCount := FUseCount + count; + FLastUse := now; + finally + FLock.unlock; + end; end; function TSnomedServices.buildValueSet(factory : TFHIRFactory; url : String): TFhirValueSetW; @@ -2509,7 +2417,6 @@ function TSnomedServices.buildValueSet(factory : TFHIRFactory; url : String): TF if id = '?fhir_vs=refset' then begin - checkLoaded; result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); try result.url := url; @@ -2542,7 +2449,6 @@ function TSnomedServices.buildValueSet(factory : TFHIRFactory; url : String): TF end else if id = '?fhir_vs' then begin - checkLoaded; result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); try result.url := url; @@ -2564,7 +2470,6 @@ function TSnomedServices.buildValueSet(factory : TFHIRFactory; url : String): TF end else if id.StartsWith('?fhir_vs=refset/') And ReferenceSetExists(id.Substring(16)) then begin - checkLoaded; result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); try result.url := url; @@ -2594,7 +2499,6 @@ function TSnomedServices.buildValueSet(factory : TFHIRFactory; url : String): TF end else if id.StartsWith('?fhir_vs=isa/') And ConceptExists(id.Substring(13)) then begin - checkLoaded; result := factory.wrapValueSet(factory.makeByName('ValueSet') as TFHIRResourceV); try result.url := url; @@ -2630,7 +2534,6 @@ function TSnomedServices.GetConceptRefSet(iConcept: Cardinal; bByName : Boolean; c : Cardinal; iFilename, iDummy : cardinal; begin - checkIsLoaded; result := 0; For i := 0 to FRefSetIndex.Count - 1 do Begin @@ -2648,13 +2551,11 @@ function TSnomedServices.GetConceptRefSet(iConcept: Cardinal; bByName : Boolean; function TSnomedServices.GetDesc: TSnomedDescriptions; begin - checkIsLoaded; result := FDesc; end; function TSnomedServices.GetDescRef: TSnomedDescriptionIndex; begin - checkIsLoaded; result := FDescRef; end; @@ -2666,7 +2567,6 @@ function TSnomedServices.GetDescRefsets(iDesc: Cardinal): TRefSetMemberEntryArra iIndex : Integer; iName, iTypes, iFieldNames : Cardinal; begin - checkIsLoaded; SetLength(result, 0); SetLength(aMembers, 0); for i := 0 to FRefSetIndex.Count - 1 Do @@ -2692,7 +2592,6 @@ function TSnomedServices.GetDescriptionId(const iDesc: Cardinal): String; active : Boolean; lang : byte; begin - checkIsLoaded; Desc.GetDescription(iDesc, descNdx, id, date, concept, module, kind, caps, refsets, valueses, active, lang); result := inttostr(id); end; @@ -2705,7 +2604,6 @@ function TSnomedServices.GetConceptRefsets(iDesc: Cardinal): TRefSetMemberEntryA iIndex : Integer; iName, iTypes, iFieldNames : Cardinal; begin - checkIsLoaded; SetLength(result, 0); SetLength(aMembers, 0); for i := 0 to FRefSetIndex.Count - 1 Do @@ -2742,7 +2640,6 @@ function TSnomedServices.CheckLangSet(sTerm: String): Cardinal; var iId : UInt64; begin - checkIsLoaded; result := 0; if sTerm <> '' Then Begin @@ -2781,7 +2678,6 @@ function TSnomedServices.ChildRelationshipCount: cardinal; function TSnomedServices.GetConceptDescendants(index: Cardinal): TCardinalArray; begin - checkIsLoaded; result := FRefs.GetReferences(FConcept.GetAllDesc(index)); end; @@ -2792,7 +2688,6 @@ function TSnomedServices.GetConceptId(const iConcept : Cardinal): String; Parents, Inbounds, outbounds, descriptions, refsets : Cardinal; date : TSnomedDate; begin - checkIsLoaded; Concept.GetConcept(iConcept, Identity, Flags, date, Parents, Descriptions, Inbounds, outbounds, refsets); result := inttostr(Identity); end; @@ -2808,7 +2703,6 @@ function TSnomedServices.GetConceptParents(index: Cardinal): TCardinalArray; refsets : Cardinal; date : word; begin - checkIsLoaded; Concept.GetConcept(index, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); if ParentIndex = 0 Then SetLength(result, 0) @@ -2818,7 +2712,6 @@ function TSnomedServices.GetConceptParents(index: Cardinal): TCardinalArray; function TSnomedServices.GetConcept: TSnomedConceptList; begin - checkIsLoaded; result := FConcept; end; @@ -2837,7 +2730,6 @@ function TSnomedServices.GetConceptChildren(index: Cardinal): TCardinalArray; Active, Defining : Boolean; Group : Integer; begin - checkIsLoaded; Concept.GetConcept(index, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); SetLength(result, 0); if InboundIndex > 0 then @@ -2867,8 +2759,7 @@ function TSnomedServices.IsValidConcept(const sTerm: String): Boolean; var iTerm : Cardinal; begin - checkIsLoaded; - if not StringIsInteger64(sTerm) then + if (sTerm = '') or not StringIsInteger64(sTerm) then result := false else result := Concept.FindConcept(StringToId(sTerm), iTerm); @@ -2882,8 +2773,7 @@ function TSnomedServices.IsValidDescription(const sTerm: String; var concept: UI active : boolean; lang : byte; begin - checkIsLoaded; - result := DescRef.FindDescription(StringToId(sTerm), iTerm); + result := (sTerm <> '') and DescRef.FindDescription(StringToId(sTerm), iTerm); if result then begin FDesc.GetDescription(iTerm, desc, id, date, cId, module, kind, caps, refsets, valueses, active, lang); @@ -3403,14 +3293,12 @@ function TSnomedReferenceSetMembers.sizeInBytesV(magic : integer) : cardinal; function TSnomedServices.ConceptExists(conceptId: String; var index: cardinal): Boolean; begin - checkIsLoaded; - result := FConcept.FindConcept(StringToIdOrZero(conceptId), index); + result := (conceptId <> '') and FConcept.FindConcept(StringToIdOrZero(conceptId), index); end; function TSnomedServices.GetDefaultLanguage: Cardinal; begin - checkIsLoaded; Result := FDefaultLanguage; end; @@ -3431,7 +3319,6 @@ function TSnomedServices.GetDefiningRelationships(index: Cardinal): TCardinalArr did : UInt64; Active, Defining : boolean; begin - checkIsLoaded; Concept.GetConcept(index, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); if InboundIndex = 0 Then SetLength(result, 0) @@ -3506,7 +3393,6 @@ function TSnomedServices.IsActive(index: Cardinal): boolean; refsets : Cardinal; date : word; begin - checkIsLoaded; Concept.GetConcept(index, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); result := (flags and MASK_CONCEPT_STATUS in [FLAG_Active, FLAG_PendingMove]); end; @@ -3522,35 +3408,10 @@ function TSnomedServices.isPrimitive(index: Cardinal): boolean; refsets : Cardinal; date : word; begin - checkIsLoaded; Concept.GetConcept(index, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); result := (flags and MASK_CONCEPT_PRIMITIVE > 0); end; -procedure TSnomedServices.UnloadMe; -begin - FLock.Lock; - try - FStrings.clear; - FRefs.clear; - FDesc.clear; - FWords.clear; - FStems.clear; - FConcept.clear; - FRel.clear; - FRefSetIndex.clear; - FRefSetMembers.clear; - FDescRef.clear; - SetLength(FInactiveRoots, 0); - SetLength(FActiveRoots, 0); - FDefaultLanguage := 0; - FLoaded := 0; - FDefLangSet := nil; - finally - FLock.unlock; - end; -end; - function TSnomedServices.filterEquals(id : UInt64): TCodeSystemProviderFilterContext; var res : TSnomedFilterContext; @@ -3617,7 +3478,6 @@ function TSnomedServices.GetPNForConcept(iIndex: Cardinal): String; Descriptions : TCardinalArray; date : TSnomedDate; Begin - checkIsLoaded; Concept.GetConcept(iIndex, Identity, Flags, date, ParentIndex, DescriptionIndex, InboundIndex, outboundIndex, refsets); Descriptions := Refs.GetReferences(DescriptionIndex); result := GetPN(Descriptions); @@ -3625,7 +3485,6 @@ function TSnomedServices.GetPNForConcept(iIndex: Cardinal): String; function TSnomedServices.GetRefs: TSnomedReferences; begin - checkIsLoaded; result := FRefs; end; @@ -3633,7 +3492,6 @@ function TSnomedServices.getRefSet(id: int64): TSnomedReferenceSetMemberArray; var name, index, members, types, iFieldNames : cardinal; begin - checkIsLoaded; if not Concept.FindConcept(id, index) then raise ETerminologyError.Create('The Snomed Concept '+inttostr(id)+' was not known', itInvalid); if GetConceptRefSet(index, false, name, members, types, iFieldNames) = 0 then @@ -3648,19 +3506,16 @@ function TSnomedServices.systemUri: String; function TSnomedServices.GetRefsetIndex: TSnomedReferenceSetIndex; begin - checkIsLoaded; result := FRefSetIndex; end; function TSnomedServices.GetRefsetMembers: TSnomedReferenceSetMembers; begin - checkIsLoaded; result := FRefSetMembers; end; function TSnomedServices.GetRel: TSnomedRelationshipList; begin - checkIsLoaded; result := FRel; end; @@ -3672,7 +3527,6 @@ function TSnomedServices.GetRelationshipId(const iRel: Cardinal): String; Active, Defining : Boolean; Group : integer; begin - checkIsLoaded; Rel.GetRelationship(iRel, identity, Source, Target, RelType, module, kind, modifier, date, Active, Defining, Group); result := inttostr(identity); end; @@ -3685,7 +3539,6 @@ function TSnomedServices.getRelationshipValues(index: cardinal): String; member : TSnomedReferenceSetMember; tl, vl : TCardinalArray; begin - checkIsLoaded; result := ''; for i := 0 to FRefSetIndex.Count - 1 do begin @@ -3714,19 +3567,16 @@ function TSnomedServices.getRelationshipValues(index: cardinal): String; function TSnomedServices.GetStems: TSnomedStems; begin - checkIsLoaded; result := FStems; end; function TSnomedServices.GetStrings: TSnomedStrings; begin - checkIsLoaded; result := FStrings; end; function TSnomedServices.GetWords: TSnomedWords; begin - checkIsLoaded; result := FWords; end; @@ -3863,7 +3713,6 @@ function TSnomedServices.createNormalForm(reference: Cardinal): TSnomedExpressio end else begin - checkIsLoaded; c := Concept.GetNormalForm(reference); parser := TSnomedExpressionParser.Create; try @@ -3885,9 +3734,9 @@ function TSnomedServices.createNormalForm(reference: Cardinal): TSnomedExpressio //function TSnomedServices.debugExpr(expr: TSnomedConcept): String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // renderExpr(b, expr, sroFillMissing); // result := b.ToString; @@ -3898,9 +3747,9 @@ function TSnomedServices.createNormalForm(reference: Cardinal): TSnomedExpressio // //function TSnomedServices.debugExpr(expr: TSnomedRefinement): String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // renderExpr(b, expr, sroFillMissing); // result := b.ToString; @@ -3964,11 +3813,11 @@ procedure TSnomedServices.rationaliseExpr(exp: TSnomedExpression); function debugArr(arr : TArray) : String; var - b : TStringBuilder; + b : TFslStringBuilder; c : cardinal; f : boolean; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try f := true; for c in arr do @@ -4105,7 +3954,6 @@ function TSnomedServices.normaliseExpression(exp: TSnomedExpression): TSnomedExp refSrc, refDst : TSnomedRefinement; grpSrc, grpDst : TSnomedRefinementGroup; begin - checkIsLoaded; work := TSnomedExpression.Create; try for concept in exp.concepts do @@ -4156,11 +4004,11 @@ function TSnomedServices.normaliseExpression(exp: TSnomedExpression): TSnomedExp function TSnomedServices.normalise(s: String): String; var - b : TStringBuilder; + b : TFslStringBuilder; ws : boolean; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ws := false; for ch in s do @@ -4187,7 +4035,6 @@ function TSnomedServices.expressionSubsumes(a, b: TSnomedExpression): boolean; r, rt : TSnomedRefinementGroup; ok : boolean; begin - checkIsLoaded; // subsumes is true if all of the things you can say about a are also things you can say about b // b is allowed to say additional things; it's a separate issue as to whether those are coherent // (that may be handled elsewhere) @@ -4326,37 +4173,6 @@ function TSnomedServices.checkGroupStateInRefinements(grp : TSnomedRefinementGro end; end; -procedure TSnomedServices.checkIsLoaded; -begin - if FBuilding or FLoading then - exit; - if FLoaded = 0 then - raise ETerminologyError.Create('This version of SNOMED is not loaded', itInvalid); -end; - -procedure TSnomedServices.checkLoaded; -begin - FLock.Lock; - try - if FLoaded = 0 then - LoadFromSource; - FLastUse := now; - finally - FLock.Unlock; - end; -end; - -procedure TSnomedServices.checkUnloadMe; -begin - FLock.Lock; - try - if (FLoaded > 0) and (LOAD_PERIOD > 0) and (FLastUse < now - LOAD_PERIOD) then - UnloadMe; - finally - FLock.Unlock; - end; -end; - function TSnomedServices.listNonMatchingGroups(tgt, src : TFslList) : TFslList; var g, r : TSnomedRefinementGroup; @@ -4488,7 +4304,7 @@ procedure TSnomedServices.checkExpr(concept: TSnomedConcept); break; end; if not ok then - raise ETerminologyError.Create('Term "'+concept.description+'" doesn''t match a defined term at '+inttostr(concept.start)+' (valid terms would be from this list: "'+list.present(nil, true)+'")', itInvalid); + raise ETerminologyError.Create('Term "'+concept.description+'" doesn''t match a defined term at '+inttostr(concept.start)+' (valid terms would be from this list: "'+list.present(nil, nil, true)+'")', itInvalid); finally list.free; end; @@ -4503,9 +4319,9 @@ procedure TSnomedServices.checkExpr(refinement: TSnomedRefinement); function TSnomedServices.renderExpression(source : TSnomedExpression; option : TSnomedServicesRenderOption): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try RenderExpr(b, source, option); result := b.ToString; @@ -4514,7 +4330,7 @@ function TSnomedServices.renderExpression(source : TSnomedExpression; option : T end; end; -procedure TSnomedServices.renderExpr(b: TStringBuilder; expr: TSnomedExpression; option : TSnomedServicesRenderOption); +procedure TSnomedServices.renderExpr(b: TFslStringBuilder; expr: TSnomedExpression; option : TSnomedServicesRenderOption); var i, j : integer; begin @@ -4554,9 +4370,9 @@ procedure TSnomedServices.renderExpr(b: TStringBuilder; expr: TSnomedExpression; //function TSnomedServices.debugExpr(expr: TSnomedExpression) : String; //var -// b : TStringBuilder; +// b : TFslStringBuilder; //begin -// b := TStringBuilder.Create; +// b := TFslStringBuilder.Create; // try // renderExpr(b, expr, sroFillMissing); // result := b.ToString; @@ -4566,7 +4382,7 @@ procedure TSnomedServices.renderExpr(b: TStringBuilder; expr: TSnomedExpression; //end; -procedure TSnomedServices.renderExpr(b: TStringBuilder; expr: TSnomedConcept; +procedure TSnomedServices.renderExpr(b: TFslStringBuilder; expr: TSnomedConcept; option: TSnomedServicesRenderOption); var s : String; @@ -4604,7 +4420,7 @@ procedure TSnomedServices.renderExpr(b: TStringBuilder; expr: TSnomedConcept; end; -procedure TSnomedServices.renderExpr(b: TStringBuilder; +procedure TSnomedServices.renderExpr(b: TFslStringBuilder; expr: TSnomedRefinement; option: TSnomedServicesRenderOption); begin renderExpr(b, expr.name, option); @@ -4615,9 +4431,9 @@ procedure TSnomedServices.renderExpr(b: TStringBuilder; function TSnomedServices.displayExpression(source: TSnomedExpression): String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try DisplayExpr(b, source); result := b.ToString; @@ -4626,7 +4442,7 @@ function TSnomedServices.displayExpression(source: TSnomedExpression): String; end; end; -procedure TSnomedServices.displayExpr(b: TStringBuilder; expr: TSnomedExpression +procedure TSnomedServices.displayExpr(b: TFslStringBuilder; expr: TSnomedExpression ); var i, j : integer; @@ -4678,18 +4494,23 @@ procedure TSnomedServices.displayExpr(b: TStringBuilder; expr: TSnomedExpression end; end; -procedure TSnomedServices.displayExpr(b: TStringBuilder; expr: TSnomedConcept); +procedure TSnomedServices.displayExpr(b: TFslStringBuilder; expr: TSnomedConcept); var s : String; begin - s := GetDisplayName(expr.code, ''); - if (s = '') then - s := expr.description; - b.Append(s); + if (expr.code = '') then + b.append('') + else + begin + s := GetDisplayName(expr.code, ''); + if (s = '') then + s := expr.description; + b.Append(s); + end; end; -procedure TSnomedServices.displayExpr(b: TStringBuilder; expr: TSnomedRefinement +procedure TSnomedServices.displayExpr(b: TFslStringBuilder; expr: TSnomedRefinement ); begin DisplayExpr(b, expr.name); @@ -4898,9 +4719,10 @@ function TMatchingConcept.sizeInBytesV(magic : integer) : cardinal; { TSnomedProvider } -constructor TSnomedProvider.create(sct: TSnomedServices; supplements: TFslList); +constructor TSnomedProvider.Create(sct: TSnomedServices; i18n : TI18nSupport; supplements: TFslList< + TFHIRCodeSystemW>); begin - inherited Create(sct.FLanguages.link); + inherited Create(sct.FLanguages.link, i18n); FSct := sct; FSupplements := supplements; end; @@ -4920,20 +4742,18 @@ function TSnomedProvider.description: String; procedure TSnomedProvider.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:is-a')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:descends')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'concept:in')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:is-a')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:descends')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'concept:in')); end; function TSnomedProvider.Definition(context: TCodeSystemProviderContext): string; begin - FSct.checkIsLoaded; result := ''; end; function TSnomedProvider.getDefinition(code: String): String; begin - FSct.checkIsLoaded; result := ''; end; @@ -4955,7 +4775,6 @@ function TSnomedProvider.searchFilter(filter: TSearchFilterText; prep: TCodeSyst var res : TSnomedFilterContext; begin - FSct.checkIsLoaded; res := TSnomedFilterContext.Create; try res.matches := FSct.Search(0, filter.filter, FSct.FDefaultLanguage, false, true); @@ -4967,7 +4786,7 @@ function TSnomedProvider.searchFilter(filter: TSearchFilterText; prep: TCodeSyst procedure TSnomedProvider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); var - b : TStringBuilder; + b : TFslStringBuilder; Identity : UInt64; Flags, bLang: Byte; Active, Defining : boolean; @@ -4985,8 +4804,7 @@ procedure TSnomedProvider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguag first : boolean; did : UInt64; begin - FSct.checkIsLoaded; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try SetLength(inbounds, 0); iId := StrToUInt64Def(code, 0); @@ -5062,7 +4880,6 @@ function TSnomedProvider.subsumesTest(codeA, codeB: String): String; exprA, exprB : TSnomedExpression; b1, b2 : boolean; begin - FSct.checkIsLoaded; exprA := FSct.parseExpression(codeA); try exprB := FSct.parseExpression(codeB); @@ -5116,7 +4933,6 @@ function TSnomedProvider.getIterator(context : TCodeSystemProviderContext) : TCo Active, Defining : boolean; ndx : integer; begin - FSct.checkIsLoaded; SetLength(inbounds, 0); if (context = nil) then // root ndx := length(FSct.FActiveRoots) @@ -5137,11 +4953,6 @@ function TSnomedProvider.getIterator(context : TCodeSystemProviderContext) : TCo result := TCodeSystemIteratorContext.Create(context.Link, ndx); end; -procedure TSnomedProvider.checkReady; -begin - FSct.checkLoaded; -end; - function TSnomedProvider.Code(context: TCodeSystemProviderContext): string; var Identity : UInt64; @@ -5153,7 +4964,6 @@ function TSnomedProvider.Code(context: TCodeSystemProviderContext): string; Inbounds : TCardinalArray; date : TSnomedDate; begin - FSct.checkIsLoaded; if TSnomedExpressionContext(context).isComplex then result := FSct.renderExpression(TSnomedExpressionContext(context).Expression, sroMinimal) else @@ -5181,7 +4991,6 @@ function TSnomedProvider.getNextContext(context : TCodeSystemIteratorContext) : Active, Defining : boolean; ndx : integer; begin - FSct.checkIsLoaded; result := nil; ndx := context.current; context.next; @@ -5221,7 +5030,6 @@ function TSnomedProvider.Display(context: TCodeSystemProviderContext; langList : outboundIndex, refsets : Cardinal; date : TSnomedDate; begin - FSct.checkIsLoaded; if TSnomedExpressionContext(context).isComplex then result := FSct.displayExpression(TSnomedExpressionContext(context).Expression) else @@ -5239,10 +5047,9 @@ procedure TSnomedProvider.Designations(context: TCodeSystemProviderContext; list var ctxt : TSnomedExpressionContext; begin - FSct.checkIsLoaded; ctxt := context as TSnomedExpressionContext; if (ctxt = nil) then - raise ETerminologyError.create('Unable to find context in '+systemUri(nil), itInvalid) + raise ETerminologyError.create('Unable to find context in '+systemUri, itInvalid) else if ctxt.isComplex then // there's only one display name - for now? list.addDesignation(true, true, '', FSct.displayExpression(ctxt.FExpression).Trim) @@ -5268,7 +5075,6 @@ procedure TSnomedProvider.extendLookup(factory : TFHIRFactory; ctxt: TCodeSystem did : UInt64; exp : TSnomedExpression; begin - FSct.checkIsLoaded; if TSnomedExpressionContext(ctxt).Expression.isSimple then begin SetLength(inbounds, 0); @@ -5364,11 +5170,10 @@ function TSnomedProvider.getDisplay(code: String; langList : THTTPLanguageList): var ctxt : TCodeSystemProviderContext; begin - FSct.checkIsLoaded; ctxt := locate(code); try if (ctxt = nil) then - raise ETerminologyError.create('Unable to find '+code+' in '+systemUri(nil), itInvalid) + raise ETerminologyError.create('Unable to find '+code+' in '+systemUri, itInvalid) else result := Display(ctxt, langList); finally @@ -5378,13 +5183,11 @@ function TSnomedProvider.getDisplay(code: String; langList : THTTPLanguageList): function TSnomedProvider.IsAbstract(context: TCodeSystemProviderContext): boolean; begin - FSct.checkIsLoaded; result := false; // snomed don't do abstract? end; function TSnomedProvider.IsInactive(context: TCodeSystemProviderContext): boolean; begin - FSct.checkIsLoaded; if TSnomedExpressionContext(context).isComplex then result := false // not sure what to do here? else @@ -5393,7 +5196,6 @@ function TSnomedProvider.IsInactive(context: TCodeSystemProviderContext): boolea function TSnomedProvider.getCodeStatus(context: TCodeSystemProviderContext): String; begin - FSct.checkIsLoaded; if TSnomedExpressionContext(context).isComplex then result := '' else if FSct.IsActive(TSnomedExpressionContext(context).reference) then @@ -5402,9 +5204,16 @@ function TSnomedProvider.getCodeStatus(context: TCodeSystemProviderContext): Str result := 'inactive'; end; +function TSnomedProvider.incompleteValidationMessage(context : TCodeSystemProviderContext; langs : THTTPLanguageList): String; +begin + if TSnomedExpressionContext(context).isComplex then + result := FI18n.translate('SCT_NO_MRCM', langs, []) + else + result := ''; +end; + function TSnomedProvider.isNotClosed(textFilter: TSearchFilterText; propFilter: TCodeSystemProviderFilterContext): boolean; begin - FSct.checkIsLoaded; result := true; end; @@ -5413,7 +5222,6 @@ function TSnomedProvider.locate(code: String; altOpt : TAlternateCodeOptions; va iId : UInt64; index : cardinal; begin - FSct.checkIsLoaded; iId := FSct.StringToIdOrZero(code); if iId = 0 then begin @@ -5431,23 +5239,22 @@ function TSnomedProvider.locate(code: String; altOpt : TAlternateCodeOptions; va result := TSnomedExpressionContext.create(code, index) else begin - Message := ''; // 'Unable to find code '+code+' in '+systemUri(nil)+' (version '+version(nil)+')'; it's not useful to say anything more + Message := ''; // 'Unable to find code '+code+' in '+systemUri+' (version '+version+')'; it's not useful to say anything more result := nil; end; end; -function TSnomedProvider.systemUri(context : TCodeSystemProviderContext): String; +function TSnomedProvider.systemUri: String; begin result := URI_SNOMED; end; function TSnomedProvider.TotalCount: integer; begin - FSct.checkIsLoaded; result := FSct.FTotalCount; end; -function TSnomedProvider.version(context: TCodeSystemProviderContext): String; +function TSnomedProvider.version: String; begin result := FSct.FVersionUri; end; @@ -5456,7 +5263,6 @@ function TSnomedProvider.filter(forIteration : boolean; prop: String; op: TFhirF var id : UInt64; begin - FSct.checkIsLoaded; result := nil; if (prop = 'concept') and FSct.StringIsId(value, id) then if op = foIsA then @@ -5471,7 +5277,6 @@ function TSnomedProvider.filter(forIteration : boolean; prop: String; op: TFhirF function TSnomedProvider.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin - FSct.checkIsLoaded; if Length(TSnomedFilterContext(ctxt).matches) > 0 then result := TSnomedExpressionContext.create(TSnomedFilterContext(ctxt).Matches[TSnomedFilterContext(ctxt).ndx-1].index) else if Length(TSnomedFilterContext(ctxt).members) > 0 then @@ -5484,7 +5289,6 @@ function TSnomedProvider.InFilter(ctxt: TCodeSystemProviderFilterContext; concep var index : integer; begin - FSct.checkIsLoaded; if Length(TSnomedFilterContext(ctxt).members) > 0 then result := FindMember(TSnomedFilterContext(ctxt).Members, TSnomedExpressionContext(concept).reference, index) else @@ -5493,7 +5297,6 @@ function TSnomedProvider.InFilter(ctxt: TCodeSystemProviderFilterContext; concep function TSnomedProvider.FilterMore(ctxt: TCodeSystemProviderFilterContext): boolean; begin - FSct.checkIsLoaded; inc(TSnomedFilterContext(ctxt).ndx); if Length(TSnomedFilterContext(ctxt).matches) > 0 then result := TSnomedFilterContext(ctxt).ndx <= Length(TSnomedFilterContext(ctxt).matches) @@ -5503,6 +5306,16 @@ function TSnomedProvider.FilterMore(ctxt: TCodeSystemProviderFilterContext): boo result := TSnomedFilterContext(ctxt).ndx <= Length(TSnomedFilterContext(ctxt).descendants); end; +function TSnomedProvider.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + if Length(TSnomedFilterContext(ctxt).matches) > 0 then + result := Length(TSnomedFilterContext(ctxt).matches) + else if Length(TSnomedFilterContext(ctxt).members) > 0 then + result := Length(TSnomedFilterContext(ctxt).members) + else + result := Length(TSnomedFilterContext(ctxt).descendants); +end; + function TSnomedProvider.filterLocate(ctxt: TCodeSystemProviderFilterContext; code: String; var message : String): TCodeSystemProviderContext; var c : TSnomedFilterContext; @@ -5510,7 +5323,6 @@ function TSnomedProvider.filterLocate(ctxt: TCodeSystemProviderFilterContext; co concept : TCodeSystemProviderContext; ok : boolean; begin - FSct.checkIsLoaded; c := TSnomedFilterContext(ctxt); concept := locate(code, nil, message); try @@ -5534,7 +5346,6 @@ function TSnomedProvider.locateIsA(code, parent: String; disallowParent : boolea var ic, ip : Cardinal; begin - FSct.checkIsLoaded; if FSct.Concept.FindConcept(FSct.StringToIdOrZero(parent), ip) And FSct.Concept.FindConcept(FSct.StringToIdOrZero(code), ic) And FSct.Subsumes(ip, ic) And (not disallowParent or (ic <> ip)) then result := TSnomedExpressionContext.create(code, ic) @@ -5545,7 +5356,6 @@ function TSnomedProvider.locateIsA(code, parent: String; disallowParent : boolea function TSnomedProvider.name(context: TCodeSystemProviderContext): String; begin - FSct.checkIsLoaded; result := 'SNOMED CT'; end; diff --git a/library/ftx/ftx_service.pas b/library/ftx/ftx_service.pas index 744f28ca9..18b5f0806 100644 --- a/library/ftx/ftx_service.pas +++ b/library/ftx/ftx_service.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, Generics.Collections, - fsl_utilities, fsl_base, fsl_collections, fsl_fpc, fsl_lang, fsl_logging, + fsl_utilities, fsl_base, fsl_collections, fsl_fpc, fsl_lang, fsl_logging, fsl_i18n, fsl_http, fhir_common, fhir_factory, fhir_features, fhir_objects, fhir_cdshooks; @@ -59,7 +59,6 @@ ETerminologyError = class (EFslException) // problem in terminology operation const ANY_CODE_VS = 'http://hl7.org/fhir/ValueSet/@all'; - ALL_CODE_CS = 'http://hl7.org/fhir/CodeSystem/@all'; Type @@ -70,6 +69,8 @@ TCodeSystemProviderContext = class (TFslObject) function Link : TCodeSystemProviderContext; overload; end; + { TCodeSystemIteratorContext } + TCodeSystemIteratorContext = class (TFslObject) protected FContext: TCodeSystemProviderContext; @@ -87,11 +88,17 @@ TCodeSystemIteratorContext = class (TFslObject) function more : boolean; virtual; procedure next; // only call from within a provider + procedure moveCursor(current : integer); // a LOINC hack end; + { TCodeSystemProviderFilterContext } + TCodeSystemProviderFilterContext = class (TFslObject) + private + FSummary: String; public function Link : TCodeSystemProviderFilterContext; overload; + property summary : String read FSummary write FSummary; end; TCodeSystemProviderFilterPreparationContext = class (TFslObject) @@ -129,6 +136,9 @@ TConceptDesignation = class (TFslObject) TDisplayCheckingStyle = (dcsExact, dcsCaseInsensitive, dcsNormalised); TDisplayDifference = (ddDifferent, ddCase, ddNormalised); + TLangMatchType = (lmtLiteral, lmtFull, lmtLangRegion, lmtLang); + + TCodeSystemProvider = class; { TConceptDesignations } @@ -138,8 +148,11 @@ TConceptDesignations = class (TFslObject) FBaseLang : TIETFLang; FDesignations : TFslList; FLanguages : TIETFLanguageDefinitions; - function langMatches(lang : THTTPLanguageEntry; stated : TIETFLang; exact : boolean) : boolean; - function langsMatch(langList : THTTPLanguageList; stated : TIETFLang; exact : boolean) : boolean; + FSource : TCodeSystemProvider; + function GetCount: Integer; + function langMatches(lang : THTTPLanguageEntry; stated : TIETFLang; matchType: TLangMatchType) : boolean; + function langsMatch(langList : THTTPLanguageList; stated : TIETFLang; matchType : TLangMatchType; defLang : TIETFLang) : boolean; + procedure SetSource(AValue: TCodeSystemProvider); function stringMatches(source, possible : String; mode : TDisplayCheckingStyle; lang : TIETFLang) : boolean; procedure SetBaseLang(value : TIETFLang); public @@ -155,16 +168,19 @@ TConceptDesignations = class (TFslObject) function addDesignation(ccd : TFhirCodeSystemConceptDesignationW) : TConceptDesignation; overload; function addDesignation(ccd : TFhirValueSetComposeIncludeConceptDesignationW) : TConceptDesignation; overload; - function hasDisplay(langList : THTTPLanguageList; value : String; mode : TDisplayCheckingStyle; out diff : TDisplayDifference) : boolean; - function displayCount(langList : THTTPLanguageList; displayOnly : boolean) : integer; - function present(langList : THTTPLanguageList; displayOnly : boolean) : String; - function include(cd : TConceptDesignation; langList : THTTPLanguageList) : boolean; - function preferredDesignation(langList : THTTPLanguageList = nil) : TConceptDesignation; - function preferredDisplay(langList : THTTPLanguageList = nil) : String; + function hasDisplay(langList : THTTPLanguageList; defLang : TIETFLang; value : String; mode : TDisplayCheckingStyle; out diff : TDisplayDifference) : boolean; + function displayCount(langList : THTTPLanguageList; defLang : TIETFLang; displayOnly : boolean) : integer; + function present(langList : THTTPLanguageList; defLang : TIETFLang; displayOnly : boolean) : String; + function include(cd : TConceptDesignation; langList : THTTPLanguageList; defLang : TIETFLang) : boolean; + function preferredDesignation(langList : THTTPLanguageList = nil; defLang : TIETFLang = nil) : TConceptDesignation; + function preferredDisplay(langList : THTTPLanguageList = nil; defLang : TIETFLang = nil) : String; + function summary : String; property factory : TFHIRFactory read FFactory; property baseLang : TIETFLang read FBaseLang write SetBaseLang; property designations : TFslList read FDesignations; + property count : Integer read GetCount; + property source : TCodeSystemProvider read FSource write SetSource; end; TSearchFilterText = class (TFslObject) @@ -214,10 +230,13 @@ TAlternateCodeOptions = class (TFslObject) TCodeSystemProvider = class abstract (TFslObject) private FUseCount : cardinal; + FDefLang : TIETFLang; protected FLanguages : TIETFLanguageDefinitions; + FI18n : TI18nSupport; + procedure setDefLang(value : TIETFLang); public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; override; function Link : TCodeSystemProvider; overload; @@ -225,12 +244,15 @@ TCodeSystemProvider = class abstract (TFslObject) function contentMode : TFhirCodeSystemContentMode; virtual; function expandLimitation : Integer; virtual; function description : String; virtual; abstract; + function sourcePackage : String; virtual; function TotalCount : integer; virtual; abstract; function getPropertyDefinitions : TFslList; virtual; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; virtual; abstract; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; virtual; abstract; - function systemUri(context : TCodeSystemProviderContext) : String; virtual; abstract; - function version(context : TCodeSystemProviderContext) : String; virtual; + function systemUri() : String; virtual; abstract; + function version() : String; virtual; + function defLang() : TIETFLang; virtual; + function hasAnyDisplays(disp : THTTPLanguageList) : boolean; virtual; function name(context : TCodeSystemProviderContext) : String; virtual; function getDisplay(code : String; langList : THTTPLanguageList):String; virtual; abstract; function getDefinition(code : String):String; virtual; abstract; @@ -255,6 +277,7 @@ TCodeSystemProvider = class abstract (TFslObject) function parent(context : TCodeSystemProviderContext) : String; virtual; // return if there is one and only one function canParent : boolean; virtual; function doesFilter(prop : String; op : TFhirFilterOperator; value : String) : boolean; virtual; + function incompleteValidationMessage(context : TCodeSystemProviderContext; langs : THTTPLanguageList) : String; virtual; function hasSupplement(url : String) : boolean; virtual; procedure listSupplements(ts : TStringList); virtual; @@ -266,6 +289,7 @@ TCodeSystemProvider = class abstract (TFslObject) function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; overload; virtual; abstract; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String) : TCodeSystemProviderContext; overload; virtual; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; virtual; abstract; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; overload; virtual; abstract; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; virtual; abstract; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; virtual; abstract; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; virtual; abstract; @@ -283,6 +307,8 @@ TCodeSystemProvider = class abstract (TFslObject) property UseCount : cardinal read FUseCount; end; +const + CODES_TDisplayCheckingStyle : Array [TDisplayCheckingStyle] of String = ('Exact', 'CaseInsensitive', 'Normalised'); implementation { TAlternateCodeOptions } @@ -345,6 +371,7 @@ destructor TConceptDesignations.Destroy; FFactory.free; FBaselang.free; FDesignations.free; + FSource.free; inherited Destroy; end; @@ -422,13 +449,16 @@ function TConceptDesignations.addDesignation(ccd : TFhirCodeSystemConceptDesigna try result.Language := FLanguages.parse(ccd.language); result.Use := ccd.use; - result.Value := ccd.valueElement; {no .link} - list := ccd.getExtensionsW('http://hl7.org/fhir/StructureDefinition/coding-sctdescid'); - try - if (list.count > 0) then - result.extensions.addAll(list); - finally - list.free; + result.Value := ccd.valueElement; {no .link} + if (ccd.hasExtensions) then + begin + list := ccd.getExtensionsW('http://hl7.org/fhir/StructureDefinition/coding-sctdescid'); + try + if (list.count > 0) then + result.extensions.addAll(list); + finally + list.free; + end; end; designations.add(result.link); finally @@ -446,12 +476,15 @@ function TConceptDesignations.addDesignation(ccd : TFhirValueSetComposeIncludeCo result.Language := FLanguages.parse(ccd.language); result.Use := ccd.use; result.Value := ccd.valueElement; {no .link} - list := ccd.getExtensionsW('http://hl7.org/fhir/StructureDefinition/coding-sctdescid'); - try - if (list.count > 0) then - result.extensions.addAll(list); - finally - list.free; + if (ccd.hasExtensions) then + begin + list := ccd.getExtensionsW('http://hl7.org/fhir/StructureDefinition/coding-sctdescid'); + try + if (list.count > 0) then + result.extensions.addAll(list); + finally + list.free; + end; end; designations.add(result.link); finally @@ -462,10 +495,10 @@ function TConceptDesignations.addDesignation(ccd : TFhirValueSetComposeIncludeCo function isDisplay(cd : TConceptDesignation) : Boolean; begin - result := (cd.use <> nil) and (cd.use.systemUri = 'http://terminology.hl7.org/CodeSystem/designation-usage') and (cd.use.code = 'display'); + result := (cd.use = nil) or ((cd.use <> nil) and (cd.use.systemUri = 'http://terminology.hl7.org/CodeSystem/designation-usage') and (cd.use.code = 'display')); end; -function TConceptDesignations.preferredDesignation(langList : THTTPLanguageList = nil) : TConceptDesignation; +function TConceptDesignations.preferredDesignation(langList : THTTPLanguageList = nil; defLang : TIETFLang = nil) : TConceptDesignation; var cd : TConceptDesignation; lang : THTTPLanguageEntry; @@ -492,30 +525,59 @@ function TConceptDesignations.preferredDesignation(langList : THTTPLanguageList if (lang.value > 0) then begin for cd in FDesignations do - if (cd.base) and langMatches(lang, cd.language, true) then + if (cd.base) and langMatches(lang, cd.language, lmtFull) then + begin exit(cd); + end; for cd in FDesignations do - if isDisplay(cd) and langMatches(lang, cd.language, true) then + if isDisplay(cd) and langMatches(lang, cd.language, lmtFull) then + begin exit(cd); + end; for cd in FDesignations do - if (cd.base) and langMatches(lang, cd.language, false) then + if (cd.base) and langMatches(lang, cd.language, lmtLangRegion) then + begin exit(cd); + end; for cd in FDesignations do - if isDisplay(cd) and langMatches(lang, cd.language, false) then + if isDisplay(cd) and langMatches(lang, cd.language, lmtLangRegion) then + begin exit(cd); + end; + + for cd in FDesignations do + if (cd.base) and langMatches(lang, cd.language, lmtLang) then + begin + exit(cd); + end; + for cd in FDesignations do + if isDisplay(cd) and langMatches(lang, cd.language, lmtLang) then + begin + exit(cd); + end; + + for cd in FDesignations do + if langMatches(lang, cd.language, lmtFull) then + begin + exit(cd); + end; for cd in FDesignations do - if langMatches(lang, cd.language, true) then + if langMatches(lang, cd.language, lmtLangRegion) then + begin exit(cd); + end; for cd in FDesignations do - if langMatches(lang, cd.language, false) then + if langMatches(lang, cd.language, lmtLang) then + begin exit(cd); + end; end; end; end; -function TConceptDesignations.preferredDisplay(langList : THTTPLanguageList): String; +function TConceptDesignations.preferredDisplay(langList : THTTPLanguageList; defLang : TIETFLang): String; var cd : TConceptDesignation; begin @@ -526,73 +588,149 @@ function TConceptDesignations.preferredDisplay(langList : THTTPLanguageList): St result := cd.display; end; +function TConceptDesignations.summary: String; +var + cd : TConceptDesignation; +begin + result := ''; + for cd in FDesignations do + CommaAdd(result, cd.present); +end; -function TConceptDesignations.displayCount(langList : THTTPLanguageList; displayOnly : boolean): integer; + +function TConceptDesignations.displayCount(langList : THTTPLanguageList; defLang : TIETFLang; displayOnly : boolean): integer; var cd : TConceptDesignation; + s : String; begin + if (langList = nil) then + s := 'Check for display count. Langs = --' + else + s := 'Check for display count. Langs = '+langList.source; + if (defLang = nil) then + s := s + ', def = nil' + else + s := s + ', def = '+defLang.code; + Logging.log(s); + for cd in designations do + Logging.log(' *'+cd.present); + result := 0; for cd in FDesignations do - if (not displayOnly or cd.base or isDisplay(cd)) and langsMatch(langList, cd.language, false) and (cd.value <> nil) then + if (not displayOnly or cd.base or isDisplay(cd)) and langsMatch(langList, cd.language, lmtFull, defLang) and (cd.value <> nil) then + begin + Logging.log('count #1 '+cd.present); inc(result); + end; + if result = 0 then + for cd in FDesignations do + if (not displayOnly or cd.base or isDisplay(cd)) and langsMatch(langList, cd.language, lmtLangRegion, defLang) and (cd.value <> nil) then + begin + Logging.log('count #2 '+cd.present); + inc(result); + end; end; -function TConceptDesignations.present(langList : THTTPLanguageList; displayOnly : boolean): String; +function TConceptDesignations.present(langList : THTTPLanguageList; defLang : TIETFLang; displayOnly : boolean): String; var cd : TConceptDesignation; b : TCommaSeparatedStringBuilder; + c : integer; begin b := TCommaSeparatedStringBuilder.create(', ', ' or '); try + c := 0; for cd in designations do - if (not displayOnly or cd.base or isDisplay(cd)) and (langsMatch(langList, cd.language, false) and (cd.value <> nil)) then + begin + if (not displayOnly or cd.base or isDisplay(cd)) and (langsMatch(langList, cd.language, lmtLang, nil) and (cd.value <> nil)) then + begin + inc(c); if (cd.language <> nil) then b.append(''''+cd.display+''' ('+cd.language.code+')') else b.append(''''+cd.display+''''); + end; + end; + if (c = 0) then + begin + for cd in designations do + begin + if (not displayOnly or cd.base or isDisplay(cd)) and (cd.value <> nil) then + begin + inc(c); + if (cd.language <> nil) then + b.append(''''+cd.display+''' ('+cd.language.code+')') + else + b.append(''''+cd.display+''''); + end; + end; + end; + result := b.makeString; finally b.free; end; end; -function TConceptDesignations.include(cd : TConceptDesignation; langList : THTTPLanguageList) : boolean; +function TConceptDesignations.include(cd : TConceptDesignation; langList : THTTPLanguageList; defLang : TIETFLang) : boolean; begin - result := langsMatch(langList, cd.language, false); + result := langsMatch(langList, cd.language, lmtLang, defLang); end; -function TConceptDesignations.hasDisplay(langList : THTTPLanguageList; value: String; mode : TDisplayCheckingStyle; out diff : TDisplayDifference): boolean; +function TConceptDesignations.hasDisplay(langList : THTTPLanguageList; defLang : TIETFLang; value: String; mode : TDisplayCheckingStyle; out diff : TDisplayDifference): boolean; var cd : TConceptDesignation; begin + //Logging.log('Check for display "'+value+'". Langs = '+langList.source+', def = '+defLang.code+', mode = '+CODES_TDisplayCheckingStyle[mode]); + //for cd in designations do + // Logging.log(' *'+cd.present); + result := false; diff := ddDifferent; for cd in designations do - if (langsMatch(langList, cd.language, false) and (cd.value <> nil) and stringMatches(value, cd.value.asString, mode, cd.language)) then + if (langsMatch(langList, cd.language, lmtLang, defLang) and (cd.value <> nil) and stringMatches(value, cd.value.asString, mode, cd.language)) then + begin + //Logging.log(' true'); exit(true); + end; if mode = dcsExact then begin for cd in designations do - if (langsMatch(langList, cd.language, false) and (cd.value <> nil) and stringMatches(value, cd.value.asString, dcsCaseInsensitive, cd.language)) then + if (langsMatch(langList, cd.language, lmtLang, defLang) and (cd.value <> nil) and stringMatches(value, cd.value.asString, dcsCaseInsensitive, cd.language)) then begin diff := ddCase; + //Logging.log(' false (case)'); exit(false); end; end; if mode <> dcsNormalised then begin for cd in designations do - if (langsMatch(langList, cd.language, false) and (cd.value <> nil) and stringMatches(value, cd.value.asString, dcsNormalised, cd.language)) then + if (langsMatch(langList, cd.language, lmtLang, defLang) and (cd.value <> nil) and stringMatches(value, cd.value.asString, dcsNormalised, cd.language)) then begin diff := ddNormalised; + //Logging.log(' false (normalised)'); exit(false); end; end; + //Logging.log(' false'); +end; + +function depthForMatchType(matchType: TLangMatchType) : TIETFLangPartType; +begin + case matchType of + lmtLiteral : result := lptExtension; // not that it matters + lmtFull : result := lptExtension; + lmtLangRegion : result := lptRegion; + lmtLang : result := lptLanguage; + else + result := lptExtension; // not that it matters + end; end; -function TConceptDesignations.langMatches(lang : THTTPLanguageEntry; stated: TIETFLang; exact : boolean): boolean; +function TConceptDesignations.langMatches(lang : THTTPLanguageEntry; stated: TIETFLang; matchType: TLangMatchType): boolean; var actual : TIETFLang; begin @@ -603,36 +741,54 @@ function TConceptDesignations.langMatches(lang : THTTPLanguageEntry; stated: TIE result := false; if (lang.value > 0) then begin - if (lang.lang = '*') and not exact then + if (lang.lang = '*') and (matchType <> lmtLiteral) then exit(true); + if (actual <> nil) then begin - if (exact) then + if (matchType = lmtLiteral) then exit(lang.lang = actual.code); if (lang.ietf = nil) then lang.ietf := FLanguages.parse(lang.lang); - if lang.ietf.matches(stated) then + if (lang.ietf <> nil) and lang.ietf.matches(stated, depthForMatchType(matchType)) then exit(true); end; end; end; -function TConceptDesignations.langsMatch(langList : THTTPLanguageList; stated: TIETFLang; exact : boolean): boolean; +function TConceptDesignations.GetCount: Integer; +begin + result := FDesignations.count; +end; + +function TConceptDesignations.langsMatch(langList : THTTPLanguageList; stated: TIETFLang; matchType: TLangMatchType; defLang : TIETFLang): boolean; var e : THTTPLanguageEntry; begin + if (defLang <> nil) and (stated <> nil) then + begin + if stated.matches(defLang) then + exit(true); + end; + if (stated = nil) or (langList = nil) then result := true else begin result := false; for e in langList.langs do - if langMatches(e, stated, exact) then + if langMatches(e, stated, matchType) then exit(true); end; end; +procedure TConceptDesignations.SetSource(AValue: TCodeSystemProvider); +begin + FSource.free; + FSource := AValue; +end; + function TConceptDesignations.stringMatches(source, possible: String; mode : TDisplayCheckingStyle; lang : TIETFLang): boolean; begin // we ignore lang at this time @@ -732,10 +888,18 @@ function TConceptDesignation.present: String; { TCodeSystemProvider } -constructor TCodeSystemProvider.Create(languages: TIETFLanguageDefinitions); +procedure TCodeSystemProvider.setDefLang(value: TIETFLang); +begin + FDefLang.free; + FDefLang := value; +end; + +constructor TCodeSystemProvider.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin inherited Create; FLanguages := languages; + FI18n := i18n; + FDefLang := FLanguages.parse('en'); end; function TCodeSystemProvider.defToThisVersion(specifiedVersion : String): boolean; @@ -746,6 +910,8 @@ function TCodeSystemProvider.defToThisVersion(specifiedVersion : String): boolea destructor TCodeSystemProvider.Destroy; begin FLanguages.free; + FI18n.free; + FDefLang.free; inherited; end; @@ -762,6 +928,11 @@ function TCodeSystemProvider.doesFilter(prop: String; op: TFhirFilterOperator; v end; end; +function TCodeSystemProvider.incompleteValidationMessage(context: TCodeSystemProviderContext; langs: THTTPLanguageList): String; +begin + result := ''; +end; + procedure TCodeSystemProvider.extendLookup(factory : TFHIRFactory; ctxt: TCodeSystemProviderContext; langList : THTTPLanguageList; props : TArray; resp : TFHIRLookupOpResponseW); begin // nothing here @@ -776,7 +947,7 @@ function TCodeSystemProvider.filterLocate(ctxt: TCodeSystemProviderFilterContext procedure TCodeSystemProvider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin - card.summary := 'No CDSHook Implementation for code system '+systemUri(nil)+' for code '+code+' ('+display+')'; + card.summary := 'No CDSHook Implementation for code system '+systemUri+' for code '+code+' ('+display+')'; end; function TCodeSystemProvider.getPrepContext: TCodeSystemProviderFilterPreparationContext; @@ -811,7 +982,7 @@ function TCodeSystemProvider.Display(context: TCodeSystemProviderContext; lang : hl : THTTPLanguageList; l : TIETFLang; begin - hl := THTTPLanguageList.Create; + hl := THTTPLanguageList.Create('', false); try for l in lang do hl.addCode(l.code); @@ -836,6 +1007,11 @@ function TCodeSystemProvider.expandLimitation: Integer; result := 0; // no limit end; +function TCodeSystemProvider.sourcePackage: String; +begin + result := ''; +end; + function TCodeSystemProvider.getPropertyDefinitions: TFslList; begin result := nil; @@ -912,7 +1088,7 @@ function TCodeSystemProvider.specialFilter(prep: TCodeSystemProviderFilterPrepar function TCodeSystemProvider.subsumesTest(codeA, codeB: String): String; begin - raise ETerminologyError.create('Subsumption Testing is not supported for system '+systemUri(nil), itException); + raise ETerminologyError.create('Subsumption Testing is not supported for system '+systemUri, itException); end; function TCodeSystemProvider.getExtensions(context : TCodeSystemProviderContext) : TFslList; @@ -941,11 +1117,21 @@ function TCodeSystemProvider.canParent: boolean; result := false; end; -function TCodeSystemProvider.version(context: TCodeSystemProviderContext): String; +function TCodeSystemProvider.version(): String; begin result := ''; end; +function TCodeSystemProvider.defLang(): TIETFLang; +begin + result := FDefLang; +end; + +function TCodeSystemProvider.hasAnyDisplays(disp: THTTPLanguageList): boolean; +begin + result := disp.matches('en', false); +end; + { TSearchFilterText } constructor TSearchFilterText.create(filter: String); @@ -1140,6 +1326,11 @@ procedure TCodeSystemIteratorContext.next; inc(FCurrent); end; +procedure TCodeSystemIteratorContext.moveCursor(current: integer); +begin + FCurrent := current; +end; + { ETerminologyError } diff --git a/library/ftx/ftx_ucum_expressions.pas b/library/ftx/ftx_ucum_expressions.pas index f2f15ac5a..57260cb8a 100644 --- a/library/ftx/ftx_ucum_expressions.pas +++ b/library/ftx/ftx_ucum_expressions.pas @@ -774,11 +774,11 @@ function TUcumLexer.sizeInBytesV(magic : integer) : cardinal; class Function TUcumExpressionComposer.compose(can : TUcumCanonical; value : boolean) : String; var - b : TStringBuilder; + b : TFslStringBuilder; first : boolean; c : TUcumCanonicalUnit; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if (value) then b.append(can.Value.asDecimal); diff --git a/library/ftx/ftx_ucum_services.pas b/library/ftx/ftx_ucum_services.pas index 1db602a5a..2614c79c1 100644 --- a/library/ftx/ftx_ucum_services.pas +++ b/library/ftx/ftx_ucum_services.pas @@ -34,7 +34,7 @@ Uses SysUtils, Classes, - fsl_base, fsl_utilities, fsl_collections, fsl_stream, fsl_xml, fsl_ucum, fsl_http, fsl_lang, + fsl_base, fsl_utilities, fsl_collections, fsl_stream, fsl_xml, fsl_ucum, fsl_http, fsl_lang, fsl_i18n, ftx_ucum_handlers, ftx_ucum_validators, ftx_ucum_expressions, ftx_ucum_base, fhir_common, fhir_features, fhir_uris, fhir_cdshooks, @@ -88,7 +88,7 @@ TUcumServices = class (TCodeSystemProvider) protected function sizeInBytesV(magic : integer) : cardinal; override; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TUcumServices; Overload; @@ -237,8 +237,8 @@ TUcumServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -248,6 +248,7 @@ TUcumServices = class (TCodeSystemProvider) procedure Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); override; function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; @@ -438,7 +439,7 @@ function TUcumServices.convert(value: TFslDecimal; sourceUnit, destUnit: String) End; end; -constructor TUcumServices.Create(languages : TIETFLanguageDefinitions); +constructor TUcumServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); begin inherited; FModel := TUcumModel.Create; @@ -448,7 +449,7 @@ constructor TUcumServices.Create(languages : TIETFLanguageDefinitions); procedure TUcumServices.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'canonical:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'canonical:equals')); end; function TUcumServices.Definition(context: TCodeSystemProviderContext): string; @@ -527,9 +528,9 @@ function TUcumServices.getCanonicalUnits(code: String): String; procedure TUcumServices.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); var s : String; - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('* Analysis: '+analyse(code)+#13#10); b.Append('* Canonical Form: '+getCanonicalUnits(code)+#13#10); @@ -764,7 +765,7 @@ function TUcumServices.validateInProperty(code, propertyType: String): String; End; end; -function TUcumServices.version(context: TCodeSystemProviderContext): String; +function TUcumServices.version: String; begin result := UcumVersion; end; @@ -874,7 +875,7 @@ function TUcumServices.Code(context: TCodeSystemProviderContext): string; function TUcumServices.getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; begin - raise ETerminologyError.Create('not safe'); + raise ETerminologyError.Create('not safe', itInvalid); // result := nil; end; @@ -1039,7 +1040,7 @@ function TUcumServices.specialFilter(prep: TCodeSystemProviderFilterPreparationC result := TUcumFilterContext.create('') end; -function TUcumServices.systemUri(context : TCodeSystemProviderContext): String; +function TUcumServices.systemUri: String; begin result := URI_UCUM; end; @@ -1075,6 +1076,11 @@ function TUcumServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boole result := context.FCursor < FCommonUnitList.count; end; +function TUcumServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := FCommonUnitList.count; +end; + function TUcumServices.filterLocate(ctxt: TCodeSystemProviderFilterContext; code: String; var message : String): TCodeSystemProviderContext; begin result := nil; diff --git a/library/ftx/tests/ftx_tests_sct.pas b/library/ftx/tests/ftx_tests_sct.pas index 1f793d0cf..2c1b0d628 100644 --- a/library/ftx/tests/ftx_tests_sct.pas +++ b/library/ftx/tests/ftx_tests_sct.pas @@ -78,7 +78,7 @@ function hashOf(fn : String) : String; begin hash := TIdHashSHA256.Create; try - f := TFileStream.create(fn, fmOpenRead); + f := TFileStream.create(fn, fmOpenRead + fmShareDenyWrite); try result := hash.HashStreamAsHex(f); finally @@ -103,7 +103,7 @@ procedure TSnomedTests.Setup; h := hashOf(s); assertTrue(h = 'AA2BF154DC360AD5AFED687638CB8DC1EAE831E2EABD4498F327726F2EF92816', 'Hash of SCT test file is wrong: AA2BF154DC360AD5AFED687638CB8DC1EAE831E2EABD4498F327726F2EF92816/'+h+', file size is '+ DescribeBytes(FileSize(s))); - FServices.Load(s, true) + FServices.Load(s) end; procedure TSnomedTests.TearDown; diff --git a/library/ftx/tests/ftx_tests_ucum.pas b/library/ftx/tests/ftx_tests_ucum.pas index be86062dd..dbcdbb3f8 100644 --- a/library/ftx/tests/ftx_tests_ucum.pas +++ b/library/ftx/tests/ftx_tests_ucum.pas @@ -122,7 +122,7 @@ procedure TUcumTest.Setup; begin if (svc = nil) then begin - svc := TUcumServices.Create(nil); + svc := TUcumServices.Create(nil, nil); svc.Import(partnerFile('ucum.dat')); end; end; @@ -236,7 +236,7 @@ procedure TUcumSpecialTests.Setup; begin if (svc = nil) then begin - svc := TUcumServices.Create(nil); + svc := TUcumServices.Create(nil, nil); svc.Import(partnerFile('ucum.dat')); end; end; diff --git a/library/fui/fui_fake_console.lfm b/library/fui/fui_fake_console.lfm index 198efd99a..fac2af76b 100644 --- a/library/fui/fui_fake_console.lfm +++ b/library/fui/fui_fake_console.lfm @@ -1,30 +1,158 @@ object FakeConsoleForm: TFakeConsoleForm - Left = 414 - Height = 409 - Top = 173 - Width = 1039 + Left = -2433 + Height = 804 + Top = 559 + Width = 1220 Caption = 'Fake Console Form' - ClientHeight = 409 - ClientWidth = 1039 + ClientHeight = 804 + ClientWidth = 1220 Menu = MainMenu1 OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy + OnResize = FormResize OnShow = FormShow Position = poScreenCenter - object Memo1: TMemo + LCLVersion = '3.1.0.0' + object Panel2: TPanel Left = 0 - Height = 409 + Height = 804 Top = 0 - Width = 1039 + Width = 992 Align = alClient - Font.CharSet = ANSI_CHARSET - Font.Height = -13 - Font.Name = '.SF NS' - OnChange = Memo1Change - ParentFont = False - ReadOnly = True + ClientHeight = 804 + ClientWidth = 992 TabOrder = 0 + object Panel1: TPanel + Left = 1 + Height = 23 + Top = 1 + Width = 990 + Align = alTop + Alignment = taLeftJustify + BevelOuter = bvNone + Caption = ' Log' + ClientHeight = 23 + ClientWidth = 990 + TabOrder = 0 + object btnCopy: TButton + Left = 64 + Height = 25 + Top = -1 + Width = 75 + Caption = 'Copy' + TabOrder = 0 + OnClick = btnCopyClick + end + object btnClear: TButton + Left = 144 + Height = 25 + Top = -1 + Width = 75 + Caption = 'Clear' + TabOrder = 1 + OnClick = btnClearClick + end + object btnStop: TButton + Left = 224 + Height = 25 + Top = -1 + Width = 104 + Caption = 'Close down' + TabOrder = 2 + OnClick = btnStopClick + end + end + object mLog: TMemo + Left = 1 + Height = 779 + Top = 24 + Width = 990 + Align = alClient + Font.CharSet = ANSI_CHARSET + Font.Height = -12 + Font.Name = '.SF NS' + Font.Pitch = fpFixed + ParentFont = False + ReadOnly = True + TabOrder = 1 + WordWrap = False + OnChange = mLogChange + end + end + object Panel3: TPanel + Left = 997 + Height = 804 + Top = 0 + Width = 223 + Align = alRight + ClientHeight = 804 + ClientWidth = 223 + TabOrder = 1 + OnResize = Panel3Resize + object Panel4: TPanel + Left = 1 + Height = 24 + Top = 1 + Width = 221 + Align = alTop + Alignment = taLeftJustify + BevelOuter = bvNone + Caption = ' Threads' + TabOrder = 0 + end + object mThreads: TMemo + Left = 1 + Height = 575 + Top = 25 + Width = 221 + Align = alClient + Font.Pitch = fpFixed + ParentFont = False + TabOrder = 1 + WordWrap = False + end + object Panel5: TPanel + Left = 1 + Height = 203 + Top = 600 + Width = 221 + Align = alBottom + ClientHeight = 203 + ClientWidth = 221 + TabOrder = 2 + object Panel6: TPanel + Left = 1 + Height = 23 + Top = 1 + Width = 219 + Align = alTop + Alignment = taLeftJustify + Caption = ' Locks' + TabOrder = 0 + end + object mLocks: TMemo + Left = 1 + Height = 178 + Top = 24 + Width = 219 + Align = alClient + Font.Pitch = fpFixed + Lines.Strings = ( + 'mLocks' + ) + ParentFont = False + TabOrder = 1 + end + end + end + object Splitter1: TSplitter + Left = 992 + Height = 804 + Top = 0 + Width = 5 + Align = alRight + ResizeAnchor = akRight end object Timer1: TTimer Enabled = False diff --git a/library/fui/fui_fake_console.pas b/library/fui/fui_fake_console.pas index ba865b0c3..56721ed74 100644 --- a/library/fui/fui_fake_console.pas +++ b/library/fui/fui_fake_console.pas @@ -87,8 +87,13 @@ TWorkerThread = class (TThread) { TFakeConsoleForm } TFakeConsoleForm = class(TForm) + btnCopy: TButton; + btnClear: TButton; + btnStop: TButton; MainMenu1: TMainMenu; - Memo1: TMemo; + mLocks: TMemo; + mLog: TMemo; + mThreads: TMemo; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; @@ -99,16 +104,28 @@ TFakeConsoleForm = class(TForm) mnuApple: TMenuItem; MenuItem7: TMenuItem; mnuPreferences: TMenuItem; + Panel1: TPanel; + Panel2: TPanel; + Panel3: TPanel; + Panel4: TPanel; + Panel5: TPanel; + Panel6: TPanel; + Splitter1: TSplitter; Timer1: TTimer; FLogger : TFakeConsoleListener; + procedure btnCopyClick(Sender: TObject); + procedure btnClearClick(Sender: TObject); + procedure btnStopClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); + procedure FormResize(Sender: TObject); procedure FormShow(Sender: TObject); - procedure Memo1Change(Sender: TObject); + procedure mLogChange(Sender: TObject); procedure MenuItem4Click(Sender: TObject); procedure mnuPreferencesClick(Sender: TObject); procedure mnuStopClick(Sender: TObject); + procedure Panel3Resize(Sender: TObject); procedure Timer1Timer(Sender: TObject); private FListener: TFakeConsoleListener; @@ -121,11 +138,12 @@ TFakeConsoleForm = class(TForm) FCache : TStringList; FWorkingLine : integer; FMaxLines : integer; + procedure SetOnStop(AValue: TNotifyEvent); procedure start; public property Listener : TFakeConsoleListener read FListener; property Op : TWorkProcedure read FOp write FOp; - property OnStop : TNotifyEvent read FOnStop write FOnStop; + property OnStop : TNotifyEvent read FOnStop write SetOnStop; end; var @@ -182,7 +200,7 @@ procedure TFakeConsoleListener.newDay(const s: String); procedure TFakeConsoleListener.log(const s: String); begin - FLock.Lock; + FLock.Lock('log'); try FLines.add(s); finally @@ -202,7 +220,7 @@ function TFakeConsoleListener.transient: boolean; procedure TFakeConsoleListener.logStart(s: String); begin - FLock.Lock; + FLock.Lock('logStart'); try FLine := s; FFinished := false; @@ -213,7 +231,7 @@ procedure TFakeConsoleListener.logStart(s: String); procedure TFakeConsoleListener.logContinue(s: String); begin - FLock.Lock; + FLock.Lock('logContinue'); try FLine := FLine + s; finally @@ -223,7 +241,7 @@ procedure TFakeConsoleListener.logContinue(s: String); procedure TFakeConsoleListener.logFinish(s: String); begin - FLock.Lock; + FLock.Lock('logFinish'); try FLine := FLine + s; FFinished := true; @@ -245,6 +263,19 @@ procedure TFakeConsoleForm.FormCreate(Sender: TObject); FAutoClose := FIni.ReadBool('settings', 'autoclose', false); FForwards := FIni.ReadBool('settings', 'forwards', true); FMaxLines := FIni.ReadInteger('settings', 'maxlines', MAX_MEMO_LINE_COUNT); + Height := FIni.ReadInteger('settings', 'height', Height); + Width := FIni.ReadInteger('settings', 'width', Width); + Top := FIni.ReadInteger('settings', 'top', Top); + Left := FIni.ReadInteger('settings', 'left', Left); + panel3.Width := FIni.ReadInteger('settings', 'pwidth', panel3.Width); + mLog.font.Size := FIni.ReadInteger('settings', 'fontsize', 9); + mLog.WordWrap := FIni.ReadBool('settings', 'wordwrap', true); + mThreads.font.Size := mLog.font.size; + mLocks.font.Size := mLog.font.Size; + mLocks.Font.Pitch := fpFixed; + mThreads.Font.Pitch := fpFixed; + mLog.Font.Pitch := fpFixed; + FCache := TStringList.Create; end; @@ -253,6 +284,28 @@ procedure TFakeConsoleForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean CanClose := GFinished; end; +procedure TFakeConsoleForm.btnCopyClick(Sender: TObject); +var + c : integer; +begin + c := mLog.Cursor; + mLog.SelectAll; + mLog.CopyToClipboard; + mLog.Cursor := 0; + mLog.Cursor := c; +end; + +procedure TFakeConsoleForm.btnClearClick(Sender: TObject); +begin + mLog.Clear; +end; + +procedure TFakeConsoleForm.btnStopClick(Sender: TObject); +begin + if assigned(FOnStop) then + FOnStop(self); +end; + procedure TFakeConsoleForm.FormDestroy(Sender: TObject); begin Logging.removeListener(FListener); @@ -260,12 +313,22 @@ procedure TFakeConsoleForm.FormDestroy(Sender: TObject); FCache.free; end; +procedure TFakeConsoleForm.FormResize(Sender: TObject); +begin + FIni.WriteInteger('settings', 'height', Height); + FIni.WriteInteger('settings', 'width', Width); + FIni.WriteInteger('settings', 'top', Top); + FIni.WriteInteger('settings', 'left', Left); +end; + procedure TFakeConsoleForm.FormShow(Sender: TObject); begin Timer1.Enabled := true; + btnStop.Enabled := assigned(FOnStop); + mnuStop.Enabled := assigned(FOnStop); end; -procedure TFakeConsoleForm.Memo1Change(Sender: TObject); +procedure TFakeConsoleForm.mLogChange(Sender: TObject); begin end; @@ -281,15 +344,23 @@ procedure TFakeConsoleForm.mnuPreferencesClick(Sender: TObject); try FakeConsoleSettingsForm.chkForwards.checked := FIni.ReadBool('settings', 'forwards', false); FakeConsoleSettingsForm.chkAutoClose.checked := FIni.ReadBool('settings', 'autoclose', false); + FakeConsoleSettingsForm.chkWordWrap.checked := FIni.ReadBool('settings', 'wordwrap', false); FakeConsoleSettingsForm.eLines.text := inttostr(FMaxLines); + FakeConsoleSettingsForm.eSize.text := inttostr(FIni.ReadInteger('settings', 'fontsize', 9)); if FakeConsoleSettingsForm.showModal = mrOK then begin FIni.WriteBool('settings', 'forwards', FakeConsoleSettingsForm.chkForwards.checked); FIni.WriteBool('settings', 'autoclose', FakeConsoleSettingsForm.chkAutoClose.checked); + FIni.WriteBool('settings', 'wordwrap', FakeConsoleSettingsForm.chkWordWrap.checked); FIni.WriteInteger('settings', 'maxlines', StrToIntDef(FakeConsoleSettingsForm.eLines.text, MAX_MEMO_LINE_COUNT)); + FIni.WriteInteger('settings', 'fontsize', StrToIntDef(FakeConsoleSettingsForm.eSize.text, 9)); FAutoClose := FIni.ReadBool('settings', 'autoclose', false); FForwards := FIni.ReadBool('settings', 'forwards', true); FMaxLines := FIni.ReadInteger('settings', 'maxlines', MAX_MEMO_LINE_COUNT); + mLog.font.Size := FIni.ReadInteger('settings', 'fontsize', 9); + mThreads.font.Size := mLog.font.Size; + mLocks.font.Size := mLog.font.Size; + mLog.WordWrap := FIni.ReadBool('settings', 'wordwrap', true); end; finally FakeConsoleSettingsForm.free; @@ -303,6 +374,11 @@ procedure TFakeConsoleForm.mnuStopClick(Sender: TObject); FOnStop(self); end; +procedure TFakeConsoleForm.Panel3Resize(Sender: TObject); +begin + FIni.WriteInteger('settings', 'pwidth', panel3.Width); +end; + procedure TFakeConsoleForm.Timer1Timer(Sender: TObject); var l, s : String; @@ -310,7 +386,7 @@ procedure TFakeConsoleForm.Timer1Timer(Sender: TObject); begin if not FStarted then start; - FListener.FLock.Lock; + FListener.FLock.Lock('Timer1Timer'); try l := FListener.FLine; FCache.assign(FListener.FLines); @@ -323,43 +399,43 @@ procedure TFakeConsoleForm.Timer1Timer(Sender: TObject); end; if FForwards then begin - while memo1.lines.count > FMaxLines do - memo1.lines.delete(0); + while mLog.lines.count > FMaxLines do + mLog.lines.delete(0); if (l <> '') then begin if FWorkingLine < 0 then begin - FWorkingLine := memo1.lines.count; - memo1.lines.add(''); + FWorkingLine := mLog.lines.count; + mLog.lines.add(''); end; - memo1.lines[FWorkingLine] := l; + mLog.lines[FWorkingLine] := l; end; b := false; for s in FCache do begin - memo1.lines.append(s); + mLog.lines.append(s); b := true; end; if (b) then - memo1.selStart := length(memo1.text) - length(memo1.lines[memo1.lines.count-1]); + mLog.selStart := length(mLog.text) - length(mLog.lines[mLog.lines.count-1]); end else begin - while memo1.lines.count > FMaxLines do - memo1.lines.delete(memo1.lines.count - 1); + while mLog.lines.count > FMaxLines do + mLog.lines.delete(mLog.lines.count - 1); if (l <> '') then begin if FWorkingLine < 0 then begin FWorkingLine := 0; - memo1.lines.insert(0, s) + mLog.lines.insert(0, s) end; - memo1.lines[FWorkingLine] := l; + mLog.lines[FWorkingLine] := l; end; for s in FCache do begin - memo1.lines.insert(0, s); + mLog.lines.insert(0, s); if FWorkingLine >= 0 then inc(FWorkingLine); end; @@ -367,7 +443,13 @@ procedure TFakeConsoleForm.Timer1Timer(Sender: TObject); if f then FWorkingLine := -1; + mThreads.text := GetThreadReport(false, #13#10); + mLocks.text := DumpLocks(false, #13#10); + caption := 'FHIRServer ('+Logging.MemoryStatus(false)+')'; + mnuStop.enabled := not GFinished; + btnStop.enabled := not GFinished; + if GFinished and FAutoClose then Close; end; @@ -379,5 +461,12 @@ procedure TFakeConsoleForm.start; TWorkerThread.Create(FOp); end; +procedure TFakeConsoleForm.SetOnStop(AValue: TNotifyEvent); +begin + FOnStop:=AValue; + btnStop.Enabled := assigned(FOnStop); + mnuStop.Enabled := assigned(FOnStop); +end; + end. diff --git a/library/fui/fui_fake_console_settings.lfm b/library/fui/fui_fake_console_settings.lfm index 30797ad2a..1453a9333 100644 --- a/library/fui/fui_fake_console_settings.lfm +++ b/library/fui/fui_fake_console_settings.lfm @@ -1,23 +1,24 @@ object FakeConsoleSettingsForm: TFakeConsoleSettingsForm Left = 690 - Height = 135 + Height = 219 Top = 222 - Width = 258 + Width = 219 Caption = 'Console Preferences' - ClientHeight = 135 - ClientWidth = 258 + ClientHeight = 219 + ClientWidth = 219 + LCLVersion = '3.1.0.0' object Panel1: TPanel Left = 0 Height = 41 - Top = 94 - Width = 258 + Top = 178 + Width = 219 Align = alBottom BevelOuter = bvNone ClientHeight = 41 - ClientWidth = 258 + ClientWidth = 219 TabOrder = 0 object btnOk: TButton - Left = 93 + Left = 54 Height = 25 Top = 6 Width = 75 @@ -27,7 +28,7 @@ object FakeConsoleSettingsForm: TFakeConsoleSettingsForm TabOrder = 0 end object btnCancel: TButton - Left = 174 + Left = 135 Height = 25 Top = 6 Width = 75 @@ -55,8 +56,8 @@ object FakeConsoleSettingsForm: TFakeConsoleSettingsForm end object eLines: TEdit Left = 124 - Height = 22 - Top = 36 + Height = 21 + Top = 37 Width = 56 TabOrder = 3 Text = 'eLines' @@ -69,4 +70,27 @@ object FakeConsoleSettingsForm: TFakeConsoleSettingsForm Caption = 'Max Line Count' ParentColor = False end + object chkWordWrap: TCheckBox + Left = 16 + Height = 18 + Top = 94 + Width = 124 + Caption = 'Word Wrap in log' + TabOrder = 4 + end + object Label2: TLabel + Left = 20 + Height = 16 + Top = 126 + Width = 60 + Caption = 'Font Size:' + end + object eSize: TEdit + Left = 88 + Height = 21 + Top = 124 + Width = 56 + TabOrder = 5 + Text = 'eSize' + end end diff --git a/library/fui/fui_fake_console_settings.pas b/library/fui/fui_fake_console_settings.pas index e8a5e7389..a0b5f1af5 100644 --- a/library/fui/fui_fake_console_settings.pas +++ b/library/fui/fui_fake_console_settings.pas @@ -43,10 +43,13 @@ interface TFakeConsoleSettingsForm = class(TForm) btnCancel: TButton; btnOk: TButton; + chkWordWrap: TCheckBox; chkForwards: TCheckBox; chkAutoClose: TCheckBox; eLines: TEdit; + eSize: TEdit; Label1: TLabel; + Label2: TLabel; Panel1: TPanel; private diff --git a/library/fui/fui_lcl_cache.pas b/library/fui/fui_lcl_cache.pas index 9ddbb8c7e..84166864b 100644 --- a/library/fui/fui_lcl_cache.pas +++ b/library/fui/fui_lcl_cache.pas @@ -206,7 +206,7 @@ function TPackageListManager.addItem(mode: String): TNpmPackage; PackageCacheForm.Cursor := crHourGlass; try FCache.OnWork := PackageCacheForm.packageWork; - result := FCache.Import(fileToBytes(PackageCacheForm.dlgOpen.FileName)); + result := FCache.Import(fileToBytes(PackageCacheForm.dlgOpen.FileName), PackageCacheForm.dlgOpen.FileName); finally PackageCacheForm.Cursor := crDefault; end; @@ -216,7 +216,7 @@ function TPackageListManager.addItem(mode: String): TNpmPackage; begin FCache.OnWork := PackageCacheForm.packageWork; if InputQuery('Fetch Package from Web', 'Enter URL:', url) then - result := FCache.Import(TInternetFetcher.fetchUrl(url)); + result := FCache.Import(TInternetFetcher.fetchUrl(url), url); end else if not FCache.packageExists(mode, '') then begin diff --git a/library/v2/v2_dictionary.pas b/library/v2/v2_dictionary.pas index f6f4151af..fedde7e96 100644 --- a/library/v2/v2_dictionary.pas +++ b/library/v2/v2_dictionary.pas @@ -4497,7 +4497,7 @@ function THL7V2SchemaStoreCacheEntry.sizeInBytesV(magic : integer) : cardinal; Begin Result := Nil; aDate := CheckFileExists(aVersion, sStruct); - FLock.Lock; + FLock.Lock('ProduceSchemaMap'); Try oEntry := FCache.GetByVersionAndStructure(aVersion, sStruct); bOk := Assigned(oEntry) And (aDate < oEntry.Date); @@ -4514,7 +4514,7 @@ function THL7V2SchemaStoreCacheEntry.sizeInBytesV(magic : integer) : cardinal; Else Begin Result := LoadSchemaFromXML(aVersion, sStruct); - FLock.Lock; + FLock.Lock('ProduceSchemaMap2'); Try iIndex := FCache.IndexByVersionAndStructure(aVersion, sStruct); If iIndex > -1 Then @@ -4531,7 +4531,7 @@ function THL7V2SchemaStoreCacheEntry.sizeInBytesV(magic : integer) : cardinal; If sValue <> FFileName Then Begin FFilename := sValue; - FLock.Lock; + FLock.Lock('SetFileName'); Try FCache.Clear; LoadSchemasFromStore; @@ -5090,7 +5090,7 @@ procedure THL7V2Dictionary.LoadSegmentFields(aVersion: THL7V2Version; oSegments: function THL7V2Dictionary.GetModel(aVersion: THL7V2Version): THL7V2Model; begin - FLock.Lock; + FLock.Lock('GetModel'); Try result := FModels[aVersion]; if result = nil then @@ -5245,7 +5245,7 @@ function THL7V2Dictionary.HasVersion(aVer: THL7V2Version): Boolean; function THL7V2Dictionary.VersionLoaded(aVer: THL7V2Version): Boolean; begin - FLock.Lock; + FLock.Lock('VersionLoaded'); Try result := assigned(FModels[aVer]); Finally diff --git a/library/v2/v2_message.pas b/library/v2/v2_message.pas index 66fa88d37..3fd43a033 100644 --- a/library/v2/v2_message.pas +++ b/library/v2/v2_message.pas @@ -233,14 +233,14 @@ TV2Composer = class (TFslObject) FComponentDelimiter: AnsiChar; procedure init; - function escape(b : TStringBuilder; src : String) : AnsiString; - procedure composeBinary(b : TStringBuilder; cnt : TV2Content); - procedure composeEscape(b : TStringBuilder; cnt : TV2Content); - procedure composeContent(b : TStringBuilder; cnt : TV2Content); - procedure composeCell(b : TStringBuilder; cell : TV2Cell; ch : AnsiChar); - procedure composeField(b : TStringBuilder; fld : TV2Field); - procedure composeSegment(b : TStringBuilder; seg : TV2Segment); - procedure composeMessage(b : TStringBuilder; msg : TV2Message); + function escape(b : TFslStringBuilder; src : String) : AnsiString; + procedure composeBinary(b : TFslStringBuilder; cnt : TV2Content); + procedure composeEscape(b : TFslStringBuilder; cnt : TV2Content); + procedure composeContent(b : TFslStringBuilder; cnt : TV2Content); + procedure composeCell(b : TFslStringBuilder; cell : TV2Cell; ch : AnsiChar); + procedure composeField(b : TFslStringBuilder; fld : TV2Field); + procedure composeSegment(b : TFslStringBuilder; seg : TV2Segment); + procedure composeMessage(b : TFslStringBuilder; msg : TV2Message); public class function composeString(msg : TV2Message; options : TV2ComposerOptions = []) : String; overload; class function composeBytes(msg : TV2Message; options : TV2ComposerOptions = []) : TBytes; overload; @@ -1255,7 +1255,7 @@ procedure TV2Parser.parseCell(cell : TV2Cell; const cnt : String; bNoEscape : Bo Procedure TV2Parser.parseContent(cell : TV2Cell; Const cnt : String; bNoEscape : Boolean); var - buf : TStringBuilder; + buf : TFslStringBuilder; iCursor : Integer; Procedure Commit(); Begin @@ -1278,7 +1278,7 @@ procedure TV2Parser.parseCell(cell : TV2Cell; const cnt : String; bNoEscape : Bo End Else Begin - buf := TStringBuilder.Create; + buf := TFslStringBuilder.Create; try iCursor := 1; While (iCursor <= Length(cnt)) Do @@ -1468,13 +1468,13 @@ class function TV2Composer.composeBytes(msg: TV2Message; options: TV2ComposerOpt class function TV2Composer.composeString(obj: TV2Object; options: TV2ComposerOptions): String; var this : TV2Composer; - b : TStringBuilder; + b : TFslStringBuilder; begin this := TV2Composer.Create; try this.FOptions := options; this.init; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try if obj is TV2Message then this.composeMessage(b, obj as TV2Message) @@ -1495,7 +1495,7 @@ class function TV2Composer.composeString(obj: TV2Object; options: TV2ComposerOpt end; end; -procedure TV2Composer.composeCell(b: TStringBuilder; cell: TV2Cell; ch: AnsiChar); +procedure TV2Composer.composeCell(b: TFslStringBuilder; cell: TV2Cell; ch: AnsiChar); var first : boolean; comp : TV2Cell; @@ -1527,7 +1527,7 @@ procedure TV2Composer.composeCell(b: TStringBuilder; cell: TV2Cell; ch: AnsiChar end; end; -procedure TV2Composer.composeContent(b: TStringBuilder; cnt: TV2Content); +procedure TV2Composer.composeContent(b: TFslStringBuilder; cnt: TV2Content); begin case cnt.kind of ckString: b.Append(cnt.FValue); @@ -1537,7 +1537,7 @@ procedure TV2Composer.composeContent(b: TStringBuilder; cnt: TV2Content); end; end; -procedure TV2Composer.composeField(b: TStringBuilder; fld: TV2Field); +procedure TV2Composer.composeField(b: TFslStringBuilder; fld: TV2Field); var first : boolean; cell : TV2Cell; @@ -1553,7 +1553,7 @@ procedure TV2Composer.composeField(b: TStringBuilder; fld: TV2Field); end; end; -procedure TV2Composer.composeMessage(b: TStringBuilder; msg: TV2Message); +procedure TV2Composer.composeMessage(b: TFslStringBuilder; msg: TV2Message); var seg : TV2Segment; begin @@ -1561,7 +1561,7 @@ procedure TV2Composer.composeMessage(b: TStringBuilder; msg: TV2Message); composeSegment(b, seg); end; -procedure TV2Composer.composeSegment(b: TStringBuilder; seg: TV2Segment); +procedure TV2Composer.composeSegment(b: TFslStringBuilder; seg: TV2Segment); var iLoop : integer; iStart : Integer; @@ -1594,13 +1594,13 @@ procedure TV2Composer.composeSegment(b: TStringBuilder; seg: TV2Segment); class function TV2Composer.composeString(msg: TV2Message; options: TV2ComposerOptions): String; var this : TV2Composer; - b : TStringBuilder; + b : TFslStringBuilder; begin this := TV2Composer.Create; try this.FOptions := options; this.init; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try this.composeMessage(b, msg); result := b.ToString; @@ -1612,7 +1612,7 @@ class function TV2Composer.composeString(msg: TV2Message; options: TV2ComposerOp end; end; -function TV2Composer.escape(b: TStringBuilder; src: String): AnsiString; +function TV2Composer.escape(b: TFslStringBuilder; src: String): AnsiString; var ch : char; begin @@ -1645,14 +1645,14 @@ function TV2Composer.escape(b: TStringBuilder; src: String): AnsiString; end; end; -procedure TV2Composer.composeEscape(b: TStringBuilder; cnt: TV2Content); +procedure TV2Composer.composeEscape(b: TFslStringBuilder; cnt: TV2Content); begin b.Append(FEscapeCharacter); b.Append(cnt.value); b.Append(FEscapeCharacter); end; -procedure TV2Composer.composeBinary(b: TStringBuilder; cnt: TV2Content); +procedure TV2Composer.composeBinary(b: TFslStringBuilder; cnt: TV2Content); begin b.Append(FEscapeCharacter); b.Append('X'); diff --git a/library/version.inc b/library/version.inc index 26c904d20..abf9fa21a 100644 --- a/library/version.inc +++ b/library/version.inc @@ -1,3 +1,3 @@ - FHIR_CODE_FULL_VERSION = '3.0.0'; - FHIR_CODE_RELEASE_DATE = '2023-06-29'; - FHIR_CODE_RELEASE_DATETIME = '20230619195055.040Z'; + FHIR_CODE_FULL_VERSION = '3.4.11'; + FHIR_CODE_RELEASE_DATE = '2024-09-07'; + FHIR_CODE_RELEASE_DATETIME = '20240907131149.520Z'; diff --git a/library/web/fsl_crypto.pas b/library/web/fsl_crypto.pas index a01c827cf..5856a9b02 100644 --- a/library/web/fsl_crypto.pas +++ b/library/web/fsl_crypto.pas @@ -1410,7 +1410,7 @@ class function TJWTUtils.decodeJWT(token: string): TJWT; result.payloadBytes := JWTDeBase64URL(payload); if result.header['zip'] = 'DEF' then - result.payloadBytes := ungzip(result.payloadBytes); + result.payloadBytes := ungzip(result.payloadBytes, 'jwt payload'); result.payload := TJSONParser.Parse(result.payloadBytes); result.link; diff --git a/library/web/fsl_npm_cache.pas b/library/web/fsl_npm_cache.pas index d33fc0f80..92b81fbee 100644 --- a/library/web/fsl_npm_cache.pas +++ b/library/web/fsl_npm_cache.pas @@ -40,7 +40,7 @@ interface type TCheckEvent = function(sender : TObject; msg : String):boolean of object; - TPackageLoadingEvent = procedure (rType, id : String; stream : TStream) of object; + TPackageLoadingEvent = procedure (packageId : String; rType, id : String; stream : TStream) of object; TPackageDefinition = class (TFslObject) private @@ -98,15 +98,13 @@ TFHIRPackageManager = class (TFslObject) FCache : TFslMap; FTaskDesc : String; FCaching : boolean; - function PathForPackage(id, ver : String) : String; - function loadArchive(content : TBytes) : TDictionary; + function loadArchive(content : TBytes; description : String) : TDictionary; procedure clearCache; function checkPackageSize(dir : String) : integer; procedure work(pct : integer; done : boolean; desc : String); procedure progress(sender : TObject; pct : integer); function check(desc : String) : boolean; - function loadPackageFromCache(folder : String) : TNpmPackage; procedure buildPackageIndex(folder : String); function latestPackageVersion(id: String): String; function isIgnored(s : String): boolean; @@ -133,10 +131,12 @@ TFHIRPackageManager = class (TFslObject) procedure ListPackages(kinds : TFHIRPackageKindSet; list : TFslList); overload; procedure ListAllPackages(list : TFslList); overload; - function packageExists(id, ver : String) : boolean; overload; + function packageExists(id, ver : String; allowed : TSemanticVersionLevel = semverMinor) : boolean; overload; + function PathForPackage(id, ver : String; allowed : TSemanticVersionLevel = semverMinor) : String; function autoInstallPackage(id, ver : String) : boolean; overload; function latestPublishedVersion(id : String) : String; + function loadPackageFromCache(folder : String) : TNpmPackage; function loadPackage(id : String) : TNpmPackage; overload; function loadPackage(id, ver : String) : TNpmPackage; overload; procedure loadPackage(id, ver : String; resources : Array of String; loadInfo : TPackageLoadingInformation); overload; @@ -146,7 +146,7 @@ TFHIRPackageManager = class (TFslObject) procedure clear; procedure UnLoad; - function import(content : TBytes) : TNpmPackage; overload; + function import(content : TBytes; description : String) : TNpmPackage; overload; function install(url : String) : boolean; procedure remove(id : String); overload; @@ -417,7 +417,7 @@ procedure TFHIRPackageManager.clearCache; FolderDelete(s); FIni.DeleteKey('packages', s); end; - FLock.Lock; + FLock.Lock('clearCache'); try FCache.Clear; finally @@ -476,7 +476,7 @@ function TFHIRPackageManager.getUrl(id: String): String; end; -function TFHIRPackageManager.import(content : TBytes) : TNpmPackage; +function TFHIRPackageManager.import(content : TBytes; description : String) : TNpmPackage; var npm : TJsonObject; id, ver, dir, fn, fver, s : String; @@ -484,7 +484,7 @@ function TFHIRPackageManager.import(content : TBytes) : TNpmPackage; size,c : integer; indexer : TNpmPackageIndexBuilder; begin - files := loadArchive(content); + files := loadArchive(content, description); try npm := TJSONParser.Parse(files['package\package.json']); try @@ -579,7 +579,7 @@ function TFHIRPackageManager.install(url: String) : boolean; raise EIOException.create('Unable to find package for '+url+': '+s); if result then begin - Import(fetch.Buffer.AsBytes).free; + Import(fetch.Buffer.AsBytes, url).free; end; finally fetch.free; @@ -724,7 +724,7 @@ procedure TFHIRPackageManager.ListPackages(list: TStrings); list.Add(s); end; -function TFHIRPackageManager.loadArchive(content: TBytes): TDictionary; +function TFHIRPackageManager.loadArchive(content: TBytes; description : String): TDictionary; var bo, bi : TBytesStream; tar : TTarArchive; @@ -736,7 +736,7 @@ function TFHIRPackageManager.loadArchive(content: TBytes): TDictionary.Create; - bo := TBytesStream.create(ungzip(content)); + bo := TBytesStream.create(ungzip(content, description)); try work(trunc(bo.Position / bo.Size * 100), false, 'Loading Package'); tar := TTarArchive.Create(bo); @@ -859,7 +859,7 @@ procedure TFHIRPackageManager.loadPackage(id, ver: String; resources : TFslStrin f := TFileStream.Create(FilePath([p, 'package', fi.Name]), fmOpenRead + fmShareDenyWrite); try try - loadInfo.OnLoadEvent(fi.ResourceType, fi.id, f); + loadInfo.OnLoadEvent(npm.name+'#'+npm.version, fi.ResourceType, fi.id, f); except on e : Exception do begin @@ -885,7 +885,7 @@ function TFHIRPackageManager.loadPackageFromCache(folder: String): TNpmPackage; var found : boolean; begin - FLock.Lock; + FLock.Lock('loadPackageFromCache'); try found := FCache.TryGetValue(folder, result); if found then @@ -901,7 +901,7 @@ function TFHIRPackageManager.loadPackageFromCache(folder: String): TNpmPackage; result := TNpmPackage.fromFolder(folder); if FCaching then begin - FLock.Lock; + FLock.Lock('loadPackageFromCache2'); try FCache.add(folder, result.Link); finally @@ -918,7 +918,7 @@ function TFHIRPackageManager.autoInstallPackage(id, ver: String): boolean; begin if (ver = '') then ver := latestPublishedVersion(id); - result := packageExists(id, ver); + result := packageExists(id, ver, semverLabel); if (not result) then begin list := TFslList.Create; @@ -992,12 +992,12 @@ procedure TFHIRPackageManager.buildPackageIndex(folder : String); end; end; -function TFHIRPackageManager.packageExists(id, ver: String): boolean; +function TFHIRPackageManager.packageExists(id, ver: String; allowed : TSemanticVersionLevel = semverMinor): boolean; begin result := PathForPackage(id, ver) <> ''; end; -function TFHIRPackageManager.PathForPackage(id, ver: String): String; +function TFHIRPackageManager.PathForPackage(id, ver: String; allowed : TSemanticVersionLevel = semverMinor): String; var ts : TStringlist; s, n, t : String; @@ -1008,7 +1008,7 @@ function TFHIRPackageManager.PathForPackage(id, ver: String): String; try for s in TDirectory.GetDirectories(FFolder) do ts.Add(s); - for a := semverLabel downto semverMajor do + for a := semverLabel downto allowed do begin for s in ts do begin @@ -1016,8 +1016,10 @@ function TFHIRPackageManager.PathForPackage(id, ver: String): String; t := n.Substring(n.IndexOf('#')+1); n := n.Substring(0, n.IndexOf('#')); - if (n = id) and ((ver = '') or TSemanticVersion.matches(ver, t, a)) and FileExists(FilePath([s, 'package', 'package.json'])) then - exit(s); + if (n = id) then + if ((ver = '') or TSemanticVersion.matches(ver, t, a)) then + if FileExists(FilePath([s, 'package', 'package.json'])) then + exit(s); end; end; finally @@ -1032,14 +1034,23 @@ procedure TFHIRPackageManager.progress(sender: TObject; pct: integer); function TFHIRPackageManager.latestPackageVersion(id: String): String; var + ts : TStringList; s, n : String; begin result := ''; - for s in TDirectory.GetDirectories(FFolder) do - begin - n := ExtractFileName(s); - if n.StartsWith(id+'#') then - result := n.Substring(n.IndexOf('#')+1); + ts := TStringList.create; + try + for s in TDirectory.GetDirectories(FFolder) do + ts.add(s); + ts.sort; + for s in ts do + begin + n := ExtractFileName(s); + if n.StartsWith(id+'#') then + result := n.Substring(n.IndexOf('#')+1); + end; + finally + ts.free; end; end; @@ -1056,7 +1067,7 @@ function TFHIRPackageManager.latestPublishedVersion(id: String): String; except end; try - if list.Empty then + if list.Empty or StringArrayExists(['us.nlm.vsac'], id) then TFHIRPackageClient.LoadPackages(list, PACKAGE_SERVER_BACKUP, id); except end; @@ -1099,13 +1110,13 @@ procedure TFHIRPackageManager.remove(id, ver : String); function TFHIRPackageManager.report: String; var - b : TStringBuilder; + b : TFslStringBuilder; list : TFslList; p : TNpmPackage; ts : TStringList; s : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.AppendLine('Packages in '+Folder); b.AppendLine; diff --git a/npp/FHIR.Npp.Fetch.pas b/npp/FHIR.Npp.Fetch.pas index 1a8f8f205..2ec527392 100644 --- a/npp/FHIR.Npp.Fetch.pas +++ b/npp/FHIR.Npp.Fetch.pas @@ -78,7 +78,7 @@ TSearchEntryPanel = class (TFslObject) destructor Destroy; override; procedure AdjustPosition(top, left, width : integer); - procedure addToUrl(b : TStringBuilder); + procedure addToUrl(b : TFslStringBuilder); procedure readFromURL(pm : THTTPParameters); end; @@ -422,7 +422,7 @@ procedure TSearchEntryPanel.buildQuantityEdit; edit2.Text := ''; end; -procedure TSearchEntryPanel.addToUrl(b: TStringBuilder); +procedure TSearchEntryPanel.addToUrl(b: TFslStringBuilder); begin if edit.text <> '' then begin @@ -775,10 +775,10 @@ procedure TFetchResourceFrm.btnPasteClick(Sender: TObject); function TFetchResourceFrm.asURL: String; var - b : TStringBuilder; + b : TFslStringBuilder; se : TSearchEntryPanel; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for se in FSearchItems do se.addToUrl(b); diff --git a/npp/FHIR.Npp.Plugin.pas b/npp/FHIR.Npp.Plugin.pas index aa1ba6160..20fa5ede4 100644 --- a/npp/FHIR.Npp.Plugin.pas +++ b/npp/FHIR.Npp.Plugin.pas @@ -1800,13 +1800,13 @@ procedure TFHIRPlugin.DoNppnDwellEnd; procedure TFHIRPlugin.DoNppnDwellStart(offset: integer); var - msg : TStringBuilder; + msg : TFslStringBuilder; annot : TFHIRAnnotation; first : boolean; chars : TBytes; begin first := true; - msg := TStringBuilder.Create; + msg := TFslStringBuilder.Create; try for annot in errors do begin diff --git a/npp/FHIR.Npp.Validator.pas b/npp/FHIR.Npp.Validator.pas index ac683e080..4ac4bf711 100644 --- a/npp/FHIR.Npp.Validator.pas +++ b/npp/FHIR.Npp.Validator.pas @@ -53,7 +53,7 @@ TFHIRPluginValidatorContextR2 = class (TBaseWorkerContextR2) function findCode(list : fhir2_resources.TFhirValueSetCodeSystemConceptList; code : String; caseSensitive : boolean) : fhir2_resources.TFhirValueSetCodeSystemConcept; function validateInternally(system, version, code: String; vs: fhir2_resources.TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; protected procedure SeeResource(r : fhir2_resources.TFhirResource); override; public @@ -84,7 +84,7 @@ TFHIRPluginValidatorContextR3 = class (TBaseWorkerContextR3) function findCode(list : fhir3_resources.TFhirCodeSystemConceptList; code : String; caseSensitive : boolean) : fhir3_resources.TFhirCodeSystemConcept; function validateInternally(system, version, code: String; vs: fhir3_resources.TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; protected procedure SeeResource(r : fhir3_resources.TFhirResource); override; public @@ -115,7 +115,7 @@ TFHIRPluginValidatorContextR4 = class (TBaseWorkerContextR4) function findCode(list : fhir4_resources.TFhirCodeSystemConceptList; code : String; caseSensitive : boolean) : fhir4_resources.TFhirCodeSystemConcept; function validateInternally(system, version, code: String; vs: fhir4_resources.TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; protected procedure SeeResource(r : fhir4_resources.TFhirResource); override; public @@ -180,7 +180,7 @@ destructor TFHIRPluginValidatorContextR2.Destroy; inherited; end; -function TFHIRPluginValidatorContextR2.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TFHIRPluginValidatorContextR2.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : fhir2_resources.TFHIRValueSet; begin @@ -379,14 +379,14 @@ function TFHIRPluginValidatorContextR2.validateInternally(system, version, code: vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, doGetVs, doGetCs, nil, ''); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try validator.prepare(vsw, params); p := validator.check(system, version, code, false); @@ -472,7 +472,7 @@ destructor TFHIRPluginValidatorContextR3.Destroy; inherited; end; -function TFHIRPluginValidatorContextR3.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TFHIRPluginValidatorContextR3.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : fhir3_resources.TFHIRCodeSystem; begin @@ -672,14 +672,14 @@ function TFHIRPluginValidatorContextR3.validateInternally(system, version, code: vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, doGetVs, doGetCs, nil, ''); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try validator.prepare(vsw, params); p := validator.check(system, version, code, false); @@ -765,7 +765,7 @@ destructor TFHIRPluginValidatorContextR4.Destroy; inherited; end; -function TFHIRPluginValidatorContextR4.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TFHIRPluginValidatorContextR4.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : fhir4_resources.TFHIRCodeSystem; begin @@ -965,14 +965,14 @@ function TFHIRPluginValidatorContextR4.validateInternally(system, version, code: vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, doGetVs, doGetCs, nil, ''); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try validator.prepare(vsw, params); p := validator.check(system, version, code, false); diff --git a/npp/PathDialogForms.pas b/npp/PathDialogForms.pas index db8135af7..40c0795ce 100644 --- a/npp/PathDialogForms.pas +++ b/npp/PathDialogForms.pas @@ -67,14 +67,14 @@ implementation function summary(types : TArray) : String; var s : String; - b : TStringBuilder; + b : TFslStringBuilder; f : boolean; begin if Length(types) = 0 then exit('?? unknown'); f := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for s in types do begin diff --git a/packages/fhir.lpk b/packages/fhir.lpk index bc3399ebd..b9646a766 100644 --- a/packages/fhir.lpk +++ b/packages/fhir.lpk @@ -363,6 +363,10 @@ + + + + diff --git a/packages/fhir.pas b/packages/fhir.pas index e8d0a812f..63684b97d 100644 --- a/packages/fhir.pas +++ b/packages/fhir.pas @@ -28,7 +28,7 @@ interface v2_protocol, dicom_dictionary, dicom_jpegls, dicom_objects, dicom_parser, dicom_writer, ftx_lang, fhir_healthcard, fhir_context, fhir_icao, fhir_qrcode, qrcodegen, fhir_colour_utils, fhir_package_upload, - fhir_tools_settings, fhir_extensions, LazarusPackageIntf; + fhir_tools_settings, fhir_extensions, fhir_tx, LazarusPackageIntf; implementation @@ -38,4 +38,4 @@ procedure Register; initialization RegisterPackage('fhir', @Register); - end. \ No newline at end of file +end. diff --git a/packages/fhir4.pas b/packages/fhir4.pas index 228313275..948c26cc6 100644 --- a/packages/fhir4.pas +++ b/packages/fhir4.pas @@ -28,4 +28,4 @@ procedure Register; initialization RegisterPackage('fhir4', @Register); -end. \ No newline at end of file +end. diff --git a/packages/fhir_fdb.pas b/packages/fhir_fdb.pas index d9665e95a..76f30f7bb 100644 --- a/packages/fhir_fdb.pas +++ b/packages/fhir_fdb.pas @@ -21,4 +21,4 @@ procedure Register; initialization RegisterPackage('fhir_fdb', @Register); -end. \ No newline at end of file +end. diff --git a/packages/fhir_fsl.lpk b/packages/fhir_fsl.lpk index 589fb8c84..c13416328 100644 --- a/packages/fhir_fsl.lpk +++ b/packages/fhir_fsl.lpk @@ -148,6 +148,10 @@ + + + + diff --git a/packages/fhir_fsl.pas b/packages/fhir_fsl.pas index db0e3be27..d89c056cc 100644 --- a/packages/fhir_fsl.pas +++ b/packages/fhir_fsl.pas @@ -12,8 +12,8 @@ interface fsl_http, fsl_json, fsl_lang, fsl_logging, fsl_npm, fsl_rdf, fsl_scim, fsl_scrypt, fsl_service, fsl_service_win, fsl_shell, fsl_stream, fsl_threads, fsl_turtle, fsl_utilities, fsl_xml, fsl_ucum, fsl_htmlgen, - fsl_diff, fsl_unicode, fsl_versions, fsl_i18n, fsl_fpc_memory, fsl_regex, fsl_gzip, - LazarusPackageIntf; + fsl_diff, fsl_unicode, fsl_versions, fsl_i18n, fsl_fpc_memory, fsl_regex, + fsl_gzip, fsl_cpu, LazarusPackageIntf; implementation diff --git a/server/FHIRServer.dpr b/server/FHIRServer.dpr index ea13e5df3..a048f2da0 100644 --- a/server/FHIRServer.dpr +++ b/server/FHIRServer.dpr @@ -485,7 +485,6 @@ uses operations_r5 in 'operations_r5.pas', package_spider in 'package_spider.pas', qrcodegen in '..\dependencies\qrcodegen\qrcodegen.pas', - remote_config in 'remote_config.pas', reverse_client in 'reverse_client.pas', scim_search in 'scim_search.pas', scim_server in 'scim_server.pas', @@ -565,10 +564,17 @@ uses fsl_i18n in '..\library\fsl\fsl_i18n.pas', fhir_extensions in '..\library\fhir\fhir_extensions.pas', fsl_web_init in '..\library\web\fsl_web_init.pas', - fsl_regex in '..\library\fsl\fsl_regex.pas'; + fsl_regex in '..\library\fsl\fsl_regex.pas', + fsl_gzip in '..\library\fsl\fsl_gzip.pas', + tx_cpt in 'tx\tx_cpt.pas', + tx_omop in 'tx\tx_omop.pas', + fhir4_ips in '..\library\fhir4\fhir4_ips.pas', + fdb_fts in '..\library\fdb\fdb_fts.pas', + tests_cpt in 'tests\tests_cpt.pas', + fsl_cpu in '..\library\fsl\fsl_cpu.pas'; begin - ExecuteFhirServer; + ExecuteFhirServer(TCommandLineParameters.Create); end. diff --git a/server/admin/console_ep_edit.pas b/server/admin/console_ep_edit.pas index 2d7e26278..163447915 100644 --- a/server/admin/console_ep_edit.pas +++ b/server/admin/console_ep_edit.pas @@ -305,7 +305,7 @@ procedure TEditEPForm.btnDBTestClick(Sender: TObject); begin update; try - db := connectToDatabase(EP); + db := connectToDatabase(EP, true); try db.checkConnection; finally diff --git a/server/admin/console_managers.pas b/server/admin/console_managers.pas index 0d7c5213c..6b50b2833 100644 --- a/server/admin/console_managers.pas +++ b/server/admin/console_managers.pas @@ -269,7 +269,7 @@ procedure TTXStatusChecker.execute(request: TBackgroundTaskRequestPackage; respo else begin try - db := connectToDatabase(item); + db := connectToDatabase(item, true); try conn := db.GetConnection('check'); try @@ -695,7 +695,7 @@ procedure TTXManager.importNDC(item: TFHIRServerConfigSection); if dlg.execute then begin Settings.writeString('ndc', 'source', dlg.Filename); - db := connectToDatabase(item); + db := connectToDatabase(item, false); try conn := db.GetConnection('check'); try @@ -737,7 +737,7 @@ procedure TTXManager.importRxNorm(item: TFHIRServerConfigSection); if dlg.execute then begin Settings.writeString('rxnorm', 'source', dlg.Filename); - db := connectToDatabase(item); + db := connectToDatabase(item, false); try conn := db.GetConnection('check'); try diff --git a/server/admin/console_tx_edit.pas b/server/admin/console_tx_edit.pas index 8d2a74450..6238e10e5 100644 --- a/server/admin/console_tx_edit.pas +++ b/server/admin/console_tx_edit.pas @@ -180,7 +180,7 @@ procedure TEditTxForm.btnDBTestClick(Sender: TObject); begin update; try - db := connectToDatabase(tx); + db := connectToDatabase(tx, true); try db.checkConnection; finally diff --git a/server/admin/install_form.pas b/server/admin/install_form.pas index eaf6cca2e..f2fbc6928 100644 --- a/server/admin/install_form.pas +++ b/server/admin/install_form.pas @@ -121,7 +121,7 @@ function InstallEndPoint(owner : TComponent; cfg : TFHIRServerConfigFile; epInfo cursor := Screen.Cursor; try Screen.Cursor := crHourGlass; - db := connectToDatabase(epInfo); + db := connectToDatabase(epInfo, false); try conn := db.GetConnection('install'); try diff --git a/server/admin/install_log.pas b/server/admin/install_log.pas index ac107eedd..3e1b758f6 100644 --- a/server/admin/install_log.pas +++ b/server/admin/install_log.pas @@ -165,7 +165,7 @@ procedure TInstallProgressForm.addToLog(s: String); procedure TInstallerListener.log(const s: String); begin - FThread.Flock.Lock; + FThread.Flock.Lock('installer.listener'); try FThread.FIncoming.add(s); finally @@ -191,7 +191,7 @@ destructor TInstallerThread.Destroy; procedure TInstallerThread.getLog(ts: TStringList; var status : String); begin - FLock.lock; + FLock.lock('installer.log'); try ts.Assign(FIncoming); FIncoming.Clear; diff --git a/server/analytics.pas b/server/analytics.pas index 60a2d968c..356639e79 100644 --- a/server/analytics.pas +++ b/server/analytics.pas @@ -157,7 +157,7 @@ procedure TGoogleAnalyticsProvider.recordEvent(resourceName, operationName, user event.userId := userId; event.ip := ip; event.userAgent := userAgent; - FLock.Lock; + FLock.Lock('recordEvent'); try FEvents.Add(event.Link); finally @@ -177,29 +177,36 @@ function TGoogleAnalyticsProvider.filter(sender : TObject; item : TGoogleAnalyat procedure TGoogleAnalyticsProvider.commit; var - b : TStringBuilder; + b : TFslStringBuilder; event : TGoogleAnalyaticsEventData; begin if FServerId = '' then exit; FWorking := true; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try - FLock.Lock; + FLock.Lock('commit'); try inc(FCycle); for event in FEvents do begin event.cycle := FCycle; b.append('v=1'); - b.append('&tid=').append(FServerId); + b.append('&tid='); + b.append(FServerId); b.append('&t=event'); - b.append('&an=').append('http://test.fhir.org'); - b.append('&ec=').append(EncodeMIME(event.ResourceName)); - b.append('&ea=').append(event.operationName); - b.append('&cid=').append(event.operationName); - b.append('&uip=').append(EncodeMIME(event.ip)); - b.append('&ua=').append(EncodeMIME(event.userAgent)); + b.append('&an='); + b.append('http://test.fhir.org'); + b.append('&ec='); + b.append(EncodeMIME(event.ResourceName)); + b.append('&ea='); + b.append(event.operationName); + b.append('&cid='); + b.append(event.operationName); + b.append('&uip='); + b.append(EncodeMIME(event.ip)); + b.append('&ua='); + b.append(EncodeMIME(event.userAgent)); b.append(#10); end; finally @@ -208,7 +215,7 @@ procedure TGoogleAnalyticsProvider.commit; if b.ToString = '' then exit; post(b.ToString); - FLock.Lock; + FLock.Lock('commit2'); try {$IFDEF FPC} FEvents.removeAll(filter); diff --git a/server/auth_manager.pas b/server/auth_manager.pas index 1be7e42ea..74c97a8a0 100644 --- a/server/auth_manager.pas +++ b/server/auth_manager.pas @@ -251,7 +251,7 @@ function TAuth2Server.MakeLoginToken(path : String; provider : TFHIRAuthProvider s : String; begin t := now; - FLock.Lock; + FLock.Lock('MakeLoginToken'); try login := TFhirLoginToken.Create; try @@ -291,7 +291,7 @@ function TAuth2Server.nonceIsUnique(nonce: String): boolean; var i : integer; begin - FLock.Lock; + FLock.Lock('nonceIsUnique'); try result := not FNonceList.Find(nonce, i); if result then @@ -362,7 +362,7 @@ procedure TAuth2Server.HandleAuth(AContext: TIdContext; request: TIdHTTPRequestI aud : String; id : String; message : String; - b : TStringBuilder; + b : TFslStringBuilder; ok : boolean; variables : TFslMap; client : TRegisteredClientInformation; @@ -386,7 +386,7 @@ procedure TAuth2Server.HandleAuth(AContext: TIdContext; request: TIdHTTPRequestI id := newguidid; ServerContext.Storage.recordOAuthLogin(id, client_id, scope, redirect_uri, state, params['launch']); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try ok := true; variables := TFslMap.Create('scim.vars'); @@ -1494,7 +1494,7 @@ function TAuth2Server.CheckLoginToken(state: string; var original : String; var var token : TFhirLoginToken; begin - FLock.Lock; + FLock.Lock('CheckLoginToken'); try result := FLoginTokens.TryGetValue(state, token); if result then @@ -1517,14 +1517,14 @@ function TFhirLoginToken.Link: TFhirLoginToken; function TAuth2Server.GetPatientListAsOptions(launch : String): String; var - b : TStringBuilder; + b : TFslStringBuilder; dict : TFslStringDictionary; s : String; begin dict := TFslStringDictionary.Create; try FOnGetPatients(dict); - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append('
          ') + begin + FBuilder.append('') + end else - FBuilder.Append('') + FBuilder.append('') end; procedure THtmlPublisher.StartTableRow; begin - FBuilder.Append('
          '+FVersion+''+statedDate+' Zip
          '#13#10); + html.Append(''#13#10); + for name in json.properties.SortedKeys do + begin + list := json.arr[name]; + html.Append(''#13#10); + end; + html.Append('
          Source PackageBroken Dependencies
          '+name+''); + for i := 0 to list.Count - 1 do + begin + if i > 0 then + html.append(', '); + html.append(list.Value[i]); + end; + html.append('
          '#13#10); + vars := TFslMap.Create('vars'); + try + vars.add('prefix', TFHIRObjectText.Create(AbsoluteUrl(false))); + vars.add('ver', TFHIRObjectText.Create('4.0.1')); + vars.add('filter', TFHIRObjectText.Create(FormatTextToHTML(filter))); + vars.add('table', TFHIRObjectText.Create(html.ToString)); + vars.add('status', TFHIRObjectText.Create(status)); + returnFile(request, response, nil, request.Document, 'packages-broken.html', false, vars); + finally + vars.free; + end; + finally + html.free; + end; + end + else + begin + json.str['date'] := FormatDateTime('c', now); + response.ContentType := 'application/json'; + response.ContentText := TJsonWriterDirect.writeObjectStr(json, true); + end; + finally + json.free; + end; + conn.terminate; + conn.release; + except + on e : Exception do + begin + conn.error(e); + raise; + end; + end; +end; + function sel(this, that : String) : string; begin if (this = that) then @@ -914,7 +1121,9 @@ function sel(this, that : String) : string; result := ''; end; -procedure TFHIRPackageWebServer.serveSearch(name, canonicalPkg, canonicalURL, FHIRVersion, dependency, sort : String; secure : boolean; request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo); +procedure TFHIRPackageWebServer.serveSearch(name, canonicalPkg, canonicalUrl, + FHIRVersion, dependency, sort: String; secure: boolean; + request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo); var conn : TFDBConnection; json : TJsonArray; @@ -922,6 +1131,7 @@ procedure TFHIRPackageWebServer.serveSearch(name, canonicalPkg, canonicalURL, FH filter, src : String; vars : TFslMap; list : TFslList; + dt : TFslDateTime; begin conn := FDB.getConnection('Package.server.search'); try @@ -960,7 +1170,9 @@ procedure TFHIRPackageWebServer.serveSearch(name, canonicalPkg, canonicalURL, FH json.add(v); list.Add(v.Link); v['name'] := conn.ColStringByName['Id']; - v['date'] := conn.ColDateTimeExByName['PubDate'].toXML; + dt := conn.ColDateTimeExByName['PubDate']; + if (dt.year > 0) then + v['date'] := dt.toXML; v['version'] := conn.ColStringByName['Version']; v['fhirVersion'] := interpretVersion(conn.ColStringByName['FhirVersions']); v['count'] := conn.ColStringByName['DownloadCount']; @@ -1343,6 +1555,14 @@ function TFHIRPackageWebServer.doRequest(AContext: TIdContext; request: TIdHTTPR result := 'Packages updates since '+pm['lastUpdated']; end; end + else if (request.CommandType = hcGET) and (request.Document = '/packages/log') then + begin + serveLog(request, response); + end + else if (request.CommandType = hcGET) and (request.Document = '/packages/broken') then + begin + serveBroken(request, response, pm['filter']); + end else if (request.CommandType = hcGET) and (request.Document = '/packages/protect') then begin serveProtectForm(request, response, pm['id']); @@ -1400,6 +1620,13 @@ function TFHIRPackageWebServer.doRequest(AContext: TIdContext; request: TIdHTTPR end; end; +constructor TFHIRPackageWebServer.Create(code, path: String; common: TFHIRWebServerCommon); +begin + inherited Create(code, path, common); + FCrawlerLog := TJsonObject.create; + FCrawlerLog['status'] := 'No crawl has completed yet'; +end; + function TFHIRPackageWebServer.SecureRequest(AContext: TIdContext; ip : String; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; cert: TIdOpenSSLX509; id: String; tt : TTimeTracker): String; begin countRequest; diff --git a/server/endpoint_snomed.pas b/server/endpoint_snomed.pas index 32f78dce8..e3c839e1f 100644 --- a/server/endpoint_snomed.pas +++ b/server/endpoint_snomed.pas @@ -199,7 +199,9 @@ function TSnomedWebServer.doRequest(AContext: TIdContext; request: TIdHTTPReques ss, t : TSnomedServices; pm : THTTPParameters; buf : TFslNameBuffer; + start : UInt64; begin + start := GetTickCount64; if request.Document.StartsWith(PathWithSlash+'tool/') then // FHIR build process support begin parts := request.Document.Split(['/']); @@ -216,7 +218,6 @@ function TSnomedWebServer.doRequest(AContext: TIdContext; request: TIdHTTPReques else begin ss.RecordUse; - ss.checkLoaded; result := 'Snomed Tool: '+parts[length(parts)-1]; response.ContentType := 'text/xml'; try @@ -265,7 +266,10 @@ function TSnomedWebServer.doRequest(AContext: TIdContext; request: TIdHTTPReques ss := nil; for t in FTx.Snomed do if t.EditionId+'-'+t.VersionDate = parts[2] then + begin ss := t; + break; + end; if ss = nil then begin returnContent(request, response, request.Document, secure, 'SNOMED CT Browser', 'Document '+request.Document+' not found'); @@ -274,13 +278,12 @@ function TSnomedWebServer.doRequest(AContext: TIdContext; request: TIdHTTPReques else begin ss.RecordUse; - ss.checkLoaded; code := request.UnparsedParams; result := 'Snomed Doco ('+ss.EditionName+'): '+code; try - html := THtmlPublisher.Create(); - pub := TSnomedPublisher.Create(ss, AbsoluteURL(secure)); + html := THtmlPublisher.Create; + pub := TSnomedPublisher.Create(ss, AbsoluteURL(secure), start); try html.Version := SERVER_FULL_VERSION; html.BaseURL := PathWithSlash+ss.EditionId+'-'+ss.VersionDate+'/'; @@ -415,17 +418,18 @@ function TSnomedWebServer.chooseSnomedRelease: String; html.AddTableCell('Date'); html.AddTableCell('UseCount'); html.AddTableCell('Last Used'); - html.AddTableCell('Load Status'); html.EndTableRow; for ss in FTx.Snomed do begin html.StartTableRow; - html.AddTableCellURL(ss.EditionName, '/snomed/'+ss.editionId+'-'+ss.VersionDate); + if (ss = FTx.DefSnomed) then + html.AddTableCellURL(ss.EditionName+' (default)', '/snomed/'+ss.editionId+'-'+ss.VersionDate) + else + html.AddTableCellURL(ss.EditionName, '/snomed/'+ss.editionId+'-'+ss.VersionDate); html.AddTableCell(ss.VersionUri); html.AddTableCell(ss.VersionDate); html.AddTableCell(inttostr(ss.UseCount)); html.AddTableCell(ss.LastUseStatus); - html.AddTableCell(ss.LoadStatus); html.EndTableRow; end; html.EndTable; diff --git a/server/endpoint_storage.pas b/server/endpoint_storage.pas index 634061561..6ea060582 100644 --- a/server/endpoint_storage.pas +++ b/server/endpoint_storage.pas @@ -151,6 +151,10 @@ TStorageWebEndpoint = class (TFhirWebServerEndpoint) FAdaptors: TFslMap; FThreads : TFslList; + {$IFDEF DEV_FEATURES} + procedure processRequiredFeatures(request : TFHIRRequest; header: String); + procedure checkRequiredFeatures(op: TFHIROperationEngine; request : TFHIRRequest; response : TFHIRResponse); + {$ENDIF} procedure SetTerminologyWebServer(const Value: TTerminologyWebServer); Procedure HandleOWinToken(AContext: TIdContext; secure: boolean; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo); function HandleRequest(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; ssl, secure: boolean; path: String; logId : String; esession: TFHIRSession; cert: TIdOpenSSLX509; tt : TTimeTracker) : String; @@ -166,7 +170,7 @@ TStorageWebEndpoint = class (TFhirWebServerEndpoint) sCookie, provenance, sBearer: String; oPostStream: TStream; oResponse: TFHIRResponse; var aFormat: TFHIRFormat; var redirect: boolean; form: TMimeMessage; bAuth, secure: boolean; out relativeReferenceAdjustment: integer; var style : TFHIROutputStyle; Session: TFHIRSession; cert: TIdOpenSSLX509; tt : TTimeTracker): TFHIRRequest; Procedure ProcessOutput(start : UInt64; oRequest: TFHIRRequest; oResponse: TFHIRResponse; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; relativeReferenceAdjustment: integer; style : TFHIROutputStyle; gzip, cache: boolean; summary : String); - procedure SendError(response: TIdHTTPResponseInfo; logid : string; status: word; format: TFHIRFormat; langList : THTTPLanguageList; message, url: String; e: exception; Session: TFHIRSession; addLogins: boolean; path: String; relativeReferenceAdjustment: integer; code: TFHIRIssueType); + procedure SendError(response: TIdHTTPResponseInfo; logid : string; status: word; format: TFHIRFormat; langList : THTTPLanguageList; message, url: String; e: exception; Session: TFHIRSession; addLogins: boolean; path: String; relativeReferenceAdjustment: integer; code: TFHIRIssueType; diagnostics : String = ''); function processProvenanceHeader(header : String; langList : THTTPLanguageList): TFhirProvenanceW; function EncodeVersionsJson(r: TFHIRResourceV): TBytes; function EncodeVersionsXml(r: TFHIRResourceV): TBytes; @@ -657,7 +661,7 @@ procedure TAsyncTaskThread.Execute; status(atsError, e.Message); end; end; - FServer.Common.Lock.Lock; + FServer.Common.Lock.Lock('AsyncTaskThread.Execute'); try FServer.FThreads.Remove(self); finally @@ -752,7 +756,7 @@ procedure TStorageWebEndpoint.StopAsyncTasks; i : integer; begin done := false; - Common.Lock.Lock; + Common.Lock.Lock('StopAsyncTasks1'); try for task in FThreads do begin @@ -769,7 +773,7 @@ procedure TStorageWebEndpoint.StopAsyncTasks; sleep(100); inc(i); done := true; - Common.Lock.Lock; + Common.Lock.Lock('StopAsyncTasks2'); try for task in FThreads do done := false; @@ -779,7 +783,7 @@ procedure TStorageWebEndpoint.StopAsyncTasks; until done or (i = 10); if not done then begin - Common.Lock.Lock; + Common.Lock.Lock('StopAsyncTasks3'); try for task in FThreads do begin @@ -800,6 +804,39 @@ procedure TStorageWebEndpoint.SetAuthServer(const Value: TAuth2Server); FAuthServer := Value; end; +{$IFDEF DEV_FEATURES} +procedure TStorageWebEndpoint.processRequiredFeatures(request: TFHIRRequest; header: String); +var + s : String; +begin + if (header <> '') then + for s in header.Split([';']) do + request.requiredFeatures.Add(TFhirFeatureQueryItem.fromParam(FContext.Factory, s.trim)); +end; + +procedure TStorageWebEndpoint.checkRequiredFeatures(op: TFHIROperationEngine; request: TFHIRRequest; response : TFHIRResponse); +var + feature : TFhirFeatureQueryItem; + answer : TFhirFeatureQueryAnswer; +begin + for feature in request.requiredFeatures do + begin + answer := TFhirFeatureQueryAnswer.create; + try + answer.Feature := feature.Feature; + answer.Context := feature.Context; + answer.Values.addAll(feature.Values); + answer.ProcessingStatus := fqpsUnknownFeature; + op.processFeature(feature, answer); + if (answer.Answer <> nbTrue) then + raise ERestfulException.create('TStorageWebEndpoint.checkRequiredFeatures', 501, itNotSupported, 'The feature '''+feature.toParam+''' is not supported', request.langList); + finally + answer.free; + end; + end; +end; +{$ENDIF} + procedure TStorageWebEndpoint.SetTerminologyWebServer(const Value: TTerminologyWebServer); begin FTerminologyWebServer.free; @@ -1043,7 +1080,7 @@ function TStorageWebEndpoint.SecureRequest(AContext: TIdContext; ip: String; else if request.Document = PathNoSlash then begin result := 'Home Page'; - ReturnProcessedFile(request, response, Session, '/hompage.html', Common.SourceProvider.AltFile('/homepage.html', PathNoSlash), true) + ReturnProcessedFile(request, response, Session, '/homepage.html', Common.SourceProvider.AltFile('/homepage.html', PathNoSlash), true) end else begin @@ -1286,6 +1323,9 @@ function TStorageWebEndpoint.HandleRequest(AContext: TIdContext; request: TIdHTT request.RawHeaders.Values['X-Provenance'], sBearer, oStream, oResponse, aFormat, redirect, form, secure, ssl, relativeReferenceAdjustment, style, esession, cert, tt); try + {$IFDEF DEV_FEATURES} + processRequiredFeatures(oRequest, request.RawHeaders.Values['Required-Feature']); + {$ENDIF} oRequest.externalRequestId := request.RawHeaders.Values['X-Request-Id']; oRequest.internalRequestId := logId; if TFHIRWebServerClientInfo(AContext.Data).Session = nil then @@ -1419,11 +1459,17 @@ function TStorageWebEndpoint.HandleRequest(AContext: TIdContext; request: TIdHTT begin if oResponse.HTTPCode < 300 then begin - result := result + ' (err: Abort)'; + result := result + ' (msg: Abort)'; recordStack(e); raise; end; end; + on e : EFslException do + begin + result := result + ' (msg: '+e.message+')'; + recordStack(e); + raise; + end; on e: exception do begin result := result + ' (err: '+e.message+')'; @@ -1505,7 +1551,7 @@ function TStorageWebEndpoint.HandleRequest(AContext: TIdContext; request: TIdHTT end; on e: ETerminologySetup do begin - result := result + ' (err: '+e.message+')'; + result := result + ' (msg: '+e.message+')'; if noErrCode then SendError(response, logId, 200, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, itNotSupported) else @@ -1514,21 +1560,29 @@ function TStorageWebEndpoint.HandleRequest(AContext: TIdContext; request: TIdHTT end; on e: ETooCostly do begin - result := result + ' (err: Too-Costly)'; + result := result + ' (msg: Too-Costly)'; if noErrCode then - SendError(response, logId, 200, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, itTooCostly) + SendError(response, logId, 200, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, itTooCostly, e.Diagnostics) else SendError(response, logId, HTTP_ERR_BUSINESS_RULES_FAILED, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, - itTooCostly); + itTooCostly, e.Diagnostics); end; on e: ERestfulException do begin - result := result + ' (err: '+e.message+')'; + result := result + ' (msg: '+e.message+')'; if noErrCode then SendError(response, logId, 200, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, e.code) else SendError(response, logId, e.status, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, e.code); end; + on e: EFslException do + begin + result := result + ' (msg: '+e.message+')'; + if noErrCode then + SendError(response, logId, 200, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, itNull) + else + SendError(response, logId, HTTP_ERR_INTERNAL, aFormat, langList, e.message, sPath, e, Session, false, path, relativeReferenceAdjustment, itNull); + end; on e: exception do begin result := result + ' (err: '+e.message+')'; @@ -1698,6 +1752,9 @@ function TStorageWebEndpoint.ProcessRequest(Context: TOperationContext; request: try op.OnPopulateConformance := PopulateConformance; op.OnCreateBuilder := doGetBundleBuilder; + {$IFDEF DEV_FEATURES} + checkRequiredFeatures(op, request, response); + {$ENDIF} result := op.Execute(Context, request, response, tt); self.Context.Storage.yield(op, nil); except @@ -2184,7 +2241,7 @@ procedure TStorageWebEndpoint.ProcessOutput(start: UInt64; end; procedure TStorageWebEndpoint.SendError(response: TIdHTTPResponseInfo; logid: string; status: word; format: TFHIRFormat; langList : THTTPLanguageList; - message, url: String; e: exception; Session: TFHIRSession; addLogins: boolean; path: String; relativeReferenceAdjustment: integer; code: TFHIRIssueType); + message, url: String; e: exception; Session: TFHIRSession; addLogins: boolean; path: String; relativeReferenceAdjustment: integer; code: TFHIRIssueType; diagnostics : String); var issue: TFhirOperationOutcomeW; oComp: TFHIRComposer; @@ -2440,12 +2497,12 @@ function TStorageWebEndpoint.getReferencesByType(t: String): String; var bundle : TFHIRBundleW; entry : TFhirBundleEntryW; - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin bundle := nil; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for s in t.trim.Split(['|']) do begin @@ -2746,7 +2803,7 @@ function TStorageWebEndpoint.ProcessAsyncRequest(Context: TOperationContext; req if not (request.CommandType in [fcmdSearch, fcmdHistoryInstance, fcmdHistoryType, fcmdHistorySystem, fcmdTransaction, fcmdBatch, fcmdUpload, fcmdOperation]) then raise EFHIRException.CreateLang('NO_ASYNC', request.LangList); thread := TAsyncTaskThread.Create(self); - Common.Lock.Lock; + Common.Lock.Lock('ProcessAsyncRequest'); try FThreads.add(thread); finally diff --git a/server/endpoint_txregistry.pas b/server/endpoint_txregistry.pas index 40165cb0f..604e3ca0a 100644 --- a/server/endpoint_txregistry.pas +++ b/server/endpoint_txregistry.pas @@ -43,6 +43,9 @@ interface tx_manager, time_tracker, kernel_thread, server_stats, web_event, web_base, endpoint, session; +const + SCAN_FREQUENCY = ((1/24) / 4); // 15 min + type TTxRegistryServerEndPoint = class; @@ -78,28 +81,15 @@ TFHIRTxRegistryWebServer = class (TFhirWebServerEndpoint) procedure populate(json: TJsonObject; srvr: TServerInformation; ver: TServerVersionInformation); function status : String; - //function getVersion(v : String) : String; - //function interpretVersion(v : String) : String; - // - //function genTable(url : String; list: TFslList; sort : TMatchTableSort; rev, inSearch, secure, packageLevel: boolean): String; - // - //function serveCreatePackage(request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo) : String; - // - //procedure servePage(fn : String; request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo; secure : boolean); - //procedure serveDownload(id, version : String; response : TIdHTTPResponseInfo); - //procedure serveVersions(id, sort : String; secure : boolean; request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo); - //procedure serveSearch(name, canonicalPkg, canonicalUrl, FHIRVersion, dependency, sort : String; secure : boolean; request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo); - //procedure serveUpdates(date : TFslDateTime; secure : boolean; response : TIdHTTPResponseInfo); - //procedure serveProtectForm(request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo; id : String); - //procedure serveUpload(request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo; secure : boolean; id : String); - //procedure processProtectForm(request : TIdHTTPRequestInfo; response : TIdHTTPResponseInfo; id, pword : String); procedure SetScanning(const Value: boolean); procedure sortJson(json : TJsonObject; sort : String); function renderJson(json : TJsonObject; path, reg, srvr, ver : String) : String; procedure sendHtml(request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; secure : boolean; json : TJsonObject; reg, srvr, ver, tx : String); function listRows(reg, srvr, ver, tx : String) : TJsonObject; - function resolve(version, tx : String) : TJsonObject; + function resolveCS(version, cs, usage : String; var matches : String) : TJsonObject; + function resolveVS(version, vs, usage : String; var matches : String) : TJsonObject; + function renderInfo : String; function doRequest(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; id: String; secure: boolean): String; public @@ -107,7 +97,7 @@ TFHIRTxRegistryWebServer = class (TFhirWebServerEndpoint) function link : TFHIRTxRegistryWebServer; overload; function description : String; override; - property NextScan : TDateTIme read FNextScan write FNextScan; + property NextScan : TDateTime read FNextScan write FNextScan; property scanning : boolean read FScanning write SetScanning; function PlainRequest(AContext: TIdContext; ip : String; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; id : String; tt : TTimeTracker) : String; override; @@ -157,7 +147,7 @@ constructor TTxRegistryServerEndPoint.Create(config : TFHIRServerConfigSection; s : String; begin inherited Create(config, settings, nil, common, nil, i18n); - s := config.clone['folder'].value; + s := config['folder'].value; FAddress := s; if (FAddress = '') then FAddress := MASTER_URL; @@ -294,12 +284,12 @@ procedure TTxRegistryUpdaterThread.Execute; finally FEndPoint.FTxRegistryServer.scanning := false; end; - FEndPoint.FTxRegistryServer.NextScan := now + 1/24; + FEndPoint.FTxRegistryServer.NextScan := SCAN_FREQUENCY; // every 15 minutes end; procedure TTxRegistryUpdaterThread.Initialise; begin - TimePeriod := 60 * 60 * 1000; + TimePeriod := 5 * 60 * 1000; end; procedure TTxRegistryUpdaterThread.doSendEmail(dest, subj, body : String); @@ -311,19 +301,31 @@ procedure TTxRegistryUpdaterThread.doSendEmail(dest, subj, body : String); procedure TTxRegistryUpdaterThread.RunUpdater; var upd : TTxRegistryScanner; - info : TServerRegistries; + new, existing : TServerRegistries; begin upd := TTxRegistryScanner.Create(FZulip.link); try upd.address := FEndPoint.FAddress; upd.OnSendEmail := doSendEmail; try - info := TServerRegistries.Create; + existing := FEndPoint.FTxRegistryServer.FInfo; + new := TServerRegistries.Create; try - upd.update(FEndPoint.FTxRegistryServer.code, info); - FEndPoint.FTxRegistryServer.FInfo.update(info); + existing.Lock('start'); + try + existing.Outcome := 'Processing Now'; + finally + existing.Unlock; + end; + upd.update(FEndPoint.FTxRegistryServer.code, new); + existing.Lock('merge'); + try + existing.update(new); + finally + existing.Unlock; + end; finally - info.free; + new.free; end; if (TFslDateTime.makeToday.DateTime <> FLastEmail) then begin @@ -433,12 +435,14 @@ function TFHIRTxRegistryWebServer.renderJson(json: TJsonObject; path, reg, srvr, b.append('Last OK '+DurationToSecondsString(row.int['last-success'])+' ago'#13#10); b.append(''+inttostr(row.int['systems'])+' systems'#13#10); b.append(''); - arr := row.forceArr['authoritative']; - for i := 0 to arr.Count - 1 do - begin - if i > 0 then b.append(', '); - b.append(''+FormatTextToHTML(arr.Value[i])+''); - end; + if (row.bool['is-authoritative']) then + b.append('true'); + //arr := row.forceArr['authoritative']; + //for i := 0 to arr.Count - 1 do + //begin + // if i > 0 then b.append(', '); + // b.append(''+FormatTextToHTML(arr.Value[i])+''); + //end; b.append(''#13#10); b.append(''); if (row.bool[CODES_TServerSecurity[ssOpen]]) then @@ -489,6 +493,8 @@ procedure TFHIRTxRegistryWebServer.sendHtml(request: TIdHTTPRequestInfo; respons vars.add('fhirVersion', TFHIRObjectText.Create(ver)); vars.add('url', TFHIRObjectText.Create(tx)); vars.add('status', TFHIRObjectText.Create(status)); + vars.add('tx-reg-doco', TFHIRObjectText.Create(FInfo.doco)); + vars.add('tx-reg-view', TFHIRObjectText.Create(renderInfo)); returnFile(request, response, nil, request.Document, 'tx-registry.html', false, vars); finally vars.free; @@ -532,39 +538,168 @@ procedure TFHIRTxRegistryWebServer.populate(json : TJsonObject; srvr : TServerIn if (ssCert in ver.Security) then json.bool[CODES_TServerSecurity[ssCert]] := true; end; -function TFHIRTxRegistryWebServer.resolve(version, tx: String): TJsonObject; +function TFHIRTxRegistryWebServer.resolveCS(version, cs, usage: String; var matches : String): TJsonObject; var reg : TServerRegistry; srvr : TServerInformation; ver : TServerVersionInformation; + added : boolean; begin if (version = '') then raise EFslException.Create('A version is required'); - if (tx = '') then + if (cs = '') then raise EFslException.Create('A code system url is required'); + matches := ''; result := TJsonObject.Create; try - for reg in FInfo.Registries do - for srvr in reg.Servers do - begin - if (srvr.isAuth(tx)) then - begin - for ver in srvr.Versions do - if TSemanticVersion.matches(version, ver.version, semverAuto) and (ver.Terminologies.IndexOf(tx) > -1) then - populate(result.forceArr['authoritative'].addObject, srvr, ver); - end - else + result.str['formatVersion'] := '1'; + result.str['registry-url'] := FInfo.address; + FInfo.Lock('search'); + try + for reg in FInfo.Registries do + for srvr in reg.Servers do begin - for ver in srvr.Versions do - if TSemanticVersion.matches(version, ver.version, semverAuto) and (ver.Terminologies.IndexOf(tx) > -1) then - populate(result.forceArr['candidates'].addObject, srvr, ver); + added := false; + if (srvr.UsageList.Count = 0) or (srvr.UsageList.IndexOf(usage) > -1) then + begin + if (srvr.isAuthCS(cs)) then + begin + for ver in srvr.Versions do + begin + if TSemanticVersion.matches(version, ver.version, semverAuto) then + if TServerRegistryUtilities.hasMatchingCodeSystem(cs, ver.CodeSystems, false) then + begin + populate(result.forceArr['authoritative'].addObject, srvr, ver); + added := true; + end; + end; + end + else + begin + for ver in srvr.Versions do + if TSemanticVersion.matches(version, ver.version, semverAuto) then + if TServerRegistryUtilities.hasMatchingCodeSystem(cs, ver.CodeSystems, false) then + begin + populate(result.forceArr['candidates'].addObject, srvr, ver); + added := true; + end; + end; + if (added) then + CommaAdd(matches, srvr.Code); + end; end; + finally + FInfo.Unlock; end; result.link; finally result.free; end; + if matches = '' then + matches := '--'; +end; + +function TFHIRTxRegistryWebServer.resolveVS(version, vs, usage: String; + var matches: String): TJsonObject; +var + reg : TServerRegistry; + srvr : TServerInformation; + ver : TServerVersionInformation; + added : boolean; +begin + if (version = '') then + raise EFslException.Create('A version is required'); + if (vs = '') then + raise EFslException.Create('A ValueSet url is required'); + + matches := ''; + result := TJsonObject.Create; + try + result.str['formatVersion'] := '1'; + result.str['registry-url'] := FInfo.address; + FInfo.Lock('search'); + try + for reg in FInfo.Registries do + for srvr in reg.Servers do + begin + added := false; + if (srvr.UsageList.Count = 0) or (srvr.UsageList.IndexOf(usage) > -1) then + begin + if (srvr.isAuthVS(vs)) then + begin + for ver in srvr.Versions do + begin + if TSemanticVersion.matches(version, ver.version, semverAuto) then + if TServerRegistryUtilities.hasMatchingValueSet(vs, ver.ValueSets, false) then + begin + populate(result.forceArr['authoritative'].addObject, srvr, ver); + added := true; + end; + end; + end + else + begin + for ver in srvr.Versions do + if TSemanticVersion.matches(version, ver.version, semverAuto) then + if TServerRegistryUtilities.hasMatchingValueSet(vs, ver.ValueSets, false) then + begin + populate(result.forceArr['candidates'].addObject, srvr, ver); + added := true; + end; + end; + if (added) then + CommaAdd(matches, srvr.Code); + end; + end; + finally + FInfo.Unlock; + end; + result.link; + finally + result.free; + end; + if matches = '' then + matches := '--'; +end; + +function TFHIRTxRegistryWebServer.renderInfo: String; +var + b : TFslStringBuilder; + r : TServerRegistry; + s : TServerInformation; + v : TServerVersionInformation; +begin + FInfo.Lock('render'); + try + b := TFslStringBuilder.create(); + try + b.Append(''); + b.append(''); + for r in FInfo.Registries do + begin + if (r.error <> '') then + b.append('') + else + b.append(''); + for s in r.Servers do + begin + if (s.AuthCSList.Count > 0) or (s.AuthVSList.Count > 0) or (s.UsageList.count > 0) then + b.append('') + else + b.append(''); + for v in s.Versions do + b.append(''); + end; + end; + b.Append('
           Registries'+FInfo.Address+' ('+FormatTextToHTML(FInfo.Outcome)+')
            '+r.Code+''+FormatTextToHTML(r.Address)+'. Error: '+FormatTextToHTML(r.Error)+'
             '+r.Code+''+FormatTextToHTML(r.Address)+'
               '+s.Code+''+FormatTextToHTML(s.Address)+'. '+s.description+'
               '+s.Code+''+FormatTextToHTML(s.Address)+'
                 v'+TSemanticVersion.getMajMin(v.Version)+''+FormatTextToHTML(v.Address)+'. Status: '+FormatTextToHTML(v.Details)+'. '+inttostr(v.CodeSystems.Count)+' CodeSystems, '+inttostr(v.ValueSets.Count)+' ValueSets
          '); + result := b.ToString; + finally + b.free; + end; + finally + FInfo.Unlock; + end; end; function TFHIRTxRegistryWebServer.status: String; @@ -644,9 +779,7 @@ function TFHIRTxRegistryWebServer.PlainRequest(AContext: TIdContext; ip : String function TFHIRTxRegistryWebServer.doRequest(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; id : String; secure : boolean) : String; var pm : THTTPParameters; - reg, srvr, ver, tx : String; - //s : TArray; - //sId : string; + reg, srvr, ver, tx, desc : String; json : TJsonObject; begin pm := THTTPParameters.Create(request.UnparsedParams); @@ -678,12 +811,16 @@ function TFHIRTxRegistryWebServer.doRequest(AContext: TIdContext; request: TIdHT end else if request.document = PathWithSlash+'resolve' then begin - result := 'Resolve '+pm.Value['version']+' server for '+pm.Value['url']; - json := resolve(pm.Value['version'], pm.Value['url']); + result := 'Resolve '+pm.Value['fhirVersion']+' server for '+pm.Value['url']+' (usage = '+pm.Value['usage']+')'; + if (pm.has('valueSet')) then + json := resolveVS(pm.Value['fhirVersion'], pm.Value['valueSet'], pm.Value['usage'], desc) + else + json := resolveCS(pm.Value['fhirVersion'], pm.Value['url'], pm.Value['usage'], desc); try response.ResponseNo := 200; response.ContentType := 'application/json'; response.ContentText := TJSONWriter.writeObjectStr(json, true); + result := result+'('+desc+')'; finally json.free; end; diff --git a/server/endpoint_txsvr.pas b/server/endpoint_txsvr.pas index 1eaa1d9d1..a652716ad 100644 --- a/server/endpoint_txsvr.pas +++ b/server/endpoint_txsvr.pas @@ -87,6 +87,9 @@ TTerminologyServerData = class (TFslObject) FValueSets : TFslMap; FNamingSystems : TFslMap; FConceptMaps : TFslMap; + FLoadingComplete : boolean; + FTotalToLoad : integer; + FLoaded : integer; procedure addCodesToIndex(cmp: TFDBFullTextSearchCompartment; vurl : String; codes: TFhirCodeSystemConceptListW); protected function sizeInBytesV(magic : integer) : cardinal; override; @@ -104,19 +107,34 @@ TTerminologyServerData = class (TFslObject) property TextIndex : TFDBFullTextSearch read FTextIndex; end; + { TTerminologyServerDataLoadThread } + + TTerminologyServerDataLoadThread = class (TFslThread) + private + FEndPoint : TTerminologyServerEndPoint; + procedure process(name : String; list : TFslMap); + public + constructor create(ep : TTerminologyServerEndPoint); + procedure execute; override; + end; + TTerminologyFhirServerStorage = class; + { TTerminologyServerOperationEngine } + TTerminologyServerOperationEngine = class (TFHIROperationEngine) private FData : TTerminologyServerData; function compareDate(base, min, max : TFslDateTime; value : String; prefix : TFHIRSearchParamPrefix) : boolean; - function matches(resource : TFhirResourceV; sp : TSearchParameter) : boolean; + function matchesNative(resource : TFHIRMetadataResourceW; sp : TSearchParameter) : boolean; + function matchesFHIRPath(resource : TFhirResourceV; sp : TSearchParameter) : boolean; function matchesObject(obj : TFhirObject; sp : TSearchParameter) : boolean; function tokenMatchesCodeableConcept(obj: TFhirObject; sp: TSearchParameter): boolean; function tokenMatchesCoding(obj: TFhirObject; sp: TSearchParameter): boolean; overload; function tokenMatchesCoding(c: TFhirCodingW; sp: TSearchParameter): boolean; overload; function tokenMatchesIdentifier(obj: TFhirObject; sp: TSearchParameter): boolean; overload; + function makeWrapper(rn : String; p : TFHIRResourceProxyV) : TFHIRMetadataResourceW; protected function context : TFHIRServerContext; procedure StartTransaction; override; @@ -245,11 +263,13 @@ TTerminologyServerWebServer = class (TStorageWebEndpoint) TTerminologyServerEndPoint = class (TStorageEndPoint) private - FStore : TTerminologyFhirServerStorage; +// FStore : TTerminologyFhirServerStorage; UTGFolder : String; FWeb : TTerminologyServerWebServer; + FLoadThread : TTerminologyServerDataLoadThread; function version : TFHIRVersion; public + FStore : TTerminologyFhirServerStorage; constructor Create(config : TFHIRServerConfigSection; settings : TFHIRServerSettings; db : TFDBManager; common : TCommonTerminologies; pcm : TFHIRPackageManager; i18n : TI18nSupport); destructor Destroy; override; function summary : String; override; @@ -267,7 +287,9 @@ TTerminologyServerEndPoint = class (TStorageEndPoint) procedure SweepCaches; override; procedure SetCacheStatus(status : boolean); override; procedure getCacheInfo(ci: TCacheInformation); override; - procedure recordStats(rec : TStatusRecord); override; + procedure recordStats(rec : TStatusRecord); override; + procedure Started; override; + procedure Stopping; override; end; function makeTxFactory(version : TFHIRVersion) : TFHIRFactory; @@ -406,6 +428,70 @@ function TTerminologyServerData.sizeInBytesV(magic: integer): cardinal; result := inherited sizeInBytesV(magic) + FPackages.sizeInBytes(magic) + FCodeSystems.sizeInBytes(magic) + FValueSets.sizeInBytes(magic) + FNamingSystems.sizeInBytes(magic) + FConceptMaps.sizeInBytes(magic); end; +{ TTerminologyServerDataLoadThread } + +procedure TTerminologyServerDataLoadThread.process(name : String; list : TFslMap); +var + p : TFHIRResourceProxyV; + t : TFHIRResourceV; + i, c : integer; +begin + SetThreadStatus(name+': 0%'); + c := list.Count; + i := 0; + for p in list.values do + begin + if Stopped then + exit; + SetThreadStatus(name+': '+inttostr(((100 * i) div c))+'% ('+p.url+')'); + inc(FEndPoint.FStore.FData.FLoaded); + try + t := p.resourceV; // prompt to load + if (name = 'CodeSystems') and (FEndPoint <> nil) and (FEndPoint.FStore <> nil) and (FEndPoint.FStore.FServerContext <> nil) then + FEndPoint.FStore.FServerContext.ValidatorContext.loadCodeSystem(p); + except + on e : Exception do + Logging.log('Error loading '+p.url+'|'+p.version+': '+e.message); + end; + inc(i); + SetThreadStatus(name+': '+inttostr(((100 * i) div c))+'%'); + sleep(15); // if this goes too low, bang on OSX + end; +end; + +constructor TTerminologyServerDataLoadThread.create(ep: TTerminologyServerEndPoint); +begin + FEndPoint := ep; + inherited create; +end; + +procedure TTerminologyServerDataLoadThread.execute; +var + version : String; +begin + GThreadDoingConstruction := true; + try + version := FEndPoint.config.prop['version'].value; + SetThreadName(version+' Loader'); + + FEndPoint.FStore.FData.FTotalToLoad := + FEndPoint.FStore.FData.CodeSystems.count + FEndPoint.FStore.FData.ValueSets.Count+ + FEndPoint.FStore.FData.NamingSystems.count + FEndPoint.FStore.FData.ConceptMaps.Count; + + process('CodeSystems', FEndPoint.FStore.FData.CodeSystems); + if not Stopped then + process('ValueSets', FEndPoint.FStore.FData.ValueSets); + if not Stopped then + process('NamingSystems', FEndPoint.FStore.FData.NamingSystems); + if not Stopped then + process('ConceptMaps', FEndPoint.FStore.FData.ConceptMaps); + if (FEndPoint <> nil) and (FEndPoint.FStore <> nil) and (FEndPoint.FStore.FData <> nil) then + FEndPoint.FStore.FData.FLoadingComplete := true; + finally + GThreadDoingConstruction := false; + end; +end; + { TTerminologyServerOperationEngine } constructor TTerminologyServerOperationEngine.Create(Storage : TFHIRStorageService; ServerContext : TFHIRServerContext; langList : THTTPLanguageList; Data : TTerminologyServerData); @@ -579,6 +665,24 @@ function hasScope(request : TFHIRRequest; name : String) : boolean; result := (request.ResourceName = name) or ((request.ResourceName = '') and request.Parameters['_type'].Contains(name)); end; +function onlyHasElements(ts : TStringList; names : array of String) : boolean; +var + s : String; +begin + result := true; + for s in ts do + if not StringArrayExists(names, s) then + exit(false); +end; + +function TTerminologyServerOperationEngine.makeWrapper(rn : String; p : TFHIRResourceProxyV) : TFHIRMetadataResourceW; +begin + result := factory.wrapResource(factory.makeResource(rn)) as TFHIRMetadataResourceW; + result.id := p.id; + result.url := p.url; + result.version := p.version; +end; + procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; response: TFHIRResponse); var search : TFslList; @@ -589,21 +693,27 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; bundle : TFHIRBundleBuilder; op : TFHIROperationOutcomeW; base : String; - isMatch : boolean; + isMatch, defCount : boolean; i, t, offset, count : integer; be : TFhirBundleEntryW; p : TFHIRResourceProxyV; + useProxy : boolean; + start : UInt64; begin if FEngine = nil then FEngine := context.ServerFactory.makeEngine(context.ValidatorContext.Link, TUcumServiceImplementation.Create(context.TerminologyServer.CommonTerminologies.Ucum.link)); offset := 0; count := 50; + defCount := true; for i := 0 to request.Parameters.Count - 1 do if request.Parameters.Name[i] = SEARCH_PARAM_NAME_OFFSET then offset := StrToIntDef(request.Parameters.Value[request.Parameters.Name[i]], 0) else if request.Parameters.Name[i] = '_count' then + begin count := StrToIntDef(request.Parameters.Value[request.Parameters.Name[i]], 0); + defCount := false; + end; if (count < 2) then count := TX_SEARCH_PAGE_DEFAULT else if (Count > TX_SEARCH_PAGE_LIMIT) then @@ -611,6 +721,7 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; if offset < 0 then offset := 0; + start := GetTickCount64; if (request.Parameters.Count = 0) and (response.Format = ffXhtml) and not request.hasCompartments then BuildSearchForm(request, response) else @@ -618,6 +729,19 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; TypeNotFound(request, response); spp := TSearchParser.create([scpCount, scpElements, scpSummary]); try + spp.allowedParams.add('url'); + spp.allowedParams.add('version'); + spp.allowedParams.add('content-mode'); + spp.allowedParams.add('date'); + spp.allowedParams.add('description'); + spp.allowedParams.add('supplements'); + spp.allowedParams.add('identifier'); + spp.allowedParams.add('jurisdiction'); + spp.allowedParams.add('name'); + spp.allowedParams.add('publisher'); + spp.allowedParams.add('status'); + spp.allowedParams.add('system'); + spp.allowedParams.add('title'); search := spp.parse(TFHIRServerContext(FServerContext).Indexes, request.ResourceName, request.Parameters); try base := spp.buildUrl(request.resourceName, search); @@ -630,29 +754,76 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; list := TFslMetadataResourceList.create; try + useProxy := false; + if (spp.elements.count > 0) and (search.count = 1) then + begin + if onlyHasElements(spp.elements, ['id', 'url' ,'version']) then + begin + useProxy := true; + if (defCount) then + count := 100000; + end + end; + + if not useProxy and not FData.FLoadingComplete then + raise EWebServerException.create(500, 'The full data set is only '+inttostr((100 * FData.FLoaded) div FData.FTotalToLoad)+'% loaded ('+inttostr(FData.FLoaded)+' of '+inttostr(FData.FTotalToLoad)+') for searching - repeat this query in a few minutes (max ~15min)'); + if (hasScope(request, 'CodeSystem')) then + begin for p in FData.CodeSystems.Values do - list.add(p.resourceW.link as TFhirMetadataResourceW); + begin + deadCheck(start); + if useProxy then + list.add(makeWrapper('CodeSystem', p)) + else + list.add(p.resourceW.link as TFhirMetadataResourceW); + end; + end; if (hasScope(request, 'ValueSet')) then + begin for p in FData.ValueSets.Values do - list.add(p.resourceW.link as TFhirMetadataResourceW); + begin + deadCheck(start); + if useProxy then + list.add(makeWrapper('ValueSet', p)) + else + list.add(p.resourceW.link as TFhirMetadataResourceW); + end + end; if (hasScope(request, 'ConceptMap')) then + begin for p in FData.ConceptMaps.Values do - list.add(p.resourceW.link as TFhirMetadataResourceW); + begin + deadCheck(start); + if useProxy then + list.add(makeWrapper('ConceptMap', p)) + else + list.add(p.resourceW.link as TFhirMetadataResourceW); + end; + end; if (hasScope(request, 'NamingSystem')) then + begin for p in FData.NamingSystems.Values do - list.add(p.resourceW.link as TFhirMetadataResourceW); + begin + deadCheck(start); + if useProxy then + list.add(makeWrapper('NamingSystem', p)) + else + list.add(p.resourceW.link as TFhirMetadataResourceW); + end; + end; filtered := TFslMetadataResourceList.create; try for res in list do begin + deadCheck(start); isMatch := true; for sp in search do begin if (sp.Control = scpNull) then begin - if isMatch and not matches(res.Resource, sp) then + if isMatch and not matchesNative(res, sp) then isMatch := false; end; end; @@ -660,6 +831,8 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; filtered.add(res.link); end; + bundle.setTotal(filtered.count); + if (offset > 0) or (Count < filtered.count) then begin bundle.addLink('first', base+'&'+SEARCH_PARAM_NAME_OFFSET+'=0&'+SEARCH_PARAM_NAME_COUNT+'='+inttostr(Count)); @@ -675,13 +848,14 @@ procedure TTerminologyServerOperationEngine.ExecuteSearch(request: TFHIRRequest; t := 0; for res in filtered do begin + deadCheck(start); inc(i); if (i > offset) then begin be := bundle.makeEntry; try bundle.addEntry(be, false); - be.Url := res.url; + be.Url := URLPath([context.FormalURLPlain, res.fhirType, res.id]); be.resource := res.Resource.Link; finally be.free; @@ -724,7 +898,10 @@ function TTerminologyServerOperationEngine.ExecuteTransaction(context: TOperatio s : String; i : integer; tt : TTimeTracker; + start : UInt64; begin + start := GetTickCount64; + opList := TStringList.create; try // since we're not making any changes, this is pretty straight forward @@ -739,6 +916,7 @@ function TTerminologyServerOperationEngine.ExecuteTransaction(context: TOperatio resp.id := NewGuidId; for src in req.entries.forEnum do begin + deadCheck(start); dest := resp.addEntry; try try @@ -834,7 +1012,60 @@ function TTerminologyServerOperationEngine.FindResource(aType, sId: String; opti result := false; end; -function TTerminologyServerOperationEngine.matches(resource: TFhirResourceV; sp: TSearchParameter): boolean; +function TTerminologyServerOperationEngine.matchesNative(resource : TFHIRMetadataResourceW; sp : TSearchParameter) : boolean; + function tokenMatches(mask, value : String) : boolean; + begin + result := mask = value; + end; + function stringMatches(mask, value : String) : boolean; + begin + result := value.toLower.contains(mask.toLower); + end; + function dateMatches(mask, value : String) : boolean; + begin + result := mask = value; + end; +var + cs : TFHIRCodeSystemW; +begin + if sp.index.Name = 'url' then + result := tokenMatches(sp.value, resource.url) + else if sp.index.Name = 'version' then + result := tokenMatches(sp.value, resource.version) + else if sp.index.Name = 'date' then + result := dateMatches(sp.value, resource.date.toXML) + else if sp.index.Name = 'description' then + result := stringMatches(sp.value, resource.description) + else if sp.index.Name = 'name' then + result := stringMatches(sp.value, resource.name) + else if sp.index.Name = 'publisher' then + result := stringMatches(sp.value, resource.publisher) + else if sp.index.Name = 'status' then + result := tokenMatches(sp.value, CODES_TPublicationStatus[resource.status]) + else if sp.index.Name = 'system' then + result := tokenMatches(sp.value, resource.url) + else if sp.index.Name = 'title' then + result := stringMatches(sp.value, resource.title) + else if sp.index.Name = 'identifier' then + result := false // todo + else if sp.index.Name = 'jurisdiction' then + result := false // todo + else if (resource is TFHIRCodeSystemW) then + begin + cs := resource as TFHIRCodeSystemW; + if sp.index.Name = 'content-mode' then + result := tokenMatches(sp.value, CODES_TFhirCodeSystemContentMode[cs.content]) + else if sp.index.Name = 'supplements' then + result := tokenMatches(sp.value, cs.supplements) + else + result := false; + end + else + result := false; +end; + +// this is not used - proved too slow for operational use +function TTerminologyServerOperationEngine.matchesFHIRPath(resource: TFhirResourceV; sp: TSearchParameter): boolean; var selection : TFHIRSelectionList; so : TFHIRSelection; @@ -1082,6 +1313,9 @@ function TTerminologyFhirServerStorage.createOperationContext(langList : THTTPLa result.Operations.add(TFhirConceptMapTranslationOperation.create(FServerContext.Factory.link, FServerContext.TerminologyServer.Link, FServerContext.TerminologyServer.CommonTerminologies.Languages.link)); result.Operations.add(TFhirConceptMapClosureOperation.create(FServerContext.Factory.link, FServerContext.TerminologyServer.Link, FServerContext.TerminologyServer.CommonTerminologies.Languages.link)); result.Operations.add(TFhirVersionsOperation.create(Factory.link, FServerContext.TerminologyServer.CommonTerminologies.Languages.link)); + {$IFDEF DEV_FEATURES} + result.Operations.add(TFhirFeatureNegotiation.create(Factory.link, FServerContext.TerminologyServer.CommonTerminologies.Languages.link)); + {$ENDIF} end; function TTerminologyFhirServerStorage.FetchResource(key: integer): TFHIRResourceV; @@ -1181,10 +1415,25 @@ procedure TTerminologyFhirServerStorage.loadPackage(pid: String; ignoreEmptyCode i : integer; list : TFslList; pi : TNpmPackageResource; + fileToLoad: string; begin i := 0; - npm := FServerContext.pcm.loadPackage(pid); + +// FEndPoint. +fileToLoad := filePath([FServerContext.pcm.folder,pid]) ; + + + if (FileExists(fileToLoad)) then + try + npm := FServerContext.pcm.loadPackageFromCache(fileToLoad) + except + on e : Exception do + Logging.log('Error loading package from file '+fileToLoad+': '+e.message); + end + else + npm := FServerContext.pcm.loadPackage(pid); + try Logging.start('Load package '+npm.name+'#'+npm.version); try @@ -1200,7 +1449,7 @@ procedure TTerminologyFhirServerStorage.loadPackage(pid: String; ignoreEmptyCode inc(i); if (i mod 100 = 0) then Logging.continue('.'); - res := factory.makeProxy(pi.Link, FServerContext.ValidatorContext.Link, FLock.link); + res := factory.makeProxy(npm.name+'#'+npm.version, pi.Link, FServerContext.ValidatorContext.Link, FLock.link); try loadResource(res, ignoreEmptyCodeSystems); finally @@ -1269,7 +1518,7 @@ procedure TTerminologyFhirServerStorage.loadBytes(factory: TFHIRFactory; name: S try res := p.parseResource(cnt); try - pr := factory.makeProxy(res.link); + pr := factory.makeProxy(name, res.link); try loadResource(pr, false); finally @@ -1501,6 +1750,18 @@ procedure TTerminologyServerEndPoint.recordStats(rec: TStatusRecord); FServerContext.TerminologyServer.recordStats(rec); end; +procedure TTerminologyServerEndPoint.Started; +begin + inherited Started; + FLoadThread.Start; +end; + +procedure TTerminologyServerEndPoint.Stopping; +begin + inherited Stopping; + FLoadThread.StopAndWait(500); +end; + function TTerminologyServerEndPoint.summary: String; begin result := 'Terminology Server using '+describeDatabase(Config); @@ -1565,10 +1826,13 @@ procedure TTerminologyServerEndPoint.Load; FServerContext.TerminologyServer.Loading := false; FStore.Initialise; + FStore.FData.FLoadingComplete := false; + FLoadThread := TTerminologyServerDataLoadThread.create(self); end; procedure TTerminologyServerEndPoint.Unload; begin + FLoadThread.StopAndWait(500); if FServerContext <> nil then begin FServerContext.Unload; diff --git a/server/endpoint_xig.pas b/server/endpoint_xig.pas index 1197128df..3219fc7e6 100644 --- a/server/endpoint_xig.pas +++ b/server/endpoint_xig.pas @@ -33,7 +33,7 @@ interface uses - SysUtils, Classes, ZStream, + SysUtils, Classes, {$IFDEF FPC} ZStream, {$ENDIF} IdContext, IdCustomHTTPServer, IdOpenSSLX509, fsl_base, fsl_utilities, fsl_json, fsl_i18n, fsl_http, fsl_html, fsl_fetcher, fsl_logging, fsl_threads, fhir_objects, fhir_xhtml, @@ -143,7 +143,7 @@ TXIGServerEndPoint = class (TFHIRServerEndPoint) procedure downloadAndReload; function dateBuilt : String; public - constructor Create(config : TFHIRServerConfigSection; settings : TFHIRServerSettings; common : TCommonTerminologies; i18n : TI18nSupport); + constructor Create(config : TFHIRServerConfigSection; settings : TFHIRServerSettings; db : TFDBManager; common : TCommonTerminologies; i18n : TI18nSupport); destructor Destroy; override; function summary : String; override; @@ -537,9 +537,9 @@ function TPackageInformation.link: TPackageInformation; { TXIGServerEndPoint } -constructor TXIGServerEndPoint.Create(config : TFHIRServerConfigSection; settings : TFHIRServerSettings; common : TCommonTerminologies; i18n : TI18nSupport); +constructor TXIGServerEndPoint.Create(config : TFHIRServerConfigSection; settings : TFHIRServerSettings; db : TFDBManager; common : TCommonTerminologies; i18n : TI18nSupport); begin - inherited Create(config, settings, nil, common, nil, i18n); + inherited Create(config, settings, db, common, nil, i18n); end; destructor TXIGServerEndPoint.Destroy; @@ -619,9 +619,9 @@ procedure TXIGServerEndPoint.downloadAndReload; raise; end; end; - xig := TFHIRXIGWebContext.Create(TFDBSQLiteManager.create('xig-'+FLastDownload, tgt, false)); + xig := TFHIRXIGWebContext.Create(TFDBSQLiteManager.create('xig-'+FLastDownload, tgt, true, false)); try - FXIGServer.FLock.lock; + FXIGServer.FLock.lock('downloadAndReload'); try oxig := FXIGServer.FContext; FXIGServer.FContext := xig.link; @@ -1070,7 +1070,7 @@ function TFHIRXIGWebServer.contentAll(context : TFHIRXIGWebContext; mode : TCont procedure TFHIRXIGWebServer.renderExtension(b : TFslStringBuilder; details : String); var - p1, p2 : TStringArray; + p1, p2 : TArray; begin p1 := details.Split(['|']); b.append(''+p1[0].subString(9).replace(',', ' ')+''); @@ -1092,7 +1092,7 @@ function TFHIRXIGWebServer.extLink(url: String): String; result := ' '; end; - +{$IFDEF FPC} procedure DecompressStream(src, dst: TStream); var ds: TDecompressionStream; @@ -1133,6 +1133,7 @@ function inflate(source:TBytes):TBytes; ss1.Free; end; end; +{$ENDIF} function fixLink(base, link : String) : String; begin @@ -1218,12 +1219,12 @@ function TFHIRXIGWebServer.contentRes(context : TFHIRXIGWebContext; pid, rtype, try pck := context.FPackagesById[pid]; if (pck = nil) then - raise EWebServerException.create('Unknown Package '+pid.replace('|', '#')); + raise EWebServerException.create(400, 'Unknown Package '+pid.replace('|', '#')); db.sql := 'Select * from Resources where PackageKey = '+pck.key+' and ResourceType = '''+SqlWrapString(rtype)+''' and Id = '''+SqlWrapString(id)+''''; db.prepare; db.Execute; if not db.FetchNext then - raise EWebServerException.create('Unknown Resource '+rtype+'/'+id+' in package '+pid); + raise EWebServerException.create(400, 'Unknown Resource '+rtype+'/'+id+' in package '+pid); rk := db.ColStringByName['ResourceKey']; base := db.ColStringByName['Web']; base := base.Substring(0, base.LastIndexOf('/')); @@ -1356,7 +1357,11 @@ function TFHIRXIGWebServer.contentRes(context : TFHIRXIGWebContext; pid, rtype, db.prepare; db.Execute; db.fetchNext; - j := inflate(db.ColBlobByName['Json']); + {$IFDEF FPC} + j := inflate(db.ColBlobByName['Json']); + {$ELSE} + raise EFslException.Create('Not Implemented Yet'); + {$ENDIF} db.terminate; db.release; @@ -1397,7 +1402,7 @@ function TFHIRXIGWebServer.contentRes(context : TFHIRXIGWebContext; pid, rtype, function TFHIRXIGWebServer.getContext: TFHIRXIGWebContext; begin - FLock.Lock; + FLock.Lock('getContext'); try result := FContext.link; finally @@ -1510,7 +1515,7 @@ function TFHIRXIGWebServer.doRequest(AContext: TIdContext; request: TIdHTTPReque //s : TArray; //sId : string; json : TJsonObject; - p : TStringArray; + p : TArray; begin pm := THTTPParameters.Create(request.UnparsedParams); try @@ -1551,4 +1556,5 @@ function TFHIRXIGWebServer.SecureRequest(AContext: TIdContext; ip : String; requ countRequest; result := doRequest(AContext, request, response, id, true); end; -end. \ No newline at end of file + +end. diff --git a/server/fhirconsole.lpi b/server/fhirconsole.lpi index e8eff1f42..3878d9ad4 100644 --- a/server/fhirconsole.lpi +++ b/server/fhirconsole.lpi @@ -1,4 +1,3 @@ - @@ -17,8 +16,10 @@ - - + + + + @@ -35,7 +36,7 @@ - + @@ -121,13 +122,13 @@ - + - - - - + + + + @@ -138,14 +139,14 @@ - + - + @@ -162,7 +163,7 @@ - + @@ -218,10 +219,7 @@ - + @@ -274,13 +272,13 @@ - + - - - - + + + + @@ -302,11 +300,12 @@ - + + @@ -372,7 +371,7 @@ - + @@ -457,6 +456,10 @@ + + + + @@ -466,9 +469,9 @@ - + - + @@ -508,7 +511,7 @@ - + diff --git a/server/fhirconsole.pas b/server/fhirconsole.pas index c007ca60c..fa31f8367 100644 --- a/server/fhirconsole.pas +++ b/server/fhirconsole.pas @@ -38,13 +38,10 @@ cthreads, {$ENDIF} Interfaces, // this includes the LCL widgetset - SysUtils, Forms, Dialogs, datetimectrls, lazcontrols, - IdOpenSSLLoader, + SysUtils, Forms, Dialogs, datetimectrls, lazcontrols, IdOpenSSLLoader, fsl_base, fsl_fpc, fsl_utilities, fsl_openssl, fsl_web_init, fsl_fpc_memory, - fdb_odbc_fpc, - console_form, - console_tx_edit, console_ep_edit, install_form, install_log, installer, - test_form; + fsl_testing, fdb_odbc_fpc, console_form, console_tx_edit, console_ep_edit, + install_form, install_log, installer, test_form; {$R *.res} diff --git a/server/fhirserver.dproj b/server/fhirserver.dproj index 4c57561b4..9e2b819df 100644 --- a/server/fhirserver.dproj +++ b/server/fhirserver.dproj @@ -1,1527 +1,1535 @@ - - - {7F316173-C96F-45F2-9CDF-8D999F4C4F82} - 19.5 - VCL - FHIRServer.dpr - True - Test - Win64 - 3 - Console - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Base - true - - - true - Cfg_3 - true - true - - - true - Cfg_3 - true - true - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - FHIRServer - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - TESTINSIGHT;$(DCC_Define) - 3081 - CompanyName=;FileVersion=2.1.3.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - true - 2 - 0 - 12 - false - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - esbpcs_base_db_rt_d17;esbpcs_base_rt_d17;fs17;frx17;bindcompfmx;DBXSqliteDriver;vcldbx;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;TeeDB;bindcomp;inetdb;esbpcs_xtras_db_rt_d17;vclib;inetdbbde;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;esbpcs_calcs_rt_d17;esbpcs_dates_rt_d17;DataSnapProviderClient;xmlrtl;svnui;ibxpress;DbxCommonDriver;DBXSybaseASEDriver;vclimg;esbpcs_stats_rt_d17;IndyProtocols;dbxcds;DBXMySQLDriver;DatasnapConnectorsFreePascal;MetropolisUILiveTile;esbpcs_calcs_db_rt_d17;esbpcs_xtras_rt_d17;vclactnband;bindengine;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;vcltouch;DBXDb2Driver;websnap;DBXOracleDriver;CustomIPTransport;vclribbon;VclSmp;dsnap;IndyIPServer;DBXInformixDriver;Intraweb;fmxase;vcl;IndyCore;DataSnapConnectors;esbpcs_stats_db_rt_d17;IndyIPCommon;CloudService;DBXMSSQLDriver;dsnapcon;DBXFirebirdDriver;FmxTeeUI;inet;fsDB17;fmxobj;frxDB17;CodeSiteExpressPkg;esbpcs_dates_db_rt_d17;vclx;frxe17;inetdbxpress;webdsnap;svn;DBXSybaseASADriver;fmxdae;bdertl;dbexpress;adortl;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) - ..\..\server\dependencies\Indy10\System;..\..\server\dependencies\Indy10\Core;..\..\server\dependencies\Indy10\Protocols;..\..\server\dependencies\jcl;..\..\server\dependencies\d64\debug;..\..\server\library;..\..\server\dependencies\qrcode;$(DCC_UnitSearchPath) - (None) - USE_VCL_BITMAP;$(DCC_Define) - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - 1033 - bindcompfmx;DBXSqliteDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;bindcomp;inetdb;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;DataSnapProviderClient;xmlrtl;DbxCommonDriver;DBXSybaseASEDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;vclactnband;bindengine;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;vclie;vcltouch;DBXDb2Driver;websnap;DBXOracleDriver;CustomIPTransport;VclSmp;dsnap;IndyIPServer;DBXInformixDriver;fmxase;vcl;IndyCore;IndyIPCommon;DBXMSSQLDriver;dsnapcon;DBXFirebirdDriver;inet;fmxobj;vclx;inetdbxpress;webdsnap;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) - ..\..\server\dependencies\Indy10\System;..\..\server\dependencies\Indy10\Core;..\..\server\dependencies\Indy10\Protocols;..\..\server\dependencies\jcl;..\..\server\library;..\..\server\dependencies\Indy10\OpenSSL;..\..\server\dependencies\Indy10\OpenSSL\static;..\..\server\dependencies\Indy10;..\..\source\ZXing.Delphi\Lib\Classes\Common;..\..\source\ZXing.Delphi\Lib\Classes\1D Barcodes;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes;..\..\source\ZXing.Delphi\Lib\Classes\Common\ReedSolomon;..\..\source\ZXing.Delphi\Lib\Classes\Common\Detector;..\..\source\ZXing.Delphi\Lib\Classes\Filtering;..\..\source\ZXing.Delphi\Lib\Classes;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes\Decoder;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes\Detector;$(DCC_UnitSearchPath) - (None) - USE_VCL_BITMAP;$(DCC_Define) - -cmd exec -cfg https://storage.googleapis.com/tx-fhir-org -local c:\temp\zero - - - DEBUG;$(DCC_Define) - true - false - true - true - true - 3081 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - - - false - fhir.ico - -cmd exec -load -ini ..\..\server\Exec\fhir.dev.local.ini -password gg -endpoint r5 -packages hl7.fhir.r5.core - true - true - true - ..\..\server\dependencies\d32\debug;$(DCC_UnitSearchPath) - INDY_V10;$(DCC_Define) - 1033 - None - ..\..\server\tmp\units\32\ - false - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - ..\..\server\Exec\32\ - - - false - false - false - -cmd exec -cfg Z:\work\server\exec\fhirserver.cfg -local c:\temp\zero - ..\..\server\tmp\units\64\ - ..\..\server\exec\64 - 3 - true - off - false - 1033 - None - true - error - false - error - error - error - error - error - false - error - ..\..\server\exec\64 - ..\exec\icons\fhir-server.ico - true - true - false - 1 - 0 - none - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - C:\HL7Connect\indysoap\source;$(DCC_UnitSearchPath) - -debug -ini ..\..\server\Exec\fhir.local.ini -xsnomed-rf2 "C:\Data\terminologies\snomed-ct au\20130530\RF2 Release\Snapshot" -xremount -xtests -xloinc C:\Data\terminologies\FHIR.Loinc.Base\LOINCDB.MDB - None - 1033 - false - fhir.ico - - - true - 1033 - None - true - false - true - -tests -ini ..\..\server\Exec\fhir.local.ini - 1 - 3 - none - - - C:\Program Files (x86)\Embarcadero\Studio\21.0\source\DunitX;$(DCC_UnitSearchPath) - ..\..\server\exec\32\ - 1033 - - - -cmd exec -cfg https://storage.googleapis.com/tx-fhir-org -local c:\temp\zero -xtestinsight -version * - 1033 - ..\..\server\exec\64\ - ..\..\server\tmp\units\64\ - error - false - false - false - true - true - ..\exec\icons\fhir-server.ico - 1 - 3 - false - true - true - none - - - - MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ServerGUI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - Cfg_3 - Base - - - - Delphi.Personality.12 - - - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 3081 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - - - - - - - FHIRServer.dpr - - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - - - fhirserver.exe - true - - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - - - True - True - - - 12 - - - - + + + {7F316173-C96F-45F2-9CDF-8D999F4C4F82} + 19.5 + VCL + FHIRServer.dpr + True + Test + Win64 + 3 + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Base + true + + + true + Cfg_3 + true + true + + + true + Cfg_3 + true + true + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + FHIRServer + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + TESTINSIGHT;$(DCC_Define) + 3081 + CompanyName=;FileVersion=2.1.3.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + true + 3 + 4 + 11 + false + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + esbpcs_base_db_rt_d17;esbpcs_base_rt_d17;fs17;frx17;bindcompfmx;DBXSqliteDriver;vcldbx;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;TeeDB;bindcomp;inetdb;esbpcs_xtras_db_rt_d17;vclib;inetdbbde;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;esbpcs_calcs_rt_d17;esbpcs_dates_rt_d17;DataSnapProviderClient;xmlrtl;svnui;ibxpress;DbxCommonDriver;DBXSybaseASEDriver;vclimg;esbpcs_stats_rt_d17;IndyProtocols;dbxcds;DBXMySQLDriver;DatasnapConnectorsFreePascal;MetropolisUILiveTile;esbpcs_calcs_db_rt_d17;esbpcs_xtras_rt_d17;vclactnband;bindengine;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;vcltouch;DBXDb2Driver;websnap;DBXOracleDriver;CustomIPTransport;vclribbon;VclSmp;dsnap;IndyIPServer;DBXInformixDriver;Intraweb;fmxase;vcl;IndyCore;DataSnapConnectors;esbpcs_stats_db_rt_d17;IndyIPCommon;CloudService;DBXMSSQLDriver;dsnapcon;DBXFirebirdDriver;FmxTeeUI;inet;fsDB17;fmxobj;frxDB17;CodeSiteExpressPkg;esbpcs_dates_db_rt_d17;vclx;frxe17;inetdbxpress;webdsnap;svn;DBXSybaseASADriver;fmxdae;bdertl;dbexpress;adortl;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + ..\..\server\dependencies\Indy10\System;..\..\server\dependencies\Indy10\Core;..\..\server\dependencies\Indy10\Protocols;..\..\server\dependencies\jcl;..\..\server\dependencies\d64\debug;..\..\server\library;..\..\server\dependencies\qrcode;$(DCC_UnitSearchPath) + (None) + USE_VCL_BITMAP;$(DCC_Define) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + 1033 + bindcompfmx;DBXSqliteDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;bindcomp;inetdb;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;DataSnapProviderClient;xmlrtl;DbxCommonDriver;DBXSybaseASEDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;vclactnband;bindengine;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;vclie;vcltouch;DBXDb2Driver;websnap;DBXOracleDriver;CustomIPTransport;VclSmp;dsnap;IndyIPServer;DBXInformixDriver;fmxase;vcl;IndyCore;IndyIPCommon;DBXMSSQLDriver;dsnapcon;DBXFirebirdDriver;inet;fmxobj;vclx;inetdbxpress;webdsnap;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + ..\..\server\dependencies\Indy10\System;..\..\server\dependencies\Indy10\Core;..\..\server\dependencies\Indy10\Protocols;..\..\server\dependencies\jcl;..\..\server\library;..\..\server\dependencies\Indy10\OpenSSL;..\..\server\dependencies\Indy10\OpenSSL\static;..\..\server\dependencies\Indy10;..\..\source\ZXing.Delphi\Lib\Classes\Common;..\..\source\ZXing.Delphi\Lib\Classes\1D Barcodes;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes;..\..\source\ZXing.Delphi\Lib\Classes\Common\ReedSolomon;..\..\source\ZXing.Delphi\Lib\Classes\Common\Detector;..\..\source\ZXing.Delphi\Lib\Classes\Filtering;..\..\source\ZXing.Delphi\Lib\Classes;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes\Decoder;..\..\source\ZXing.Delphi\Lib\Classes\2D Barcodes\Detector;$(DCC_UnitSearchPath) + (None) + USE_VCL_BITMAP;$(DCC_Define) + -cmd exec -cfg https://storage.googleapis.com/tx-fhir-org -local c:\temp\zero + + + DEBUG;$(DCC_Define) + true + false + true + true + true + 3081 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + false + fhir.ico + -cmd exec -load -ini ..\..\server\Exec\fhir.dev.local.ini -password gg -endpoint r5 -packages hl7.fhir.r5.core + true + true + true + ..\..\server\dependencies\d32\debug;$(DCC_UnitSearchPath) + INDY_V10;$(DCC_Define) + 1033 + None + ..\..\server\tmp\units\32\ + false + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + ..\..\server\Exec\32\ + + + false + false + false + -cmd exec -cfg Z:\work\server\exec\fhirserver.cfg -local c:\temp\zero + ..\..\server\tmp\units\64\ + ..\..\server\exec\64 + 3 + true + off + false + 1033 + None + true + error + false + error + error + error + error + error + false + error + ..\..\server\exec\64 + ..\exec\icons\fhir-server.ico + true + true + false + 3 + 11 + none + 4 + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + C:\HL7Connect\indysoap\source;$(DCC_UnitSearchPath) + -debug -ini ..\..\server\Exec\fhir.local.ini -xsnomed-rf2 "C:\Data\terminologies\snomed-ct au\20130530\RF2 Release\Snapshot" -xremount -xtests -xloinc C:\Data\terminologies\FHIR.Loinc.Base\LOINCDB.MDB + None + 1033 + false + fhir.ico + + + true + 1033 + None + true + false + true + -tests -ini ..\..\server\Exec\fhir.local.ini + 1 + 3 + none + + + C:\Program Files (x86)\Embarcadero\Studio\21.0\source\DunitX;$(DCC_UnitSearchPath) + ..\..\server\exec\32\ + 1033 + + + -cmd exec -cfg https://storage.googleapis.com/tx-fhir-org -local c:\temp\zero -xtestinsight -version * + 1033 + ..\..\server\exec\64\ + ..\..\server\tmp\units\64\ + error + false + false + false + true + true + ..\exec\icons\fhir-server.ico + 1 + 3 + false + true + true + none + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          ServerGUI
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + Cfg_3 + Base + +
          + + Delphi.Personality.12 + + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3081 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + FHIRServer.dpr + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + + + fhirserver.exe + true + + + + + + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + + True + True + + + 12 + + + +
          diff --git a/server/fhirserver.lpi b/server/fhirserver.lpi index 241aabb9c..c5bb8285d 100644 --- a/server/fhirserver.lpi +++ b/server/fhirserver.lpi @@ -18,10 +18,11 @@ - - + + + - + @@ -34,10 +35,10 @@ - - - - + + + + @@ -48,13 +49,14 @@ - - + + + @@ -75,7 +77,48 @@
          - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -83,11 +126,11 @@ - + - + @@ -118,7 +161,7 @@ - + @@ -129,11 +172,11 @@ - + - - + + @@ -174,8 +217,8 @@ - - + + @@ -221,8 +264,8 @@ - - + + @@ -230,15 +273,16 @@ - + - + - - + + + @@ -247,9 +291,14 @@ - + + + + + + @@ -259,11 +308,11 @@ - + - - + + @@ -274,7 +323,7 @@ - + @@ -294,7 +343,7 @@ - + @@ -305,13 +354,15 @@ + - - + + + @@ -377,7 +428,7 @@ - + @@ -614,11 +665,11 @@ - + - + @@ -662,47 +713,47 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -718,68 +769,71 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - - + @@ -813,7 +867,7 @@ - + @@ -845,7 +899,6 @@ - @@ -869,7 +922,6 @@ - @@ -882,7 +934,6 @@ - @@ -938,7 +989,6 @@ - @@ -994,6 +1044,18 @@ + + + + + + + + + + + +
          diff --git a/server/fhirserver.lpr b/server/fhirserver.lpr index d6cb2c1bb..f752eda08 100644 --- a/server/fhirserver.lpr +++ b/server/fhirserver.lpr @@ -32,7 +32,7 @@ uses {$IFDEF WINDOWS} - FastMM4, + //FastMM4, {$ELSE} cmem, cthreads, @@ -47,9 +47,10 @@ Classes, SysUtils, fsl_fpc_memory, fsl_utilities, - kernel, server_testing, server_stats, remote_config, telnet_server, package_spider, - tx_registry_spider, tx_omop, tx_registry_model, endpoint_txregistry, - endpoint_icao, tests_cpt, tx_cpt, xig_provider, endpoint_xig, web_server; + kernel, server_testing, server_stats, zero_config, telnet_server, + package_spider, tx_registry_spider, tx_omop, tx_registry_model, + endpoint_txregistry, endpoint_icao, tests_cpt, tx_cpt, xig_provider, + endpoint_xig, web_server, web_cache; {$R *.res} diff --git a/server/gui_controller.pas b/server/gui_controller.pas index c47a0f2b3..c715be4e9 100644 --- a/server/gui_controller.pas +++ b/server/gui_controller.pas @@ -153,7 +153,7 @@ procedure TFHIRServerController.logFinish(s: String); procedure TFHIRServerController.log(const msg : String); begin - FLock.Lock; + FLock.Lock('log'); try FMessagesIn.Add(msg); finally @@ -167,7 +167,7 @@ procedure TFHIRServerController.Ping; s : String; begin st := false; - FLock.Lock; + FLock.Lock('Ping'); try if FPendingStatus <> FStatus then begin diff --git a/server/html_builder.pas b/server/html_builder.pas index 9fbdb6c3e..b11692e82 100644 --- a/server/html_builder.pas +++ b/server/html_builder.pas @@ -407,7 +407,7 @@ procedure TFHIRXhtmlComposer.ComposeBundle(stream: TStream; bundle: TFHIRBundleW ul := ul + '?' else ul := ul + '&'; - s.append('

          XML '+GetFhirMessage('OR', langList)+' JSON '+GetFhirMessage('NAME_REPRESENTATION', langList)+'

          '+#13#10); + s.append('

          XML '+GetFhirMessage('OR', langList)+' JSON '+GetFhirMessage('NAME_REPRESENTATION', langList)+'

          '+#13#10); if (bundle.type_ in [btSearchset, btHistory]) then begin diff --git a/server/indexing.pas b/server/indexing.pas index b6f856c23..ebc08558b 100644 --- a/server/indexing.pas +++ b/server/indexing.pas @@ -356,7 +356,7 @@ procedure TFhirIndexSpaces.RecordSpace(space: String; key: integer); begin if space.trim <> space then raise EFHIRException.Create('Illegal System Value "'+space+'" - cannot have leading or trailing whitespace'); - FLock.Lock; + FLock.Lock('RecordSpace'); try FSpaces.AddObject(space, TObject(key)); if key > FLast then @@ -373,7 +373,7 @@ function TFhirIndexSpaces.ResolveSpace(space : String; var key :integer) : boole begin if space.trim <> space then raise EFHIRException.Create('Illegal System Value "'+space+'" - cannot have leading or trailing whitespace'); - FLock.Lock; + FLock.Lock('ResolveSpace'); try result := FSpaces.Find(space, i); if result then diff --git a/server/kernel.pas b/server/kernel.pas index a3cbd023c..d77cdd212 100644 --- a/server/kernel.pas +++ b/server/kernel.pas @@ -33,7 +33,7 @@ interface Uses - {$IFDEF WINDOWS} Windows, ActiveX, FastMM4, {$ENDIF} + {$IFDEF WINDOWS} Windows, ActiveX, {$ENDIF} SysUtils, StrUtils, Classes, IniFiles, Forms, {$IFDEF FPC} gui_lcl, Interfaces, {$ELSE} gui_vcl, {$ENDIF} @@ -50,7 +50,7 @@ interface {$ENDIF} server_constants, server_config, utilities, server_context, - tx_manager, telnet_server, web_source, web_server, web_cache, remote_config, + tx_manager, telnet_server, web_source, web_server, web_cache, zero_config, server_testing, kernel_thread, server_stats, endpoint, endpoint_storage, endpoint_bridge, endpoint_txsvr, endpoint_packages, endpoint_loinc, endpoint_snomed, endpoint_full, endpoint_folder, endpoint_icao, @@ -143,6 +143,57 @@ implementation JclDebug; {$ENDIF} +function systemInfo : string; +var + l, s : string; +begin + l := 'Running on "'+SystemName+'": '+SystemPlatform; + s := SystemArchitecture; + if (s <> '') and not sameText(s, 'Unknown') then + begin + l := l + ' ('; + l := l + s; + s := SystemProcessorName; + if s <> '' then + l := l + '/'+s; + l := l + ')'; + end; + l := l + '. '; + l := l + DescribeBytes(SystemMemory.physicalMem)+'/ '+DescribeBytes(SystemMemory.virtualMem)+' memory'; + result := l; +end; + +function compileInfo : String; +var + compiler, os, cpu, s : String; +begin + {$IFDEF FPC} + compiler := '/FreePascal'; + {$ELSE} + compiler := '/Delphi'; + {$ENDIF} + {$IFDEF WINDOWS} + os := 'Windows'; + {$ENDIF} + {$IFDEF LINUX} + os := 'Linux'; + {$ENDIF} + {$IFDEF OSX} + os := 'OSX'; + {$ENDIF} + {$IFDEF CPU64} + cpu := ''; //'-64'; + {$ELSE} + cpu := '-32'; + {$ENDIF} + + s := os+cpu+compiler+', '+BuildDescription; + + result := 'FHIR Server '+SERVER_FULL_VERSION+' '+s; +end; + + + var GStartTime : UInt64; @@ -198,46 +249,55 @@ procedure TFHIRServiceKernel.postStart; ep : TFhirServerEndpoint; i : integer; begin + GThreadDoingConstruction := true; try - LoadTerminologies; - LoadEndPoints; - StartWebServer(); - - recordStats(nil); - FMaintenanceThread := TFhirServerMaintenanceThread.Create; - FMaintenanceThread.defineTask('mem-check', checkMem, 35); - FMaintenanceThread.defineTask('stats', recordStats, 60); - i := 0; - for ep in FEndPoints do - begin - FMaintenanceThread.defineTask('ep:'+ep.Config.Name, ep.internalThread, 60+i); - i := i + 5; - end; - FMaintenanceThread.defineTask('snomed', FTerminologies.sweepSnomed, 600); - FMaintenanceThread.defineTask('web-cache', WebServer.Common.cache.Trim, 60); - FMaintenanceThread.defineTask('sweep-cache', sweepCaches, 60); - FMaintenanceThread.Start; + try + LoadTerminologies; + LoadEndPoints; + StartWebServer(); + for ep in FEndPoints do + ep.Started; + + recordStats(nil); + FMaintenanceThread := TFhirServerMaintenanceThread.Create; + FMaintenanceThread.defineTask('mem-check', checkMem, 35); + FMaintenanceThread.defineTask('stats', recordStats, 60); + i := 0; + for ep in FEndPoints do + begin + FMaintenanceThread.defineTask('ep:'+ep.Config.Name, ep.internalThread, 60+i); + i := i + 5; + end; + FMaintenanceThread.defineTask('web-cache', WebServer.Common.cache.Trim, 60); + FMaintenanceThread.defineTask('sweep-cache', sweepCaches, 60); + FMaintenanceThread.Start; - SetCacheStatus(settings.Ini.web['caching'].value = 'true'); + SetCacheStatus(settings.Ini.web['caching'].value = 'true'); - // post start up time. - getReport('|', true); // base line the object countig - Logging.log('started ('+inttostr((GetTickCount64 - GStartTime) div 1000)+'secs)'); - Logging.Starting := false; - sendSMS(Settings, Settings.HostSms, 'The server ' + DisplayName + ' for ' + FSettings.OwnerName + ' has started'); - except - on e : Exception do - begin - Logging.log('Error starting: '+E.ClassName+ ': ' + E.Message+#13#10#13#10+ExceptionStack(e)); - raise; + // post start up time. + getReport('|', true); // base line the object countig + Logging.log('started ('+inttostr((GetTickCount64 - GStartTime) div 1000)+'secs)'); + Logging.Starting := false; + sendSMS(Settings, Settings.HostSms, 'The server ' + DisplayName + ' for ' + FSettings.OwnerName + ' has started'); + except + on e : Exception do + begin + Logging.log('Error starting: '+E.ClassName+ ': ' + E.Message+#13#10#13#10+ExceptionStack(e)); + raise; + end; end; + finally + GThreadDoingConstruction := false; end; end; -procedure TFHIRServiceKernel.DoStop; +procedure TFHIRServiceKernel.DoStop; +var + ep : TFhirServerEndpoint; begin try + Logging.shuttingDown := true; Logging.log('stopping: '+StopReason); sendSMS(Settings, Settings.HostSms, 'The server ' + DisplayName + ' for ' + FSettings.OwnerName + ' is stopping'); @@ -250,6 +310,9 @@ procedure TFHIRServiceKernel.DoStop; FMaintenanceThread.StopAndWait(21000); // see comments in FMaintenanceThread.finalise FMaintenanceThread.free; end; + for ep in FEndPoints do + ep.Stopping; + Logging.log('stop web server'); StopWebServer; Logging.log('closing'); @@ -287,13 +350,14 @@ procedure TFHIRServiceKernel.loadTerminologies; begin Logging.log('Load Terminologies'); FTerminologies := TCommonTerminologies.Create(Settings.link); - FTerminologies.load(Ini['terminologies'], false); - fI18n := TI18nSupport.Create(FTerminologies.Languages.link); + FI18n := TI18nSupport.Create(FTerminologies.Languages.link); FI18n.loadPropertiesFile(partnerFile('Messages.properties')); FI18n.loadPropertiesFile(partnerFile('Messages_es.properties')); FI18n.loadPropertiesFile(partnerFile('Messages_de.properties')); FI18n.loadPropertiesFile(partnerFile('Messages_nl.properties')); + FTerminologies.i18n := FI18n.link; + FTerminologies.load(Ini['terminologies'], false); end; function epVersion(section : TFHIRServerConfigSection): TFHIRVersion; @@ -347,6 +411,8 @@ procedure TFHIRServiceKernel.startWebServer; FWebServer := TFhirWebServer.Create(Settings.Link, DisplayName); FWebServer.Common.cache := THTTPCacheManager.Create(Settings.Ini.section['web'].prop['http-cache-time'].readAsInt(0)); FWebServer.Common.cache.cacheDwellTime := Settings.Ini.service['cache-time'].readAsInt(DEFAULT_DWELL_TIME_MIN) / (24*60); + FTelnet.OnGetRequestList := FWebServer.GetCurrentRequestReport; + FTelnet.OnGetCurrentRequestCount := FWebServer.GetCurrentRequestCount; FWebServer.loadConfiguration(Ini); if FolderExists('c:\work\fhirserver\server\web') then @@ -359,6 +425,11 @@ procedure TFHIRServiceKernel.startWebServer; Logging.log('Web source from /Users/grahamegrieve/work/server/server/web'); FWebServer.Common.SourceProvider := TFHIRWebServerSourceFolderProvider.Create('/Users/grahamegrieve/work/server/server/web') end + else if FolderExists(FilePath([TCommandLineParameters.execDir(), '.\web'])) then + begin + Logging.log('Web source from ./web'); + FWebServer.Common.SourceProvider := TFHIRWebServerSourceFolderProvider.Create(FilePath([TCommandLineParameters.execDir(), '.\web'])) + end else if FolderExists(FilePath([TCommandLineParameters.execDir(), '..\..\server\web'])) then begin Logging.log('Web source from ../../server/web'); @@ -383,6 +454,8 @@ procedure TFHIRServiceKernel.stopWebServer; begin if FWebServer <> nil then begin + FTelnet.OnGetCurrentRequestCount := nil; + FTelnet.OnGetRequestList := nil; FWebServer.Stop; FWebServer.free; end; @@ -526,7 +599,7 @@ function TFHIRServiceKernel.makeEndPoint(config : TFHIRServerConfigSection) : TF begin // we generate by type and mode if config['type'].value = 'package' then - result := TPackageServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config), Terminologies.link, FI18n.link) + result := TPackageServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config, false), Terminologies.link, FI18n.link) else if config['type'].value = 'tx-registry' then result := TTxRegistryServerEndPoint.Create(config.link, FSettings.Link, Terminologies.link, FI18n.link) else if config['type'].value = 'folder' then @@ -538,14 +611,14 @@ function TFHIRServiceKernel.makeEndPoint(config : TFHIRServerConfigSection) : TF else if config['type'].value = 'snomed' then result := TSnomedWebEndPoint.Create(config.link, FSettings.Link, Terminologies.link, FI18n.link) else if config['type'].value = 'bridge' then - result := TBridgeEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config), Terminologies.link, FPcm.link, FI18n.link) + result := TBridgeEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config, false), Terminologies.link, FPcm.link, FI18n.link) else if config['type'].value = 'xig' then - result := TXIGServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config), Terminologies.link, FPcm.link, FI18n.link) + result := TXIGServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config, false), Terminologies.link, {FPcm.link, }FI18n.link) else if config['type'].value = 'terminology' then - result := TTerminologyServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config), Terminologies.link, FPcm.link, FI18n.link) + result := TTerminologyServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config, false), Terminologies.link, FPcm.link, FI18n.link) else if config['type'].value = 'full' then begin - result := TFullServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config), Terminologies.link, FPcm.link, FI18n.link); + result := TFullServerEndPoint.Create(config.link, FSettings.Link, connectToDatabase(config, false), Terminologies.link, FPcm.link, FI18n.link); TFullServerEndPoint(result).OnGetNamedContext := GetNamedContext; end else @@ -604,7 +677,8 @@ procedure ExecuteFhirServer(params : TCommandLineParameters; ini : TFHIRServerCo cmd : String; svc : TFHIRServiceKernel; logMsg : String; -begin +begin + SetThreadStatus('ExecuteFhirServer'); // if we're running the test or gui, go do that if (params.has('tests') or params.has('-tests')) then RunTests(params, ini) @@ -640,7 +714,7 @@ procedure ExecuteFhirServer(params : TCommandLineParameters; ini : TFHIRServerCo logMsg := 'Using Configuration file '+ini.FileName; Logging.log(logMsg); - svc := TFHIRServiceKernel.Create(svcName, dispName, logMsg, ini.link, params.link); + svc := TFHIRServiceKernel.Create(svcName, dispName, compileInfo+' '+systemInfo+#13#10+logMsg, ini.link, params.link); try {$IFDEF FPC} if FakeConsoleForm <> nil then @@ -678,70 +752,6 @@ procedure ExecuteFhirServer(params : TCommandLineParameters; ini : TFHIRServerCo end; end; -procedure logSystemInfo; -var - l, s : string; -begin - l := 'Running on "'+SystemName+'": '+SystemPlatform; - s := SystemArchitecture; - if (s <> '') and not sameText(s, 'Unknown') then - begin - l := l + ' ('; - l := l + s; - s := SystemProcessorName; - if s <> '' then - l := l + '/'+s; - l := l + ')'; - end; - l := l + '. '; - l := l + DescribeBytes(SystemMemory.physicalMem)+'/ '+DescribeBytes(SystemMemory.virtualMem)+' memory'; - Logging.log(l); -end; - -procedure logCompileInfo; -var - compiler, os, cpu, s : String; -begin - {$IFDEF FPC} - compiler := '/FreePascal'; - {$ELSE} - compiler := '/Delphi'; - {$ENDIF} - {$IFDEF WINDOWS} - os := 'Windows'; - {$ENDIF} - {$IFDEF LINUX} - os := 'Linux'; - {$ENDIF} - {$IFDEF OSX} - os := 'OSX'; - {$ENDIF} - {$IFDEF CPU64} - cpu := ''; //'-64'; - {$ELSE} - cpu := '-32'; - {$ENDIF} - - s := os+cpu+compiler; - {$IFOPT C+} - s := s + '+Assertions'; - {$ENDIF} - - {$IFOPT D+} - s := s + '+Debug'; - {$ENDIF} - - {$IFOPT O+} - s := s + '+Optimizations'; - {$ENDIF} - - {$IFDEF OBJECT_TRACKING} - s := s + '+ObjectTracking'; - {$ENDIF} - - Logging.log('FHIR Server '+SERVER_FULL_VERSION+' '+s); -end; - var logFilename : String; @@ -785,8 +795,8 @@ procedure initLogging(params : TCommandLineParameters; cfg : TCustomIniFile); Logging.LogToConsole := true; {$ENDIF} - logCompileInfo; - logSystemInfo; + Logging.log(compileInfo); + Logging.log(systemInfo); logDebuggingInfo; if not params.hasParams then @@ -848,6 +858,8 @@ procedure ExecuteFhirServerInner(params : TCommandLineParameters); fn : String; zc : String; begin + SetThreadName('kernel'); + SetThreadStatus('ExecuteFhirServerInner'); GStartTime := GetTickCount64; {$IFDEF WINDOWS} @@ -924,12 +936,12 @@ procedure ExecuteFhirServer(params : TCommandLineParameters); else begin {$IFDEF WINDOWS} - noFMMLeakMessageBox := true; + //noFMMLeakMessageBox := true; {$ENDIF} SuppressLeakDialog := true; end; - if params.has('fake-console') then + if params.has('console') or params.has('fake-console') then begin RequireDerivedFormResource := True; Application.Title := 'FHIRServer'; @@ -959,7 +971,7 @@ procedure ExecuteFhirServer(params : TCommandLineParameters); end; {$ELSE} begin - ExecuteFhirServerInner; + ExecuteFhirServerInner(params); end; {$ENDIF} diff --git a/server/kernel_thread.pas b/server/kernel_thread.pas index d82efbac9..90dbdfffa 100644 --- a/server/kernel_thread.pas +++ b/server/kernel_thread.pas @@ -110,6 +110,10 @@ TFhirServerMaintenanceThread = class (TFslThread) procedure logStatus(workingOnly, due : boolean); end; +const + CODES_TFhirServerMaintenanceThreadTaskStatus : array [TFhirServerMaintenanceThreadTaskStatus] of String = + ('Initialised', 'Preparing', 'InProcess', 'Resting'); + implementation { TFhirServerMaintenanceThreadTaskThread } @@ -250,7 +254,39 @@ constructor TFhirServerMaintenanceThread.Create; end; destructor TFhirServerMaintenanceThread.Destroy; +var + t : TFhirServerMaintenanceThreadTask; + i : integer; + ns : integer; + ts : TStringList; begin + Logging.log('Stopping Kernel Tasks'); + for t in FTasks do + t.wantStop; + i := 0; + repeat + sleep(50); + inc(i); + ns := 0; + for t in FTasks do + if (not t.stopped) then + inc(ns); + until (ns = 0) or (i > 200); + if (ns = 0) then + Logging.log('Stopping Kernel Tasks') + else + begin + ts := TStringList.create; + try + for t in FTasks do + if (not t.Stopped) then + ts.add(t.name+': '+CODES_TFhirServerMaintenanceThreadTaskStatus[t.FStatus]); + Logging.log(inttostr(ns)+' Kernel Tasks refused to stop: '+ts.commaText); + finally + ts.free; + end; + sleep(1000); + end; FTasks.free; inherited; end; @@ -282,7 +318,7 @@ procedure TFhirServerMaintenanceThread.disableTask(name: String); function TFhirServerMaintenanceThread.ThreadName: String; begin - result := 'kernel'; + result := 'kernel.maintenance'; end; procedure TFhirServerMaintenanceThread.Initialise; diff --git a/server/operations_r2.pas b/server/operations_r2.pas index f1c134a1c..d0465456d 100644 --- a/server/operations_r2.pas +++ b/server/operations_r2.pas @@ -3068,7 +3068,7 @@ procedure TFHIRNativeStorageServiceR2.SeeResource(key, vkey, pvkey: integer; id: if (resource.ResourceType in [frtValueSet, frtConceptMap, frtStructureDefinition, frtQuestionnaire, frtSubscription]) and (needsSecure or ((resource.meta <> nil) and not resource.meta.securityList.IsEmpty)) then raise ERestfulException.Create('TFHIRNativeStorageService.SeeResource', 400, itBusinessRule, 'Resources of type '+CODES_TFHIRResourceType[resource.ResourceType]+' are not allowed to have a security label on them', langList); - p := TFHIRResourceProxy.Create(factory.link, resource.link); + p := TFHIRResourceProxy.Create('', factory.link, resource.link); try if resource.ResourceType = frtValueSet then begin @@ -3079,9 +3079,9 @@ procedure TFHIRNativeStorageServiceR2.SeeResource(key, vkey, pvkey: integer; id: else if resource.ResourceType in [frtConceptMap] then ServerContext.TerminologyServer.SeeTerminologyResource(p) else if resource.ResourceType = frtStructureDefinition then - ServerContext.ValidatorContext.seeResource(resource as TFhirStructureDefinition) + ServerContext.ValidatorContext.seeResource('', resource as TFhirStructureDefinition) else if resource.ResourceType = frtQuestionnaire then - ServerContext.ValidatorContext.seeResource(resource as TFhirQuestionnaire); + ServerContext.ValidatorContext.seeResource('', resource as TFhirQuestionnaire); if created then ServerContext.SubscriptionManager.SeeResource(key, vkey, pvkey, id, subscriptionCreate, resource, conn, reload, session) diff --git a/server/operations_r3.pas b/server/operations_r3.pas index 21d7def9b..2c8798bc3 100644 --- a/server/operations_r3.pas +++ b/server/operations_r3.pas @@ -3384,7 +3384,7 @@ procedure TFHIRNativeStorageServiceR3.SeeResource(key, vkey, pvkey: integer; id: if (resource.ResourceType in [frtValueSet, frtConceptMap, frtStructureDefinition, frtQuestionnaire, frtSubscription]) and (needsSecure or ((resource.meta <> nil) and not resource.meta.securityList.IsEmpty)) then raise ERestfulException.Create('TFHIRNativeStorageService.SeeResource', 400, itBusinessRule, 'Resources of type '+CODES_TFHIRResourceType[resource.ResourceType]+' are not allowed to have a security label on them', langList); - p := TFHIRResourceProxy.Create(factory.link, resource.link); + p := TFHIRResourceProxy.Create('', factory.link, resource.link); try if resource.ResourceType = frtValueSet then begin @@ -3395,9 +3395,9 @@ procedure TFHIRNativeStorageServiceR3.SeeResource(key, vkey, pvkey: integer; id: else if resource.ResourceType in [frtConceptMap, frtCodeSystem] then ServerContext.TerminologyServer.SeeTerminologyResource(p) else if resource.ResourceType = frtStructureDefinition then - ServerContext.ValidatorContext.seeResource(resource as TFhirStructureDefinition) + ServerContext.ValidatorContext.seeResource('', resource as TFhirStructureDefinition) else if resource.ResourceType = frtQuestionnaire then - ServerContext.ValidatorContext.seeResource(resource as TFhirQuestionnaire); + ServerContext.ValidatorContext.seeResource('', resource as TFhirQuestionnaire); finally p.free; end; diff --git a/server/operations_r4.pas b/server/operations_r4.pas index 468af6e4b..a1a17bcbd 100644 --- a/server/operations_r4.pas +++ b/server/operations_r4.pas @@ -294,6 +294,20 @@ TFhirAddMetaDataOperation = class (TFhirNativeOperationR4) function formalURL : String; override; end; + { TFhirFeatureNegotiation } + + TFhirFeatureNegotiation = class (TFhirNativeOperationR4) + protected + function isWrite : boolean; override; + function owningResource : String; override; + public + function Name : String; override; + function Types : TArray; override; + function CreateDefinition(base : String) : TFHIROperationDefinitionW; override; + function Execute(context : TOperationContext; manager: TFHIROperationEngine; request: TFHIRRequest; response : TFHIRResponse; tt : TTimeTracker) : String; override; + function formalURL : String; override; + end; + TFhirDeleteMetaDataOperation = class (TFhirNativeOperationR4) protected function isWrite : boolean; override; @@ -686,6 +700,7 @@ procedure TFhirNativeOperationEngineR4.registerOperations; FOperations.add(TFhirGetMetaDataOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); FOperations.add(TFhirAddMetaDataOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); FOperations.add(TFhirDeleteMetaDataOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); + FOperations.add(TFhirFeatureNegotiation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); FOperations.add(TFhirDiffOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); FOperations.add(TFhirConvertOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); FOperations.add(TFhirTransformOperation.Create(Factory.link, ServerContext.TerminologyServer.CommonTerminologies.Languages.Link)); @@ -2263,6 +2278,43 @@ function TFhirAddMetaDataOperation.Types: TArray; result := FFactory.ResourceNames; end; +{ TFhirFeatureNegotiation } + +function TFhirFeatureNegotiation.isWrite: boolean; +begin + Result := false; +end; + +function TFhirFeatureNegotiation.owningResource: String; +begin + Result := ''; +end; + +function TFhirFeatureNegotiation.Name: String; +begin + Result := 'feature-query'; +end; + +function TFhirFeatureNegotiation.Types: TArray; +begin + Result := []; +end; + +function TFhirFeatureNegotiation.CreateDefinition(base: String): TFHIROperationDefinitionW; +begin + Result := nil; +end; + +function TFhirFeatureNegotiation.Execute(context: TOperationContext; manager: TFHIROperationEngine; request: TFHIRRequest; response: TFHIRResponse; tt: TTimeTracker): String; +begin + raise EFslException.create('not done yet'); +end; + +function TFhirFeatureNegotiation.formalURL: String; +begin + result := 'http://www.hl7.org/fhir/uv/capstmt/OperationDefinition/feature-query'; +end; + { TFhirDeleteMetaDataOperation } function TFhirDeleteMetaDataOperation.CreateDefinition(base: String): TFHIROperationDefinitionW; @@ -3822,7 +3874,7 @@ procedure TFHIRNativeStorageServiceR4.SeeResource(key, vkey, pvkey: integer; id: if (resource.ResourceType in [frtValueSet, frtConceptMap, frtStructureDefinition, frtQuestionnaire, frtSubscription]) and (needsSecure or ((resource.meta <> nil) and not resource.meta.securityList.IsEmpty)) then raise ERestfulException.Create('TFHIRNativeStorageService.SeeResource', 400, itBusinessRule, 'Resources of type '+CODES_TFHIRResourceType[resource.ResourceType]+' are not allowed to have a security label on them', langList); - p := TFHIRResourceProxy.Create(factory.link, resource.link); + p := TFHIRResourceProxy.Create('', factory.link, resource.link); try if resource.ResourceType = frtValueSet then begin @@ -3833,9 +3885,9 @@ procedure TFHIRNativeStorageServiceR4.SeeResource(key, vkey, pvkey: integer; id: else if resource.ResourceType in [frtConceptMap, frtCodeSystem] then ServerContext.TerminologyServer.SeeTerminologyResource(p) else if resource.ResourceType = frtStructureDefinition then - ServerContext.ValidatorContext.seeResource(resource as TFhirStructureDefinition) + ServerContext.ValidatorContext.seeResource('', resource as TFhirStructureDefinition) else if resource.ResourceType = frtQuestionnaire then - ServerContext.ValidatorContext.seeResource(resource as TFhirQuestionnaire); + ServerContext.ValidatorContext.seeResource('', resource as TFhirQuestionnaire); finally p.free; end; diff --git a/server/operations_r4b.pas b/server/operations_r4b.pas index 3e68d16aa..3ec2cbabe 100644 --- a/server/operations_r4b.pas +++ b/server/operations_r4b.pas @@ -3822,7 +3822,7 @@ procedure TFHIRNativeStorageServiceR4B.SeeResource(key, vkey, pvkey: integer; id if (resource.ResourceType in [frtValueSet, frtConceptMap, frtStructureDefinition, frtQuestionnaire, frtSubscription]) and (needsSecure or ((resource.meta <> nil) and not resource.meta.securityList.IsEmpty)) then raise ERestfulException.Create('TFHIRNativeStorageService.SeeResource', 400, itBusinessRule, 'Resources of type '+CODES_TFHIRResourceType[resource.ResourceType]+' are not allowed to have a security label on them', langList); - p := TFHIRResourceProxy.Create(factory.link, resource.link); + p := TFHIRResourceProxy.Create('', factory.link, resource.link); try if resource.ResourceType = frtValueSet then begin @@ -3833,9 +3833,9 @@ procedure TFHIRNativeStorageServiceR4B.SeeResource(key, vkey, pvkey: integer; id else if resource.ResourceType in [frtConceptMap, frtCodeSystem] then ServerContext.TerminologyServer.SeeTerminologyResource(p) else if resource.ResourceType = frtStructureDefinition then - ServerContext.ValidatorContext.seeResource(resource as TFhirStructureDefinition) + ServerContext.ValidatorContext.seeResource('', resource as TFhirStructureDefinition) else if resource.ResourceType = frtQuestionnaire then - ServerContext.ValidatorContext.seeResource(resource as TFhirQuestionnaire); + ServerContext.ValidatorContext.seeResource('', resource as TFhirQuestionnaire); finally p.free; end; diff --git a/server/operations_r5.pas b/server/operations_r5.pas index f3f6b4f4a..2b6ac51c4 100644 --- a/server/operations_r5.pas +++ b/server/operations_r5.pas @@ -3781,7 +3781,7 @@ procedure TFHIRNativeStorageServiceR5.SeeResource(key, vkey, pvkey: integer; id: if (resource.ResourceType in [frtValueSet, frtConceptMap, frtStructureDefinition, frtQuestionnaire, frtSubscription]) and (needsSecure or ((resource.meta <> nil) and not resource.meta.securityList.IsEmpty)) then raise ERestfulException.Create('TFHIRNativeStorageService.SeeResource', 400, itBusinessRule, 'Resources of type '+CODES_TFHIRResourceType[resource.ResourceType]+' are not allowed to have a security label on them', langList); - p := TFHIRResourceProxy.Create(factory.link, resource.link); + p := TFHIRResourceProxy.Create('', factory.link, resource.link); try if resource.ResourceType = frtValueSet then begin @@ -3792,9 +3792,9 @@ procedure TFHIRNativeStorageServiceR5.SeeResource(key, vkey, pvkey: integer; id: else if resource.ResourceType in [frtConceptMap, frtCodeSystem] then ServerContext.TerminologyServer.SeeTerminologyResource(p) else if resource.ResourceType = frtStructureDefinition then - ServerContext.ValidatorContext.seeResource(resource as TFhirStructureDefinition) + ServerContext.ValidatorContext.seeResource('', resource as TFhirStructureDefinition) else if resource.ResourceType = frtQuestionnaire then - ServerContext.ValidatorContext.seeResource(resource as TFhirQuestionnaire); + ServerContext.ValidatorContext.seeResource('', resource as TFhirQuestionnaire); finally p.free; end; diff --git a/server/package_spider.pas b/server/package_spider.pas index 196a19084..c36f52068 100644 --- a/server/package_spider.pas +++ b/server/package_spider.pas @@ -80,6 +80,10 @@ TZulipTracker = class (TFslObject) procedure send; end; + TCrawlerLogMode = (clmStart, clmHeader, clmError, clmWarning, clmNote); + + { TPackageUpdater } + TPackageUpdater = class (TFslObject) private FDB : TFDBConnection; @@ -89,17 +93,21 @@ TPackageUpdater = class (TFslObject) FTotalBytes : Cardinal; FIni : TIniFile; FZulip : TZulipTracker; + FCrawlerLog : TJsonObject; + procedure DoSendEmail(dest, subj, body : String); procedure log(msg, source : String; error : boolean); + procedure clog(clItem : TJsonObject; level, msg : String); function fetchUrl(url, mimetype : string) : TBytes; function fetchJson(url : string) : TJsonObject; function fetchXml(url : string) : TMXmlElement; function hasStored(guid : String) : boolean; - procedure store(source, url, guid : String; date : TFslDateTime; package : Tbytes; idver : String); + procedure SetCrawlerLog(AValue: TJsonObject); + procedure store(source, url, guid : String; date : TFslDateTime; package : Tbytes; idver : String; clItem : TJsonObject); - procedure updateItem(source : String; item : TMXmlElement; i : integer; pr : TPackageRestrictions); + procedure updateItem(source : String; item : TMXmlElement; i : integer; pr : TPackageRestrictions; clFeed : TJsonObject); procedure updateTheFeed(url, source, email : String; pr : TPackageRestrictions); public constructor Create(zulip : TZulipTracker); @@ -108,6 +116,7 @@ TPackageUpdater = class (TFslObject) procedure update(DB : TFDBConnection); property errors : String read FErrors; + property CrawlerLog : TJsonObject read FCrawlerLog write SetCrawlerLog; property OnSendEmail : TSendEmailEvent read FOnSendEmail write FOnSendEmail; class procedure test(db : TFDBManager); @@ -182,10 +191,12 @@ constructor TPackageUpdater.Create(zulip: TZulipTracker); begin inherited Create; FZulip := zulip; + FCrawlerLog := TJsonObject.create; end; destructor TPackageUpdater.Destroy; begin + FCrawlerLog.free; FZulip.free; inherited; end; @@ -204,6 +215,8 @@ procedure TPackageUpdater.DoSendEmail(dest, subj, body: String); function TPackageUpdater.fetchJson(url: string): TJsonObject; begin + if Logging.shuttingDown then + Abort; result := TJSONParser.Parse(fetchUrl(url, 'application/json')); end; @@ -211,6 +224,8 @@ function TPackageUpdater.fetchUrl(url, mimetype: string): TBytes; var fetcher : TInternetFetcher; begin + if Logging.shuttingDown then + Abort; fetcher := TInternetFetcher.Create; try fetcher.URL := url+'?'+TFslDateTime.makeLocal().toHL7; @@ -226,6 +241,8 @@ function TPackageUpdater.fetchUrl(url, mimetype: string): TBytes; function TPackageUpdater.fetchXml(url: string): TMXmlElement; begin + if Logging.shuttingDown then + Abort; result := TMXmlParser.Parse(fetchUrl(url, 'application/xml'), [xpResolveNamespaces, xpDropWhitespace, xpDropComments, xpHTMLEntities]); end; @@ -238,6 +255,12 @@ function TPackageUpdater.hasStored(guid: String): boolean; FDB.Terminate; end; +procedure TPackageUpdater.SetCrawlerLog(AValue: TJsonObject); +begin + FCrawlerLog.free; + FCrawlerLog:=AValue; +end; + procedure TPackageUpdater.log(msg, source: String; error : boolean); begin if error then @@ -295,24 +318,34 @@ class procedure TPackageUpdater.processURLs(npm : TNpmPackage; ts : TStringList) end; end; -procedure TPackageUpdater.store(source, url, guid: String; date : TFslDateTime; package: Tbytes; idver : String); +procedure TPackageUpdater.store(source, url, guid: String; date : TFslDateTime; package: Tbytes; idver : String; clItem : TJsonObject); var npm : TNpmPackage; id, version, description, canonical, fhirVersion : String; kind : TFHIRPackageKind; ts : TStringList; + cl : TJsonObject; begin + if Logging.shuttingDown then + Abort; npm := TNpmPackage.fromPackage(package, source+'#'+guid, nil, true); try id := npm.name; version := npm.version; if (id+'#'+version <> idver) then + begin log('Warning processing '+idver+': actually found '+id+'#'+version+' in the package', source, true); + clog(clItem, 'warning', 'actually found '+id+'#'+version+' in the package'); + end; + description := npm.description; kind := npm.kind; canonical := npm.canonical; if npm.notForPublication then + begin log('Warning processing '+idver+': this package is not suitable for publication (likely broken links)', source, true); + clog(clItem, 'warning', 'not suitable for publication (likely broken links)'); + end; fhirVersion := npm.fhirVersion; if not isValidPackageId(id) then raise EPackageCrawlerException.Create('NPM Id "'+id+'" is not valid from '+source); @@ -321,6 +354,7 @@ procedure TPackageUpdater.store(source, url, guid: String; date : TFslDateTime; if (canonical = '') then begin log('Warning processing '+idver+': No canonical found in npm (from '+url+')', source, true); + clog(clItem, 'warning', 'No canonical found in npm (from '+url+')'); canonical := 'http://simplifier.net/packages/fictitious/'+id; end; if not isAbsoluteUrl(canonical) then @@ -364,15 +398,18 @@ procedure TPackageUpdater.update(DB : TFDBConnection); arr : TJsonArray; i : integer; pr : TPackageRestrictions; + start : UInt64; begin FIni := TIniFile.Create(tempFile('package-spider.ini')); try + start := GetTickCount64; log('Start Package Scan', '', false); FTotalBytes := 0; FErrors := ''; FDB := DB; try log('Fetch '+MASTER_URL, '', false); + FCrawlerLog.str['master'] := MASTER_URL; json := fetchJson(MASTER_URL); try pr := TPackageRestrictions.Create(json.arr['package-restrictions'].Link); @@ -386,10 +423,18 @@ procedure TPackageUpdater.update(DB : TFDBConnection); finally json.free; end; + FCrawlerLog['run-time'] := DescribePeriodMS(GetTickCount64 - start); except + on e : EAbort do + begin + Log('Terminate Package Spider - shutting down', MASTER_URL, true); + FCrawlerLog['run-time'] := DescribePeriodMS(GetTickCount64 - start); + end; on e : Exception do begin - Log('Exception Processing Registry: '+e.Message, MASTER_URL, true) + Log('Exception Processing Registry: '+e.Message, MASTER_URL, true); + FCrawlerLog['run-time'] := DescribePeriodMS(GetTickCount64 - start); + FCrawlerLog['fatal-exception'] := e.Message; end; end; //try @@ -427,13 +472,20 @@ procedure TPackageUpdater.updateTheFeed(url, source, email: String; pr : TPackag channel : TMXmlElement; item : TMXmlElement; i : integer; + clFeed : TJsonObject; + start : UInt64; begin + if Logging.shuttingDown then + Abort; + clFeed := FCrawlerLog.forceArr['feeds'].addObject; + clFeed['url'] := url; + FFeedErrors := ''; + log('Fetch '+url, source, false); + start := GetTickCount64; try - log('Fetch '+url, source, false); - FFeedErrors := ''; - xml := fetchXml(url); try + clFeed['fetch-time'] := DescribePeriodMS(GetTickCount64 - start); for channel in xml.first.Children do begin if (channel.Name = 'channel') then @@ -443,7 +495,7 @@ procedure TPackageUpdater.updateTheFeed(url, source, email: String; pr : TPackag begin if (item.Name = 'item') then begin - updateItem(url, item, i, pr); + updateItem(url, item, i, pr, clFeed); inc(i); end; end; @@ -457,6 +509,8 @@ procedure TPackageUpdater.updateTheFeed(url, source, email: String; pr : TPackag except on e : Exception do begin + clFeed['exception'] := e.Message; + clFeed['fail-time'] := DescribePeriodMS(GetTickCount64 - start); log('Exception processing feed: '+url+': '+e.Message, source, false); if (email <> '') then DoSendEmail(email, 'Exception Processing '+url, e.Message); @@ -464,44 +518,88 @@ procedure TPackageUpdater.updateTheFeed(url, source, email: String; pr : TPackag end; end; -procedure TPackageUpdater.updateItem(source : String; item: TMXmlElement; i : integer; pr : TPackageRestrictions); +procedure TPackageUpdater.updateItem(source : String; item: TMXmlElement; i : integer; pr : TPackageRestrictions; clFeed : TJsonObject); var guid : String; content : TBytes; date : TFslDateTime; id, url, d, list: String; + clItem : TJsonObject; + start : UInt64; begin - url := '??pck'; + if Logging.shuttingDown then + Abort; + url := '[link not found]'; + clItem := clFeed.forceArr['items'].addObject; if item.element('guid') = nil then begin log('Error processing item from '+source+'#item['+inttostr(i)+']: no guid provided', source, true); + clog(clItem, 'error', 'no guid provided'); exit; end; guid := item.element('guid').Text; + start := GetTickCount64; + clItem['guid'] := guid; + clItem['status'] := '??'; try - id := item.element('title').Text; + id := item.element('title').Text; + clItem['id'] := id; + if (item.element('notForPublication') <> nil) and ('true' = item.element('notForPublication').text) then + begin + clItem['status'] := 'not for publication'; + clog(clItem, 'error', 'not for publication'); + exit; + end; if pr.isOk(id, source, list) then begin - if (not hasStored(guid)) then + if (hasStored(guid)) then + begin + clItem['status'] := 'Already Processed'; + end + else begin - d := item.element('pubDate').Text.Replace(' ', ' ').Substring(5); + d := item.element('pubDate').Text.toLower.Replace(' ', ' '); + if (d.substring(0, 6).contains(',')) then + d := d.substring(d.indexOf(',')+1) + else if StringStartsWith(d, ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']) then + d := d.substring(d.indexOf(' ')+1); + d := d.trim; if (d.length > 2) and (d[2] = ' ') and StringIsInteger16(d[1]) then d := '0'+d; - date := TFslDateTime.fromFormat('dd mmm yyyy hh:nn:ss', d); + try + date := TFslDateTime.fromFormat('dd mmm yyyy hh:nn:ss', d); + except + date := TFslDateTime.fromFormat('dd mmmm yyyy hh:nn:ss', d); + end; url := fix(item.element('link').Text); - log('Fetch '+url, source, false); + log('Fetch '+url, source, false); + clItem['url'] := url; content := fetchUrl(url, 'application/tar+gzip'); - store(source, url, guid, date, content, id); + store(source, url, guid, date, content, id, clItem); + clFeed['process-time'] := DescribePeriodMS(GetTickCount64 - start); + clItem['status'] := 'Fetched'; end; end else begin - log('The package '+id+' is not allowed to come from '+source+' (allowed: '+list+')', source, true); + if not (source.contains('simplifier.net')) then + begin + log('The package '+id+' is not allowed to come from '+source+' (allowed: '+list+')', source, true); + clog(clItem, 'error', 'The package '+id+' is not allowed to come from '+source+' (allowed: '+list+')'); + clItem['status'] := 'prohibited source'; + end + else + begin + clItem['status'] := 'ignored'; + clog(clItem, 'error', 'The package '+id+' is published through another source'); + end; end; except on e : Exception do begin log('Exception processing item: '+guid+' from '+url+': '+e.Message, source, true); + clItem['status'] := 'Exception'; + clog(clItem, 'error', e.Message); end; end; end; @@ -617,11 +715,23 @@ function genHash(bytes : TBytes) : String; begin hash := TIdHashSHA1.Create; try + {$IFDEF DELPHI} + raise EFslException.Create('Not Implemented Yet'); + {$ELSE} result := hash.HashBytesAsHex(bytes); + {$ENDIF} finally hash.free; end; end; - + +procedure TPackageUpdater.clog(clItem : TJsonObject; level, msg : String); +var + cl : TJsonObject; +begin + cl := clItem.forceArr['messages'].addObject; + cl.vStr['type'] := level; + cl.vStr['message'] := msg; +end; end. diff --git a/server/scim_server.pas b/server/scim_server.pas index 88a0660ac..b26a96670 100644 --- a/server/scim_server.pas +++ b/server/scim_server.pas @@ -383,7 +383,7 @@ procedure TSCIMServer.EncodeErrorResponse(response: TIdHTTPResponseInfo; status: function TSCIMServer.GetNextUserKey: Integer; begin - lock.Lock; + lock.Lock('GetNextUserKey'); try inc(lastUserkey); result := lastUserkey; @@ -394,7 +394,7 @@ function TSCIMServer.GetNextUserKey: Integer; function TSCIMServer.GetNextUserIndexKey: Integer; begin - lock.Lock; + lock.Lock('GetNextUserIndexKey'); try inc(lastUserIndexKey); result := lastUserIndexKey; @@ -1144,11 +1144,11 @@ procedure TSCIMServer.processWebUserList(context: TIdContext; session : TFhirSes var variables : TFslMap; conn : TFDBConnection; - b : TStringBuilder; + b : TFslStringBuilder; user : TSCIMUser; i : integer; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try conn := db.GetConnection('scim.user.search'); try diff --git a/server/search_base.pas b/server/search_base.pas index 386c2db11..ea51223f1 100644 --- a/server/search_base.pas +++ b/server/search_base.pas @@ -33,7 +33,7 @@ interface uses - SysUtils, + SysUtils, Classes, fsl_base, fsl_utilities, fsl_http, fhir_objects, fhir_common, fhir_indexing, indexing;{, @@ -61,7 +61,7 @@ TSearchParameter = class (TFslObject) procedure checkOrderingPrefix; procedure processPrefix; - procedure build(b : TStringBuilder); + procedure build(b : TFslStringBuilder); public destructor Destroy; override; function link : TSearchParameter; overload; @@ -81,12 +81,18 @@ TSearchParameter = class (TFslObject) TSearchParser = class (TFslObject) private + FElements : TStringList; + FAllowedParams : TStringList; FSearchControls : TFHIRSearchControlParameterSet; function processParam(indexes : TFHIRIndexInformation; resourceType, name, value : String) : TSearchParameter; public constructor Create(searchControls : TFHIRSearchControlParameterSet); + destructor Destroy; override; + function parse(indexes : TFHIRIndexInformation; resourceType : String; pm : THTTPParameters) : TFslList; function buildUrl(base : String; search : TFslList): String; + property Elements : TStringList read FElements; + property allowedParams : TStringList read FAllowedParams; end; const @@ -97,7 +103,7 @@ implementation { TSearchParameter } -procedure TSearchParameter.build(b: TStringBuilder); +procedure TSearchParameter.build(b: TFslStringBuilder); begin if (FControl <> scpNull) then b.append(CODES_TFHIRSearchControlParameter[FControl]) @@ -241,10 +247,10 @@ procedure TSearchParameter.SetNext(const Value: TSearchParameter); function TSearchParser.buildUrl(base : String; search: TFslList): String; var - b : TStringBuilder; + b : TFslStringBuilder; sp : TSearchParameter; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(base); b.append('?'); @@ -305,7 +311,7 @@ function TSearchParser.processParam(indexes : TFHIRIndexInformation; resourceTyp n := l; index := indexes.Indexes.getByName(resourceType, n); - if index <> nil then + if (index <> nil) and ((FAllowedParams.Count = 0) or (FAllowedParams.indexOf(n) > -1)) then begin result := TSearchParameter.Create; try @@ -382,6 +388,8 @@ function TSearchParser.processParam(indexes : TFHIRIndexInformation; resourceTyp result := TSearchParameter.Create; result.control := cp; result.value := value; + if (cp = scpElements) then + FElements.CommaText := value; end; end; end; @@ -390,6 +398,15 @@ constructor TSearchParser.Create(searchControls: TFHIRSearchControlParameterSet) begin inherited Create; FSearchControls := searchControls; + FAllowedParams := TStringList.create; + FElements := TStringList.create; +end; + +destructor TSearchParser.Destroy; +begin + FAllowedParams.free; + FElements.free; + inherited Destroy; end; end. diff --git a/server/server_constants.pas b/server/server_constants.pas index 2602e1b68..9c3b8635c 100644 --- a/server/server_constants.pas +++ b/server/server_constants.pas @@ -28,6 +28,7 @@ POSSIBILITY OF SUCH DAMAGE. } +{$i fhir.inc} interface @@ -45,7 +46,15 @@ interface DEFAULT_DWELL_TIME_MIN = 30; DEFAULT_DWELL_TIME = DEFAULT_DWELL_TIME_MIN / (24*60) {min}; - + {$IFDEF LINUX} + SERVER_OS = 'LINUX'; + {$ENDIF} + {$IFDEF OSX} + SERVER_OS = 'OSX'; + {$ENDIF} + {$IFDEF WINDOWS} + SERVER_OS = 'WINDOWS'; + {$ENDIF} implementation diff --git a/server/server_context.pas b/server/server_context.pas index b21481f3e..baa39deb3 100644 --- a/server/server_context.pas +++ b/server/server_context.pas @@ -205,7 +205,7 @@ destructor TQuestionnaireCache.Destroy; function TQuestionnaireCache.cacheSize(magic : integer) : UInt64; begin - FLock.Lock; + FLock.Lock('cacheSize'); try result := FQuestionnaires.sizeInBytes(magic) + FForms.sizeInBytes(magic); finally @@ -227,7 +227,7 @@ procedure TQuestionnaireCache.clear; procedure TQuestionnaireCache.clearCache; begin - FLock.Lock; + FLock.Lock('clearCache'); try FQuestionnaires.Clear; FForms.Clear; @@ -505,7 +505,7 @@ procedure TFHIRServerContext.updateSettings; procedure TFHIRServerContext.seeMap(map: TFHIRStructureMapW); begin - FLock.Lock; + FLock.Lock('seeMap'); try FMaps.AddOrSetValue(map.url, map); finally @@ -515,7 +515,7 @@ procedure TFHIRServerContext.seeMap(map: TFHIRStructureMapW); procedure TFHIRServerContext.seeNamingSystem(key : integer; ns: TFhirNamingSystemW); begin - FLock.Lock; + FLock.Lock('seeNamingSystem'); try FNamingSystems.AddOrSetValue(inttostr(key), ns); finally @@ -599,7 +599,7 @@ function TFHIRServerContext.getMaps: TFslMap; var s : String; begin - FLock.Lock; + FLock.Lock('getMaps'); try result := TFslMap.Create('maps'); for s in FMaps.Keys do @@ -614,7 +614,7 @@ function TFHIRServerContext.oid2Uri(oid: String): String; ns : TFHIRNamingSystemW; begin result := ''; - FLock.Lock; + FLock.Lock('oid2Uri'); try result := UriForKnownOid(oid); if (result = '') then diff --git a/server/server_stats.pas b/server/server_stats.pas index 09be3140e..2667feaf6 100644 --- a/server/server_stats.pas +++ b/server/server_stats.pas @@ -233,11 +233,11 @@ procedure TStatusRecords.addToList(status: TStatusRecord); function TStatusRecords.asCSV: String; var - b : TStringBuilder; + b : TFslStringBuilder; i : integer; s, n: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try s := 'Minutes'+#9+'Date/Time'+#9+'Memory'+#9+'Threads'+#9+ 'Request Count'+#9+'Total Requests'+#9+ @@ -258,11 +258,11 @@ function TStatusRecords.asCSV: String; function TStatusRecords.asCSVLine: String; var - b : TStringBuilder; + b : TFslStringBuilder; i : integer; s, n : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try s := 'Minutes'+#9+'Date/Time'+#9+'Memory'+#9+'Threads'+#9+ 'Request Count'+#9+'Total Requests'+#9+ @@ -284,11 +284,11 @@ function TStatusRecords.asCSVLine: String; function TStatusRecords.asHtml: String; var - b : TStringBuilder; + b : TFslStringBuilder; i : integer; s, n : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append(''+#13#10); s := '
          MinutesDate/TimeMemoryThreads'+ diff --git a/server/server_testing.pas b/server/server_testing.pas index 681e43f07..6d9563e72 100644 --- a/server/server_testing.pas +++ b/server/server_testing.pas @@ -90,17 +90,27 @@ procedure RunTestGui(ini : TFHIRServerConfigFile); {$ENDIF} end; -procedure RunTestConsole(ini : TFHIRServerConfigFile); +procedure RunTestConsole(ini : TFHIRServerConfigFile; params : TCommandLineParameters); {$IFDEF FPC} var app : TIdeTesterConsoleRunner; + mode : String; begin Logging.Log('Run Tests (Console)'); ShowObjectLeaks := hasCommandLineParam('leak-report'); app := TIdeTesterConsoleRunner.Create(nil); app.Initialize; - app.Title := 'FPCUnit Console test runner'; + app.Title := 'FPCUnit Console test runner'; app.Mode := cpmVerbose; + if (params.get('mode', mode)) then + begin + if (mode = 'verbose') then + app.Mode := cpmVerbose + else if (mode = 'brief') then + app.Mode := cpmBrief + else if (mode = 'none') then + app.Mode := cpmNone + end; app.sparse := true; app.Run; app.free; @@ -108,7 +118,7 @@ procedure RunTestConsole(ini : TFHIRServerConfigFile); {$ELSE} begin DUnitTestRunner.RunRegisteredTests; - if not hasCommandLineParam('-ci') then + if not params.has('-ci') then begin System.Write('Done.. press key to quit.'); System.Readln; @@ -119,7 +129,7 @@ procedure RunTestConsole(ini : TFHIRServerConfigFile); procedure runTests(params : TCommandLineParameters; ini : TFHIRServerConfigFile); begin test_registry.registerTests(params); - if hasCommandLineParam('gui') then + if params.has('gui') then RunTestGui(ini) {$IFDEF FPC} else if IsRunningIDETests then @@ -131,7 +141,7 @@ procedure runTests(params : TCommandLineParameters; ini : TFHIRServerConfigFile) else begin Logging.LogToConsole := false; - RunTestConsole(ini); + RunTestConsole(ini, params); end; end; diff --git a/server/session.pas b/server/session.pas index dc451d27d..3b16e255a 100644 --- a/server/session.pas +++ b/server/session.pas @@ -135,7 +135,7 @@ TFhirSession = class (TFslObject) constructor Create(worker : TFHIRWorkerContextWithFactory; secure : boolean); destructor Destroy; Override; function Link : TFhirSession; overload; - procedure describe(b : TStringBuilder); + procedure describe(b : TFslStringBuilder); Property scopes : String read GetScopes write SetScopes; { @@ -254,6 +254,49 @@ TFhirSession = class (TFslObject) function isAnonymous : boolean; end; + {$IFDEF DEV_FEATURES} + { TFhirFeatureQueryItem } + + TFhirFeatureQueryItem = class (TFslObject) + private + FFeature : String; + FContext : String; + FValues : TFslList; + public + constructor create(feature, context : String; value : TFHIRObject); + destructor Destroy; override; + class function fromParam(factory : TFHIRFactory; param : String) : TFhirFeatureQueryItem; + function toParam : String; + property Feature : String read FFeature write FFeature; + property Context : String read FContext write FContext; + property values : TFslList read FValues; + end; + + TNullOrBoolean = (nbNone, nbFalse, nbTrue); + TFeatureQueryProcessingStatus = (fqpsUnknown, fqpsUnknownFeature, fqpsUnknownContext, fqpsUnableToEvaluate, fqpsAllOk); + + { TFhirFeatureQueryAnswer } + + TFhirFeatureQueryAnswer = class (TFslObject) + private + FFeature : String; + FContext : String; + FProcessingStatus : TFeatureQueryProcessingStatus; + FValues : TFslList; + FAnswer : TNullOrBoolean; + public + constructor create(feature, context : String; value : TFHIRObject); + constructor create(feature, context : String; answer : boolean); + destructor Destroy; override; + property Feature : String read FFeature write FFeature; + property Context : String read FContext write FContext; + property ProcessingStatus : TFeatureQueryProcessingStatus read FProcessingStatus write FProcessingStatus; + property Values : TFslList read FValues; + property Answer : TNullOrBoolean read FAnswer write FAnswer; + procedure setAnswer(value : boolean); + end; + {$ENDIF} + { A FHIR request. @@ -311,7 +354,10 @@ TFHIRRequest = class (TFslObject) FVersion: TFHIRVersion; FTransactionResource: TFhirResourceV; FSecureURL: String; - FContentLanguage : String; + FContentLanguage : String; + {$IFDEF DEV_FEATURES} + FRequiredFeatures : TFslList; + {$ENDIF} procedure SetResource(const Value: TFhirResourceV); procedure SetSource(const Value: TFslBuffer); procedure SetSession(const Value: TFhirSession); @@ -375,7 +421,10 @@ TFHIRRequest = class (TFslObject) Preferred language of the requester (used for error messages) } Property LangList : THTTPLanguageList read FLangList write SetLangList; - + + {$IFDEF DEV_FEATURES} + property requiredFeatures : TFslList read FRequiredFeatures; + {$ENDIF} published { The full URL of the original request, if the request was made on a RESTful interface (else empty) @@ -665,6 +714,11 @@ TFHIRResponse = class (TFslObject) end; +{$IFDEF DEV_FEATURES} +Const CODES_TFeatureQueryProcessingStatus : array [TFeatureQueryProcessingStatus] of String = ('unknown', 'feature', 'context', 'unsure', 'all-ok'); +{$ENDIF} + + Function IdTail(s : String):String; Function IdHead(s : String):String; @@ -1076,11 +1130,17 @@ constructor TFHIRRequest.Create(worker: TFHIRWorkerContextWithFactory; origin : FOrigin := origin; FCompartmentInformation := compartmentInformation; FElements := TStringList.Create; - Version := worker.Factory.version; + Version := worker.Factory.version; + {$IFDEF DEV_FEATURES} + FRequiredFeatures := TFslList.create; + {$ENDIF} end; destructor TFHIRRequest.Destroy; -begin +begin + {$IFDEF DEV_FEATURES} + FRequiredFeatures.free; + {$ENDIF} FLangList.free; FElements.free; FAdaptor.free; @@ -1487,7 +1547,7 @@ constructor TFhirSession.Create(worker : TFHIRWorkerContextWithFactory; secure : FCompartments := TFslList.Create; end; -procedure TFhirSession.describe(b: TStringBuilder); +procedure TFhirSession.describe(b: TFslStringBuilder); var id : TFHIRCompartmentId; first : boolean; @@ -1617,6 +1677,103 @@ procedure TFhirSession.SetUser(const Value: TSCIMUser); end; +{$IFDEF DEV_FEATURES} +{ TFhirFeatureQueryItem } + +constructor TFhirFeatureQueryItem.create(feature, context: String; value: TFHIRObject); +begin + inherited create; + FFeature := feature; + FContext := context; + FValues := TFslList.create; + if (value <> nil) then + FValues.add(value); +end; + +destructor TFhirFeatureQueryItem.Destroy; +begin + FValues.free; + inherited Destroy; +end; + +class function TFhirFeatureQueryItem.fromParam(factory : TFHIRFactory; param: String): TFhirFeatureQueryItem; +var + ss, f, c, v: String; +begin + if (param.contains('(')) and (param.endsWith(')')) then + begin + StringSplit(param, '(', ss, v); + v := copy(v, 1, length(v)-1); + end + else + ss := param; + if (ss.contains('@') ) then + StringSplit(ss, '@', f, c) + else + f := ss; + result := TFhirFeatureQueryItem.create(f, c, factory.makeString(v)); +end; + +function TFhirFeatureQueryItem.toParam: String; +var + i : integer; +begin + result := FFeature; + if FContext <> '' then + result := result + '@'+FContext; + if FValues.count > 0 then + begin + result := result+'('; + for i := 0 to FValues.count - 1 do + begin + if i > 0 then + result := result + ','; + result := result + FValues[i].toString; + end; + result := result + ')'; + end; +end; + +{ TFhirFeatureQueryAnswer } + +constructor TFhirFeatureQueryAnswer.create(feature, context: String; value : TFHIRObject); +begin + inherited Create; + FFeature := feature; + FContext := context; + FValues := TFslList.create; + if (value <> nil) then + FValues.add(value); +end; + +constructor TFhirFeatureQueryAnswer.create(feature, context: String; answer: boolean); +begin + inherited Create; + FFeature := feature; + FContext := context; + FValues := TFslList.create; + if answer then + FAnswer := nbTrue + else + FAnswer := nbFalse; +end; + +destructor TFhirFeatureQueryAnswer.Destroy; +begin + FValues.Free; + inherited Destroy; +end; + +procedure TFhirFeatureQueryAnswer.setAnswer(value: boolean); +begin + if value then + FAnswer := nbTrue + else + FAnswer := nbFalse; +end; + +{$ENDIF} + { TFHIRFormatAdaptor } function TFHIRFormatAdaptor.Link: TFHIRFormatAdaptor; diff --git a/server/session_manager.pas b/server/session_manager.pas index 18e231b65..0cf201f76 100644 --- a/server/session_manager.pas +++ b/server/session_manager.pas @@ -132,7 +132,7 @@ function TFHIRSessionManager.count: integer; procedure TFHIRSessionManager.Clear; begin - FLock.Lock; + FLock.Lock('Clear'); try FSessions.Clear; finally @@ -724,9 +724,9 @@ procedure TFHIRSessionManager.Sweep; function TFHIRSessionManager.DumpSessions: String; var session: TFhirSession; - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(''#13#10); b.Append(''); diff --git a/server/storage.pas b/server/storage.pas index 740397f79..d80ff820d 100644 --- a/server/storage.pas +++ b/server/storage.pas @@ -73,6 +73,7 @@ TOperationContext = class (TFslObject) const OP_MODES_CHECK = [opmRestful, opmInternal]; OP_CODES_NO_SEC_ON_INSERT = [opmSweep]; + DEAD_CHECK_LIMIT = 60000; type TFHIRStorageService = class; @@ -236,6 +237,7 @@ TFHIROperationEngine = class (TFslObject) procedure NotFound(request: TFHIRRequest; response : TFHIRResponse); procedure VersionNotFound(request: TFHIRRequest; response : TFHIRResponse); procedure TypeNotFound(request: TFHIRRequest; response : TFHIRResponse); + procedure deadCheck(start : UInt64); Property OnPopulateConformance : TPopulateConformanceEvent read FOnPopulateConformance write FOnPopulateConformance; property OnCreateBuilder : TCreateBundleBuilderEvent read FOnCreateBuilder write FOnCreateBuilder; @@ -256,6 +258,9 @@ TFHIROperationEngine = class (TFslObject) procedure AuditRest(session : TFhirSession; intreqid, extreqid, ip, resourceName : string; id, ver : String; verkey : integer; op : TFHIRCommandType; provenance : TFhirProvenanceW; opName : String; httpCode : Integer; name, message : String; patients : TArray); overload; virtual; abstract; function patientIds(request : TFHIRRequest; res : TFHIRResourceV) : TArray; virtual; abstract; function DoSearch(request: TFHIRRequest; requestType: String; params: String) : TFHIRBundleW; virtual; + {$IFDEF DEV_FEATURES} + procedure processFeature(item : TFhirFeatureQueryItem; answer : TFhirFeatureQueryAnswer); virtual; + {$ENDIF} property clientCacheManager : TClientCacheManager read GetClientCacheManager; property Operations : TFslList read FOperations; @@ -653,6 +658,13 @@ function TFHIROperationEngine.DoSearch(request: TFHIRRequest; raise EFHIRException.Create('This server does not implement the "DoSearch" function'); end; +{$IFDEF DEV_FEATURES} +procedure TFHIROperationEngine.processFeature(item: TFhirFeatureQueryItem; answer: TFhirFeatureQueryAnswer); +begin + // nothing +end; +{$ENDIF} + procedure TFHIROperationEngine.NoMatch(request: TFHIRRequest; response: TFHIRResponse); begin response.HTTPCode := 404; @@ -707,6 +719,17 @@ function TFHIROperationEngine.check(response: TFHIRResponse; test: boolean; code end; end; +procedure TFHIROperationEngine.deadCheck(start : UInt64); +var + now : UInt64; + delta : UInt64; +begin + now := GetTickCount64; + delta := now - start; + if (delta > DEAD_CHECK_LIMIT) then + raise EWebServerException.create(500, 'Request took too long to process ('+inttostr(DEAD_CHECK_LIMIT div 1000)+'sec)'); +end; + function TFHIROperationEngine.Execute(context: TOperationContext; request: TFHIRRequest; response: TFHIRResponse; tt : TTimeTracker): String; begin diff --git a/server/subscriptions.pas b/server/subscriptions.pas index e05d01198..0675db452 100644 --- a/server/subscriptions.pas +++ b/server/subscriptions.pas @@ -877,7 +877,7 @@ procedure TSubscriptionManager.sendByWebSocket(conn : TFDBConnection; id: String if wsPersists(subst.resource.id, b) then begin - FLock.Lock; + FLock.Lock('sendByWebSocket'); try inc(FLastWebSocketKey); key := FLastWebSocketKey; @@ -1680,7 +1680,7 @@ function TSubscriptionManager.wsConnect(id : String; persistent : boolean) : boo info := TWebSocketQueueInfo.Create; try info.Persistent := persistent; - FLock.Lock; + FLock.Lock('wsConnect'); try result := not FSemaphores.ContainsKey(id); if result then @@ -1695,7 +1695,7 @@ function TSubscriptionManager.wsConnect(id : String; persistent : boolean) : boo procedure TSubscriptionManager.wsDisconnect(id : String); begin - FLock.Lock; + FLock.Lock('wsDisconnect'); try if not FSemaphores.ContainsKey(id) then raise EFHIRException.Create('WS Queue not found: '+id); @@ -1709,7 +1709,7 @@ function TSubscriptionManager.wsWait(id : String) : boolean; var info : TWebSocketQueueInfo; begin - FLock.Lock; + FLock.Lock('wsWait'); try info := FSemaphores[id]; finally @@ -1724,7 +1724,7 @@ function TSubscriptionManager.wsPersists(id : String; b : TBytes) : boolean; info : TWebSocketQueueInfo; buf : TFslBuffer; begin - FLock.Lock; + FLock.Lock('wsPersists'); try if not FSemaphores.ContainsKey(id) then result := true // since it doesn't exist, it must be persistent @@ -1746,7 +1746,7 @@ function TSubscriptionManager.wsPersists(id : String; b : TBytes) : boolean; procedure TSubscriptionManager.wsWake(id : String); begin - FLock.Lock; + FLock.Lock('wsWake'); try if FSemaphores.ContainsKey(id) then FSemaphores[id].Event.SetEvent; @@ -1761,7 +1761,7 @@ procedure TSubscriptionManager.wsWakeAll; ok : boolean; begin FCloseAll := true; - FLock.Lock; + FLock.Lock('wsWakeAll'); try for info in FSemaphores.Values do info.Event.SetEvent; @@ -1770,7 +1770,7 @@ procedure TSubscriptionManager.wsWakeAll; end; repeat sleep(100); - FLock.Lock; + FLock.Lock('wsWakeAll2'); try ok := FSemaphores.Count = 0; finally diff --git a/server/tag_manager.pas b/server/tag_manager.pas index 6ae022326..ef48e76cb 100644 --- a/server/tag_manager.pas +++ b/server/tag_manager.pas @@ -87,7 +87,7 @@ procedure TFHIRTagManager.crossLink; var i : integer; begin - FLock.Lock; + FLock.Lock('crossLink'); try for i := 0 to FTags.Count - 1 do FTagsByKey.add(inttostr(FTags[i].key), FTags[i].Link); @@ -117,7 +117,7 @@ function TFHIRTagManager.findTag(category: TFHIRTagCategory; system, code: Strin function TFHIRTagManager.add(key: integer; category: TFHIRTagCategory; uri, code, display: String): TFHIRTag; begin - FLock.Lock; + FLock.Lock('add'); try result := FTags.addTag(key, category, uri, code, display); finally diff --git a/server/telnet_server.pas b/server/telnet_server.pas index ad2a2c747..a591e47b6 100644 --- a/server/telnet_server.pas +++ b/server/telnet_server.pas @@ -42,6 +42,8 @@ interface type TFHIRTelnetServer = class; + { TTelnetThreadHelper } + TTelnetThreadHelper = class (TFslObject) Private FServer : TFHIRTelnetServer; @@ -53,24 +55,37 @@ TTelnetThreadHelper = class (TFslObject) procedure processCommand(s : String); procedure send(s : String); procedure ping; + function GetRequestCount : String; Public constructor Create(server : TFHIRTelnetServer; context: TIdContext); destructor Destroy; Override; function link : TTelnetThreadHelper; overload; end; + { TFHIRTelnetServerThread } + TFHIRTelnetServerThread = class (TFslThread) private FServer : TFHIRTelnetServer; + FStrings : TStringList; + FClientList : TFslList; protected function ThreadName : String; Override; Procedure Execute; override; + public + constructor Create; override; + destructor Destroy; override; end; + TGetStringEvent = function : String of object; + TGetCurrentRequestCountEvent = function : integer of Object; + { TFHIRTelnetServer } TFHIRTelnetServer = class (TLogListener) Private + FOnGetCurrentRequestCount: TGetCurrentRequestCountEvent; + FOnGetRequestList: TGetStringEvent; FServer: TIdTelnetServer; FLock : TFslLock; FClients: TFslList; @@ -84,7 +99,7 @@ TFHIRTelnetServer = class (TLogListener) procedure SetStats(AValue: TStatusRecords); procedure TelnetLogin(AThread: TIdContext; const username, password: String; var AAuthenticated: Boolean); procedure telnetExecute(AThread: TIdContext); - procedure internalThread; + procedure internalThread(ctxt : TFHIRTelnetServerThread); protected procedure log(const msg : String); override; Public @@ -97,6 +112,9 @@ TFHIRTelnetServer = class (TLogListener) procedure addEndPoint(ep : TFHIRServerEndPoint); procedure removeEndPoint(ep : TFHIRServerEndPoint); property ShuttingDown : boolean read FShuttingDown write FShuttingDown; + + property OnGetRequestList : TGetStringEvent read FOnGetRequestList write FOnGetRequestList; + property OnGetCurrentRequestCount : TGetCurrentRequestCountEvent read FOnGetCurrentRequestCount write FOnGetCurrentRequestCount; end; implementation @@ -114,7 +132,9 @@ constructor TFHIRTelnetServer.Create(port: Integer; WelcomeMsg: String); FLog := TStringList.Create; - FServer := TidTelnetServer.Create(NIL); + Logging.log('Start Telnet Server on Port '+inttostr(port)); + FServer := TIdTelnetServer.Create(NIL); + FServer.Name := 'Telnet'; FServer.DefaultPort := port; FServer.LoginMessage := 'FHIRServer'; FServer.OnAuthentication := TelnetLogin; @@ -148,7 +168,7 @@ destructor TFHIRTelnetServer.Destroy; procedure TFHIRTelnetServer.log(const msg: String); begin - FLock.Lock; + FLock.Lock('log'); try FLog.Add(msg); finally @@ -156,40 +176,33 @@ procedure TFHIRTelnetServer.log(const msg: String); end; end; -procedure TFHIRTelnetServer.internalThread; +procedure TFHIRTelnetServer.internalThread(ctxt : TFHIRTelnetServerThread); var - ts : TStringList; s : String; tth : TTelnetThreadHelper; - list : TFslList; begin - list := TFslList.Create; + ctxt.FStrings.clear; + ctxt.FClientList.clear; + + FLock.Lock('internalThread'); try - ts := TStringList.Create; - try - FLock.Lock; - try - ts.Assign(FLog); - FLog.clear; - list.AddAll(FClients); - finally - FLock.Unlock; - end; - for tth in list do - begin - if (not tth.FHasSent) then - tth.send(FWelcomeMsg); - for s in ts do - begin - tth.send(s); - end; - tth.ping; - end; - finally - ts.free; - end; + ctxt.FStrings.Assign(FLog); + FLog.clear; + if (ctxt.FStrings.Count > 0) then + ctxt.FClientList.AddAll(FClients); finally - list.free; + FLock.Unlock; + end; + + for tth in ctxt.FClientList do + begin + if (not tth.FHasSent) then + tth.send(FWelcomeMsg); + for s in ctxt.FStrings do + begin + tth.send(s); + end; + tth.ping; end; end; @@ -233,7 +246,7 @@ procedure TFHIRTelnetServer.telnetExecute(AThread: TIdContext); SetThreadName('Telnet Client at '+AThread.Binding.PeerIP); tth := TTelnetThreadHelper.Create(self, AThread); try - FLock.Lock; + FLock.Lock('telnetExecute'); try FClients.Add(tth.Link); finally @@ -242,7 +255,7 @@ procedure TFHIRTelnetServer.telnetExecute(AThread: TIdContext); try tth.execute(); finally - FLock.Lock; + FLock.Lock('telnetExecute2'); try FClients.Remove(tth) finally @@ -301,7 +314,7 @@ procedure TTelnetThreadHelper.ping; magic := TFslObject.nextMagic; if FServer.FShuttingDown then begin - send('$@ping: '+inttostr(GetThreadCount)+' threads; shutting down'); + send('$@ping: '+Logging.cpu.usage+' #'+GetRequestCount+' '+inttostr(GetThreadCount)+' threads; shutting down'); end else if (now > FNextPing) then begin @@ -310,11 +323,19 @@ procedure TTelnetThreadHelper.ping; begin mem := mem + ep.cacheSize(magic); end; - send('$@ping: '+inttostr(GetThreadCount)+' threads, '+Logging.MemoryStatus(true)+', '+DescribeBytes(mem)+' MB used'); + send('$@ping: '+Logging.cpu.usage+' #'+GetRequestCount+' '+inttostr(GetThreadCount)+' threads, '+Logging.MemoryStatus(true)+', '+DescribeBytes(mem)+' MB used'); end; FNextPing := now + (DATETIME_SECOND_ONE * 10); end; +function TTelnetThreadHelper.GetRequestCount: String; +begin + if assigned(FServer.OnGetCurrentRequestCount) then + result := inttostr(FServer.OnGetCurrentRequestCount) + else + result := '?'; +end; + procedure TTelnetThreadHelper.processCommand(s: String); var ep : TFHIRServerEndPoint; @@ -330,6 +351,14 @@ procedure TTelnetThreadHelper.processCommand(s: String); Logging.log('Console requested Thread List'); send('$@threads: '+GetThreadReport) end + else if (s = '@requests') then + begin + Logging.log('Console requested Current Request List'); + if not assigned(FServer.OnGetRequestList) then + send('$@requests: No Server At this time') + else + send('$@requests: '+FServer.OnGetRequestList) + end else if (s = '@classes') then begin Logging.log('Console requested Object Class Count'); @@ -403,13 +432,27 @@ procedure TTelnetThreadHelper.send(s: String); procedure TFHIRTelnetServerThread.Execute; begin try - FServer.internalThread; + FServer.internalThread(self); except // nothing. end; end; -function TFHIRTelnetServerThread.threadName: String; +constructor TFHIRTelnetServerThread.Create; +begin + inherited Create; + FStrings := TStringList.create; + FClientList := TFslList.create; +end; + +destructor TFHIRTelnetServerThread.Destroy; +begin + FStrings.free; + FClientList.free; + inherited Destroy; +end; + +function TFHIRTelnetServerThread.ThreadName: String; begin result := 'Telnet Server'; end; diff --git a/server/test_registry.pas b/server/test_registry.pas index e07c7e108..ccfdbb72d 100644 --- a/server/test_registry.pas +++ b/server/test_registry.pas @@ -156,8 +156,8 @@ procedure registerTests(params : TCommandLineParameters); fhir4_tests_graphql.registerTests; fhir4_tests_diff.registerTests; - fhir4b_tests_Parser.registerTests; - fhir5_tests_Parser.registerTests; +// fhir4b_tests_Parser.registerTests; +// fhir5_tests_Parser.registerTests; tests_cpt.registerTests; fxver_tests.registerTests; diff --git a/server/tests.pas b/server/tests.pas index 056087c37..60bcc303d 100644 --- a/server/tests.pas +++ b/server/tests.pas @@ -206,7 +206,7 @@ procedure ExecuteFhirServerTests(all: boolean); // stream : TFileStream; // json : TFHIRJsonParser; //begin -// stream := TFileStream.Create(filename, fmOpenRead); +// stream := TFileStream.Create(filename, fmOpenRead + fmShareDenyWrite); // try // json := TFHIRJsonParser.Create(nil); // try diff --git a/server/tests/tests_cpt.pas b/server/tests/tests_cpt.pas index a59a972ba..79d336801 100644 --- a/server/tests/tests_cpt.pas +++ b/server/tests/tests_cpt.pas @@ -90,7 +90,7 @@ procedure TCPTTests.SetUp; fn := GCPTDataFile else fn := TestSettings.serverTestFile(['testcases', 'cpt', 'cpt-fragment.db']); - FCPT := TCPTServices.Create(nil, TFDBSQLiteManager.Create('test', fn, false, 4)); + FCPT := TCPTServices.Create(nil, nil, TFDBSQLiteManager.Create('test', fn, true, false, 4)); end; procedure TCPTTests.TearDown; @@ -111,7 +111,7 @@ procedure TCPTTests.TestCode; ctxt := FCPT.locate('99202', nil, msg); try assertTrue(ctxt <> nil); - assertEquals('Office or other outpatient visit for the evaluation and management of a new patient, which requires a medically appropriate history and/or examination and straightforward medical decision making. When using time for code selection, 15-29 minutes of total time is spent on the date of the encounter.', FCPT.Display(ctxt, nil)); + assertEqual('Office or other outpatient visit for the evaluation and management of a new patient, which '+'requires a medically appropriate history and/or examination and straightforward medical decision making. When using time for code selection, 15-29 minutes of total time is spent on the date of the encounter.', FCPT.Display(ctxt, nil)); finally ctxt.free; end; @@ -125,7 +125,7 @@ procedure TCPTTests.TestCodeX; begin ctxt := FCPT.locate('99201', nil, msg); try - assertNull(ctxt); + assertTrue(ctxt = nil); assertTrue(msg <> ''); finally ctxt.free; @@ -140,7 +140,7 @@ procedure TCPTTests.TestCodeMod; ctxt := FCPT.locate('99202:P1', nil, msg); try assertTrue(ctxt <> nil); - assertEquals('', FCPT.Display(ctxt, nil)); + assertEqual('', FCPT.Display(ctxt, nil)); finally ctxt.free; end; @@ -153,7 +153,7 @@ procedure TCPTTests.TestCodeModX1; begin ctxt := FCPT.locate('99202:P1-P1', nil, msg); try - assertNull(ctxt); + assertTrue(ctxt = nil); assertTrue(msg <> ''); finally ctxt.free; @@ -173,7 +173,7 @@ procedure TCPTTests.TestIterator; c := FCPT.getNextContext(iter); try s := FCPT.code(c); - AssertTrue('Unexpected code '+s, StringArrayExists(['metadata-kinds', 'metadata-designations', '99202', '99203', '0001A', '99252', '25', '95', 'P1', '1P', 'F1'], s)); + AssertTrue(StringArrayExists(['metadata-kinds', 'metadata-designations', '99202', '99203', '0001A', '99252', '25', '95', 'P1', '1P', 'F1'], s), 'Unexpected code '+s); finally c.free; end; @@ -188,11 +188,12 @@ procedure TCPTTests.TestModifierFilter; filter : TCodeSystemProviderFilterContext; ctxt : TCodeSystemProviderContext; c : integer; - s, msg : String; + s, msg, log : String; begin + log := ''; filter := FCPT.filter(true, 'modifier', foEqual, 'true', nil); try - AssertNotNull(filter); + AssertTrue(filter <> nil); AssertFalse(FCPT.isNotClosed(nil, filter)); c := 0; while FCPT.FilterMore(filter) do @@ -201,12 +202,13 @@ procedure TCPTTests.TestModifierFilter; ctxt := FCPT.FilterConcept(filter); try s := FCPT.code(ctxt); - AssertTrue('Unexpected code '+s, StringArrayExists(['25', '95', 'P1', '1P', 'F1'], s)); + CommaAdd(log, s); + AssertTrue(StringArrayExists(['25', '95', 'P1', '1P', 'F1'], s), 'Unexpected code '+s); finally ctxt.free; end; end; - AssertEquals(5, c); + AssertEqual(5, c, 'only found '+log); ctxt := FCPT.locate('99202', nil, msg); try AssertFalse(FCPT.inFilter(filter, ctxt)); @@ -235,11 +237,12 @@ procedure TCPTTests.TestBaseFilter; filter : TCodeSystemProviderFilterContext; ctxt : TCodeSystemProviderContext; c : integer; - s, msg : String; + s, msg, log : String; begin + log := ''; filter := FCPT.filter(true, 'modifier', foEqual, 'false', nil); try - AssertNotNull(filter); + AssertTrue(filter <> Nil); AssertFalse(FCPT.isNotClosed(nil, filter)); c := 0; while FCPT.FilterMore(filter) do @@ -247,13 +250,14 @@ procedure TCPTTests.TestBaseFilter; inc(c); ctxt := FCPT.FilterConcept(filter); try - s := FCPT.code(ctxt); - AssertTrue('Unexpected code '+s, StringArrayExists(['99202', '99203', '0001A', '99252'], s)); + s := FCPT.code(ctxt); + CommaAdd(log, s); + AssertTrue(StringArrayExists(['99202', '99203', '0001A', '99252'], s), 'Unexpected code '+s); finally ctxt.free; end; end; - AssertEquals(4, c); + AssertEqual(4, c, 'only found '+log); ctxt := FCPT.locate('99202', nil, msg); try AssertTrue(FCPT.inFilter(filter, ctxt)); @@ -282,11 +286,12 @@ procedure TCPTTests.TestUnModifiedFilter; filter : TCodeSystemProviderFilterContext; ctxt : TCodeSystemProviderContext; c : integer; - s, msg : String; + s, msg, log : String; begin + log := ''; filter := FCPT.filter(true, 'modified', foEqual, 'false', nil); try - AssertNotNull(filter); + AssertTrue(filter <> nil); AssertFalse(FCPT.isNotClosed(nil, filter)); c := 0; while FCPT.FilterMore(filter) do @@ -295,12 +300,13 @@ procedure TCPTTests.TestUnModifiedFilter; ctxt := FCPT.FilterConcept(filter); try s := FCPT.code(ctxt); - AssertTrue('Unexpected code '+s, StringArrayExists(['99202', '99203', '0001A', '99252', '25', 'P1', '1P', 'F1', '95'], s)); + CommaAdd(log, s); + AssertTrue(StringArrayExists(['99202', '99203', '0001A', '99252', '25', 'P1', '1P', 'F1', '95'], s), 'Unexpected code '+s); finally ctxt.free; end; end; - AssertEquals(9, c); + AssertEqual(9, c, 'only found '+log); ctxt := FCPT.locate('99202', nil, msg); try AssertTrue(FCPT.inFilter(filter, ctxt)); @@ -333,12 +339,12 @@ procedure TCPTTests.TestModifiedFilter; begin filter := FCPT.filter(true, 'modified', foEqual, 'true', nil); try - AssertNotNull(filter); + AssertTrue(filter <> nil); AssertTrue(FCPT.isNotClosed(nil, filter)); c := 0; while FCPT.FilterMore(filter) do inc(c); - AssertEquals(0, c); + AssertEqual(0, c); ctxt := FCPT.locate('99202', nil, msg); try AssertFalse(FCPT.inFilter(filter, ctxt)); @@ -368,11 +374,12 @@ procedure TCPTTests.TestKindFilter; filter : TCodeSystemProviderFilterContext; ctxt : TCodeSystemProviderContext; c : integer; - s, msg : String; + s, msg, log: String; begin + log := ''; filter := FCPT.filter(true, 'kind', foEqual, 'code', nil); try - AssertNotNull(filter); + AssertTrue(filter <> nil); AssertFalse(FCPT.isNotClosed(nil, filter)); c := 0; while FCPT.FilterMore(filter) do @@ -380,13 +387,14 @@ procedure TCPTTests.TestKindFilter; inc(c); ctxt := FCPT.FilterConcept(filter); try - s := FCPT.code(ctxt); - AssertTrue('Unexpected code '+s, StringArrayExists(['99202', '99203', '99252'], s)); + s := FCPT.code(ctxt); + CommaAdd(log, s); + AssertTrue(StringArrayExists(['99202', '99203', '99252'], s), 'Unexpected code '+s); finally ctxt.free; end; end; - AssertEquals(3, c); + AssertEqual(3, c, 'only found '+log); ctxt := FCPT.locate('99202', nil, msg); try AssertTrue(FCPT.inFilter(filter, ctxt)); @@ -419,7 +427,7 @@ procedure TCPTTests.TestExpression1; try assertTrue(ctxt <> nil); assertTrue(msg = ''); - assertEquals('', FCPT.Display(ctxt, nil)); + assertEqual('', FCPT.Display(ctxt, nil)); finally ctxt.free; end; @@ -433,10 +441,13 @@ procedure TCPTTests.TestExpression2; ctxt := FCPT.locate('99252:95', nil, msg); try assertTrue(ctxt = nil); - assertEquals('The modifier 95 cannot be used with the code 99252 as it is not designated for telemedicine', msg); - assertEquals('', FCPT.Display(ctxt, nil)); + assertEqual('The modifier 95 cannot be used with the code 99252 as it is not designated for telemedicine', msg); + assertEqual('', FCPT.Display(ctxt, nil)); finally ctxt.free; end; end; -end. \ No newline at end of file + +end. + + diff --git a/server/twilio.pas b/server/twilio.pas index 65b8fe258..64bd52cfe 100644 --- a/server/twilio.pas +++ b/server/twilio.pas @@ -151,7 +151,7 @@ function TTwilioServer.processTwilioPost(request: TIdHTTPRequestInfo; response: a, f, b : String; conn : TFDBConnection; begin - FLock.Lock; + FLock.Lock('processTwilioPost'); try Inc(FKey); tk := FKey; diff --git a/server/tx/tx_acir.pas b/server/tx/tx_acir.pas index 2291cae07..ec0313b65 100644 --- a/server/tx/tx_acir.pas +++ b/server/tx/tx_acir.pas @@ -35,7 +35,7 @@ interface // based on a table by importing the excel spreadsheet directly uses SysUtils, Classes, - fsl_utilities, fsl_base, fsl_http, fsl_lang, + fsl_utilities, fsl_base, fsl_http, fsl_lang, fsl_i18n, fhir_features, ftx_service; @@ -66,6 +66,8 @@ TACIRPrep = class (TCodeSystemProviderFilterPreparationContext) destructor Destroy; Override; end; + { TACIRServices } + TACIRServices = class (TCodeSystemProvider) private FList : TFslList; @@ -73,7 +75,7 @@ TACIRServices = class (TCodeSystemProvider) procedure load; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TACIRServices; overload; @@ -81,8 +83,8 @@ TACIRServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; @@ -101,6 +103,7 @@ TACIRServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -114,9 +117,9 @@ implementation { TACIRServices } -Constructor TACIRServices.Create(languages : TIETFLanguageDefinitions); +constructor TACIRServices.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin - inherited Create(languages); + inherited Create(languages, i18n); FList := TFslList.Create; FMap := TFslMap.Create('tx.acir'); FMap.defaultValue := nil; @@ -135,12 +138,12 @@ function TACIRServices.TotalCount : integer; end; -function TACIRServices.version(context: TCodeSystemProviderContext): String; +function TACIRServices.version: String; begin result := ''; end; -function TACIRServices.systemUri(context : TCodeSystemProviderContext) : String; +function TACIRServices.systemUri : String; begin result := 'urn:oid:1.2.36.1.2001.1005.17'; end; @@ -350,6 +353,11 @@ function TACIRServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : boo raise ETerminologyTodo.Create('TACIRServices.FilterMore'); end; +function TACIRServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyTodo.Create('TACIRServices.FilterMore'); +end; + function TACIRServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin raise ETerminologyTodo.Create('TACIRServices.FilterConcept'); diff --git a/server/tx/tx_areacode.pas b/server/tx/tx_areacode.pas index e221fccee..df370dc44 100644 --- a/server/tx/tx_areacode.pas +++ b/server/tx/tx_areacode.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, - fsl_utilities, fsl_http, fsl_lang, fsl_base, fsl_stream, + fsl_utilities, fsl_http, fsl_lang, fsl_base, fsl_stream, fsl_i18n, fhir_objects, fhir_common, fhir_features, ftx_service; @@ -62,6 +62,8 @@ TAreaCodeConceptFilter = class (TCodeSystemProviderFilterContext) function link : TAreaCodeConceptFilter; overload; end; + { TAreaCodeServices } + TAreaCodeServices = class (TCodeSystemProvider) private FCodes : TFslList; @@ -69,7 +71,7 @@ TAreaCodeServices = class (TCodeSystemProvider) procedure load; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TAreaCodeServices; overload; @@ -77,7 +79,7 @@ TAreaCodeServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -95,6 +97,7 @@ TAreaCodeServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -106,19 +109,20 @@ implementation { TAreaCodeServices } -Constructor TAreaCodeServices.Create(languages : TIETFLanguageDefinitions); +constructor TAreaCodeServices.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin - inherited Create(languages); + inherited Create(languages, i18n); FCodes := TFslList.Create; FMap := TFslMap.Create('tx.areacode'); + FMap.defaultValue := nil; Load; end; procedure TAreaCodeServices.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'type:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'type:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'type:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'type:equals')); end; function TAreaCodeServices.TotalCount : integer; @@ -127,7 +131,7 @@ function TAreaCodeServices.TotalCount : integer; end; -function TAreaCodeServices.systemUri(context : TCodeSystemProviderContext) : String; +function TAreaCodeServices.systemUri : String; begin result := 'http://unstats.un.org/unsd/methods/m49/m49.htm'; end; @@ -138,8 +142,14 @@ function TAreaCodeServices.getDefinition(code: String): String; end; function TAreaCodeServices.getDisplay(code : String; langList : THTTPLanguageList):String; +var + v : TAreaCodeConcept; begin - result := FMap[code].display; + v := FMap[code]; + if (v = nil) then + result := '' + else + result := v.display; end; function TAreaCodeServices.getPrepContext: TCodeSystemProviderFilterPreparationContext; @@ -547,7 +557,7 @@ function TAreaCodeServices.filter(forIteration : boolean; prop : String; op : TF end; end else - raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri(nil), itNotSupported); + raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri, itNotSupported); end; function TAreaCodeServices.filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; @@ -568,6 +578,11 @@ function TAreaCodeServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : result := TAreaCodeConceptFilter(ctxt).FCursor < TAreaCodeConceptFilter(ctxt).FList.Count; end; +function TAreaCodeServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := TAreaCodeConceptFilter(ctxt).FList.Count; +end; + function TAreaCodeServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin result := TAreaCodeConceptFilter(ctxt).FList[TAreaCodeConceptFilter(ctxt).FCursor].link; diff --git a/server/tx/tx_countrycode.pas b/server/tx/tx_countrycode.pas index 7d0e11bdd..07843124d 100644 --- a/server/tx/tx_countrycode.pas +++ b/server/tx/tx_countrycode.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, - fsl_utilities, fsl_base, fsl_stream, fsl_http, fsl_fpc, fsl_lang, fsl_regex, + fsl_utilities, fsl_base, fsl_stream, fsl_http, fsl_fpc, fsl_lang, fsl_regex, fsl_i18n, fhir_objects, fhir_common, fhir_features, fhir_uris, ftx_service; @@ -60,6 +60,8 @@ TCountryCodeConceptFilter = class (TCodeSystemProviderFilterContext) function link : TCountryCodeConceptFilter; overload; end; + { TCountryCodeServices } + TCountryCodeServices = class (TCodeSystemProvider) private FCodes : TFslList; @@ -67,7 +69,7 @@ TCountryCodeServices = class (TCodeSystemProvider) procedure load; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TCountryCodeServices; overload; @@ -75,8 +77,8 @@ TCountryCodeServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -94,6 +96,7 @@ TCountryCodeServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -106,7 +109,7 @@ implementation { TCountryCodeServices } -Constructor TCountryCodeServices.Create(languages : TIETFLanguageDefinitions); +constructor TCountryCodeServices.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin inherited; FCodes := TFslList.Create; @@ -118,7 +121,7 @@ implementation procedure TCountryCodeServices.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'code:regex')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'code:regex')); end; function TCountryCodeServices.TotalCount : integer; @@ -127,12 +130,12 @@ function TCountryCodeServices.TotalCount : integer; end; -function TCountryCodeServices.version(context: TCodeSystemProviderContext): String; +function TCountryCodeServices.version: String; begin result := '2018'; end; -function TCountryCodeServices.systemUri(context : TCodeSystemProviderContext) : String; +function TCountryCodeServices.systemUri : String; begin result := URI_3166; end; @@ -1034,7 +1037,7 @@ function TCountryCodeServices.filter(forIteration : boolean; prop : String; op : end; end else - raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri(nil), itNotSupported); + raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri, itNotSupported); end; function TCountryCodeServices.filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; @@ -1048,6 +1051,11 @@ function TCountryCodeServices.FilterMore(ctxt : TCodeSystemProviderFilterContext result := TCountryCodeConceptFilter(ctxt).FCursor < TCountryCodeConceptFilter(ctxt).FList.Count; end; +function TCountryCodeServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := TCountryCodeConceptFilter(ctxt).FList.Count; +end; + function TCountryCodeServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin result := TCountryCodeConceptFilter(ctxt).FList[TCountryCodeConceptFilter(ctxt).FCursor].link; diff --git a/server/tx/tx_cpt.pas b/server/tx/tx_cpt.pas index 70cac0094..526f61e26 100644 --- a/server/tx/tx_cpt.pas +++ b/server/tx/tx_cpt.pas @@ -1,4 +1,4 @@ -unit tx_cpt; +unit tx_cpt; { Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, Generics.Collections, - fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, fsl_logging, + fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, fsl_logging, fsl_i18n, fdb_manager, fdb_dialects, fhir_objects, fhir_common, fhir_factory, fhir_utilities, fhir_features, fhir_uris, fhir_cdshooks, @@ -154,15 +154,15 @@ TCPTServices = class (TCodeSystemProvider) function parse(code : String; var msg : String) : TCPTExpression; procedure load; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); destructor Destroy; Override; Function Link : TCPTServices; overload; class function checkDB(conn : TFDBConnection) : String; function expandLimitation : Integer; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function description : String; override; function TotalCount : integer; override; @@ -183,6 +183,7 @@ TCPTServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -374,9 +375,9 @@ procedure TCPTExpression.SetFocus(AValue: TCPTConcept); { TCPTServices } -constructor TCPTServices.Create(languages : TIETFLanguageDefinitions; db : TFDBManager); +constructor TCPTServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); begin - inherited Create(languages); + inherited Create(languages, i18n); FMap := TFslMap.Create; FMap.defaultValue := nil; FList := TFslList.Create; @@ -619,12 +620,12 @@ procedure TCPTServices.load; end; end; -function TCPTServices.systemUri(context : TCodeSystemProviderContext) : String; +function TCPTServices.systemUri : String; begin result := 'http://www.ama-assn.org/go/cpt'; end; -function TCPTServices.version(context : TCodeSystemProviderContext) : String; +function TCPTServices.version : String; begin result := FVersion; end; @@ -847,7 +848,7 @@ function TCPTServices.getNextContext(context : TCodeSystemIteratorContext) : TCo function TCPTServices.searchFilter(filter : TSearchFilterText; prep : TCodeSystemProviderFilterPreparationContext; sort : boolean) : TCodeSystemProviderFilterContext; begin - raise ETerminologyError.Create('Not supported yet'); + raise ETerminologyError.Create('Not supported yet', itBusinessRule); end; function TCPTServices.filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; @@ -917,6 +918,14 @@ function TCPTServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : bool result := (fc.Index < fc.Flist.count); end; +function TCPTServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +var + fc : TCPTFilterContext; +begin + fc := ctxt as TCPTFilterContext; + result := fc.Flist.count; +end; + function TCPTServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; var fc : TCPTFilterContext; @@ -964,4 +973,5 @@ procedure TCPTServices.defineFeatures(features : TFslList); end; -end. \ No newline at end of file +end. + diff --git a/server/tx/tx_hgvs.pas b/server/tx/tx_hgvs.pas index c7fc8e684..466fcaa96 100644 --- a/server/tx/tx_hgvs.pas +++ b/server/tx/tx_hgvs.pas @@ -49,6 +49,8 @@ THGVSCode = class (TCodeSystemProviderContext) property code : String read FCode write FCode; end; + { THGVSProvider } + THGVSProvider = class (TCodeSystemProvider) private public @@ -58,8 +60,8 @@ THGVSProvider = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; @@ -81,6 +83,7 @@ THGVSProvider = class (TCodeSystemProvider) function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; overload; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String) : TCodeSystemProviderContext; overload; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -173,6 +176,11 @@ function THGVSProvider.FilterMore(ctxt: TCodeSystemProviderFilterContext): boole raise ETerminologyError.Create('Filters are not supported for HGVS', itNotSupported); end; +function THGVSProvider.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyError.Create('Filters are not supported for HGVS', itNotSupported); +end; + procedure THGVSProvider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin // nothing @@ -287,7 +295,7 @@ function THGVSProvider.subsumesTest(codeA, codeB: String): String; raise ETerminologyError.Create('Subsumption is not supported for HGVS', itNotSupported); end; -function THGVSProvider.systemUri(context: TCodeSystemProviderContext): String; +function THGVSProvider.systemUri: String; begin result := 'http://varnomen.hgvs.org'; end; @@ -297,7 +305,7 @@ function THGVSProvider.TotalCount: integer; result := 0; end; -function THGVSProvider.version(context: TCodeSystemProviderContext): String; +function THGVSProvider.version: String; begin result := '2.0'; end; diff --git a/server/tx/tx_icd11.pas b/server/tx/tx_icd11.pas index b39e978ba..b4fa9d7e9 100644 --- a/server/tx/tx_icd11.pas +++ b/server/tx/tx_icd11.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, Generics.Collections, - fsl_base, fsl_http, fsl_lang, fsl_utilities, + fsl_base, fsl_http, fsl_lang, fsl_utilities, fsl_i18n, fhir_objects, fhir_common, fhir_factory, fhir_features, fhir_cdshooks, ftx_service; @@ -59,7 +59,7 @@ TICD11Provider = class (TCodeSystemProvider) protected function sizeInBytesV(magic : integer) : cardinal; override; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; override; function link : TICD11Provider; overload; @@ -69,13 +69,13 @@ TICD11Provider = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; overload; override; - function locate(code : String) : TCodeSystemProviderContext; overload; override; + function locate(code : String; altOpt : TAlternateCodeOptions= nil) : TCodeSystemProviderContext; overload; override; function locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; override; function IsAbstract(context : TCodeSystemProviderContext) : boolean; override; function IsInactive(context : TCodeSystemProviderContext) : boolean; override; @@ -94,6 +94,7 @@ TICD11Provider = class (TCodeSystemProvider) function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; overload; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String) : TCodeSystemProviderContext; overload; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -103,9 +104,6 @@ TICD11Provider = class (TCodeSystemProvider) function SpecialEnumeration : String; override; procedure getCDSInfo(card : TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display : String); override; - procedure Close(ctxt : TCodeSystemProviderFilterPreparationContext); overload; override; - procedure Close(ctxt : TCodeSystemProviderFilterContext); overload; override; - procedure Close(ctxt : TCodeSystemProviderContext); overload; override; function defToThisVersion(specifiedVersion : String) : boolean; override; procedure defineFeatures(features : TFslList); override; end; @@ -114,9 +112,9 @@ implementation { TICD11Provider } -constructor TICD11Provider.Create(languages: TIETFLanguageDefinitions); +constructor TICD11Provider.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin - inherited Create(languages); + inherited Create(languages, i18n); end; destructor TICD11Provider.Destroy; @@ -125,21 +123,6 @@ destructor TICD11Provider.Destroy; inherited; end; -procedure TICD11Provider.Close(ctxt: TCodeSystemProviderContext); -begin - ctxt.free; -end; - -procedure TICD11Provider.Close(ctxt: TCodeSystemProviderFilterContext); -begin - ctxt.free; -end; - -procedure TICD11Provider.Close(ctxt: TCodeSystemProviderFilterPreparationContext); -begin - ctxt.free; -end; - function TICD11Provider.Code(context: TCodeSystemProviderContext): string; begin result := ''; @@ -208,6 +191,11 @@ function TICD11Provider.FilterMore(ctxt: TCodeSystemProviderFilterContext): bool result := false; end; +function TICD11Provider.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := 0; +end; + procedure TICD11Provider.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin end; @@ -267,7 +255,7 @@ function TICD11Provider.link: TICD11Provider; result := TICD11Provider(inherited Link); end; -function TICD11Provider.locate(code: String): TCodeSystemProviderContext; +function TICD11Provider.locate(code: String; altOpt : TAlternateCodeOptions= nil): TCodeSystemProviderContext; begin result := nil; end; @@ -317,7 +305,7 @@ function TICD11Provider.subsumesTest(codeA, codeB: String): String; result := ''; end; -function TICD11Provider.systemUri(context: TCodeSystemProviderContext): String; +function TICD11Provider.systemUri: String; begin result := ''; end; @@ -327,7 +315,7 @@ function TICD11Provider.TotalCount: integer; result := 0; end; -function TICD11Provider.version(context: TCodeSystemProviderContext): String; +function TICD11Provider.version: String; begin result := ''; end; diff --git a/server/tx/tx_iso_4217.pas b/server/tx/tx_iso_4217.pas index bbee52401..2b3432c09 100644 --- a/server/tx/tx_iso_4217.pas +++ b/server/tx/tx_iso_4217.pas @@ -35,7 +35,7 @@ interface uses SysUtils, Classes, - fsl_utilities, fsl_base, fsl_stream, fsl_lang, fsl_http, + fsl_utilities, fsl_base, fsl_stream, fsl_lang, fsl_http, fsl_i18n, fhir_objects, fhir_common, fhir_features, ftx_service; @@ -68,11 +68,13 @@ TIso4217ConceptFilter = class (TCodeSystemProviderFilterContext) function link : TIso4217ConceptFilter; overload; end; + { TIso4217Services } + TIso4217Services = class (TCodeSystemProvider) private FCurrencies : TIso4217CurrencySet; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TIso4217Services; overload; @@ -80,7 +82,7 @@ TIso4217Services = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -98,6 +100,7 @@ TIso4217Services = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -111,7 +114,7 @@ implementation { TIso4217Services } -Constructor TIso4217Services.Create(languages : TIETFLanguageDefinitions); +constructor TIso4217Services.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin inherited; FCurrencies := TIso4217CurrencySet.Create; @@ -120,7 +123,7 @@ implementation procedure TIso4217Services.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'decimals:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'decimals:equals')); end; function TIso4217Services.TotalCount : integer; @@ -129,7 +132,7 @@ function TIso4217Services.TotalCount : integer; end; -function TIso4217Services.systemUri(context : TCodeSystemProviderContext) : String; +function TIso4217Services.systemUri : String; begin result := 'urn:iso:std:iso:4217'; end; @@ -150,8 +153,14 @@ function TIso4217Services.getPrepContext: TCodeSystemProviderFilterPreparationCo end; function TIso4217Services.locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; +var + c : TIso4217Currency; begin - result := TIso4217Concept.Create(FCurrencies.Map[code].link); + c := FCurrencies.Map[code]; + if (c = nil) then + result := nil + else + result := TIso4217Concept.Create(c.link); end; function TIso4217Services.Code(context : TCodeSystemProviderContext) : string; @@ -254,7 +263,7 @@ function TIso4217Services.filter(forIteration : boolean; prop : String; op : TFh end; end else - raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri(nil), itNotSupported); + raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri, itNotSupported); end; function TIso4217Services.filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; @@ -268,6 +277,11 @@ function TIso4217Services.FilterMore(ctxt : TCodeSystemProviderFilterContext) : result := TIso4217ConceptFilter(ctxt).FCursor < TIso4217ConceptFilter(ctxt).FList.Count; end; +function TIso4217Services.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := TIso4217ConceptFilter(ctxt).FList.Count; +end; + function TIso4217Services.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin result := TIso4217ConceptFilter(ctxt).FList[TIso4217ConceptFilter(ctxt).FCursor].link; diff --git a/server/tx/tx_mimetypes.pas b/server/tx/tx_mimetypes.pas index 0b6a95ad0..2153707e5 100644 --- a/server/tx/tx_mimetypes.pas +++ b/server/tx/tx_mimetypes.pas @@ -51,6 +51,8 @@ TMTCodeSystemProviderContext = class (TCodeSystemProviderContext) end; + { TMimeTypeCodeServices } + TMimeTypeCodeServices = class (TCodeSystemProvider) public destructor Destroy; Override; @@ -60,8 +62,8 @@ TMimeTypeCodeServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; @@ -80,6 +82,7 @@ TMimeTypeCodeServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -102,12 +105,12 @@ function TMimeTypeCodeServices.TotalCount : integer; end; -function TMimeTypeCodeServices.version(context: TCodeSystemProviderContext): String; +function TMimeTypeCodeServices.version: String; begin result := ''; end; -function TMimeTypeCodeServices.systemUri(context : TCodeSystemProviderContext) : String; +function TMimeTypeCodeServices.systemUri : String; begin result := URI_BCP13; end; @@ -233,6 +236,11 @@ function TMimeTypeCodeServices.FilterMore(ctxt : TCodeSystemProviderFilterContex raise ETerminologyTodo.Create('TMimeTypeCodeServices.FilterMore'); end; +function TMimeTypeCodeServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyTodo.Create('TMimeTypeCodeServices.FilterSize'); +end; + function TMimeTypeCodeServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin raise ETerminologyTodo.Create('TMimeTypeCodeServices.FilterConcept'); diff --git a/server/tx/tx_ndc.pas b/server/tx/tx_ndc.pas index fbd0d1601..cfd169ba0 100644 --- a/server/tx/tx_ndc.pas +++ b/server/tx/tx_ndc.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, Generics.Collections, {$IFDEF DELPHI} IOUtils, {$ENDIF} - fsl_base, fsl_utilities, fsl_collections, fsl_stream, fsl_http, fsl_threads, fsl_lang, fsl_fpc, fsl_json, + fsl_base, fsl_utilities, fsl_collections, fsl_stream, fsl_http, fsl_threads, fsl_lang, fsl_fpc, fsl_json, fsl_logging, fsl_i18n, fdb_manager, fdb_dialects, fhir_objects, fhir_common, fhir_factory, fhir_utilities, fhir_features, fhir_uris, fhir_cdshooks, @@ -228,7 +228,7 @@ TNDCServices = class (TCodeSystemProvider) function packageDisplay(conn : TFDBConnection) : String; function productDisplay(conn : TFDBConnection) : String; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager; version : String); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager; version : String); destructor Destroy; Override; Function Link : TNDCServices; overload; @@ -238,7 +238,7 @@ TNDCServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -257,6 +257,7 @@ TNDCServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -820,9 +821,9 @@ procedure TNdcImporter.processProducts(callback: TWorkProgressEvent); { TNDCServices } -constructor TNDCServices.Create(languages : TIETFLanguageDefinitions; db: TFDBManager; version : String); +constructor TNDCServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db: TFDBManager; version : String); begin - inherited Create(languages); + inherited Create(languages, i18n); self.FDb := db; self.FVersion := version; @@ -884,12 +885,14 @@ procedure TNDCServices.load; begin conn := FDB.getConnection('load'); try + Logging.log('Load NDC metadata'); loadDict(conn, FTypes, 'select NDCKey, Name from NDCProductTypes'); loadDict(conn, FOrgs, 'select NDCKey, Name from NDCOrganizations'); loadDict(conn, FRoutes, 'select NDCKey, Name from NDCRoutes'); loadDict(conn, FDoseforms, 'select NDCKey, Name from NDCDoseForms'); - FPackageCount := conn.countSql('Select count(*) from NDCPackages'); - FProductCount := conn.countSql('Select count(*) from NDCProducts'); + Logging.log('Load NDC counts'); + FPackageCount := conn.countSql('Select count(NDCKey) from NDCPackages'); + FProductCount := conn.countSql('Select count(NDCKey) from NDCProducts'); conn.release; except on e : Exception do @@ -1240,6 +1243,14 @@ function TNDCServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boolea result := context.FConn.FetchNext; end; +function TNDCServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +var + context : TNDCFilterContext; +begin + context := ctxt as TNDCFilterContext; + result := context.FConn.RowsAffected; // todo +end; + procedure TNDCServices.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin raise ETerminologyTodo.Create('Not done yet: TNDCServices.getCDSInfo'); @@ -1387,7 +1398,7 @@ function TNDCServices.searchFilter(filter: TSearchFilterText; prep: TCodeSystemP raise ETerminologyTodo.Create('Not done yet: TNDCServices.searchFilter'); end; -function TNDCServices.systemUri(context: TCodeSystemProviderContext): String; +function TNDCServices.systemUri: String; begin result := URI_NDC; end; diff --git a/server/tx/tx_omop.pas b/server/tx/tx_omop.pas index b971dc128..1eb30fede 100644 --- a/server/tx/tx_omop.pas +++ b/server/tx/tx_omop.pas @@ -1,12 +1,40 @@ unit tx_omop; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface uses Classes, SysUtils, - fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, + fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, fsl_i18n, fdb_manager, fdb_dialects, fhir_objects, fhir_common, fhir_factory, fhir_utilities, fhir_features, fhir_uris, fhir_cdshooks, @@ -47,14 +75,14 @@ TOMOPServices = class (TCodeSystemProvider) FVersion : String; procedure loadVersion; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); destructor Destroy; Override; Function Link : TOMOPServices; overload; class function checkDB(conn : TFDBConnection) : String; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function description : String; override; function TotalCount : integer; override; @@ -78,6 +106,7 @@ TOMOPServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -108,9 +137,9 @@ destructor TOMOPFilter.Destroy; { TOMOPServices } -constructor TOMOPServices.Create(languages: TIETFLanguageDefinitions; db: TFDBManager); +constructor TOMOPServices.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport; db: TFDBManager); begin - inherited Create(languages); + inherited Create(languages, i18n); self.db := db; loadVersion; end; @@ -161,12 +190,12 @@ procedure TOMOPServices.loadVersion; end; -function TOMOPServices.systemUri(context: TCodeSystemProviderContext): String; +function TOMOPServices.systemUri: String; begin result := 'http://fhir.ohdsi.org/CodeSystem/concepts'; end; -function TOMOPServices.version(context: TCodeSystemProviderContext): String; +function TOMOPServices.version: String; begin Result := FVersion; end; @@ -339,7 +368,7 @@ function TOMOPServices.prepare(prep: TCodeSystemProviderFilterPreparationContext function TOMOPServices.searchFilter(filter: TSearchFilterText; prep: TCodeSystemProviderFilterPreparationContext; sort: boolean): TCodeSystemProviderFilterContext; begin - raise ETerminologyError.Create('not done yet: searchFilter'); + raise ETerminologyError.Create('not done yet: searchFilter', itBusinessRule); end; function TOMOPServices.filter(forIteration: boolean; prop: String; op: TFhirFilterOperator; value: String; prep: TCodeSystemProviderFilterPreparationContext): TCodeSystemProviderFilterContext; @@ -360,12 +389,12 @@ function TOMOPServices.filter(forIteration: boolean; prop: String; op: TFhirFilt end; end else - raise ETerminologyError.Create('filter "'+prop+' '+CODES_TFhirFilterOperator[op]+' '+value+'" not understood for OMOP'); + raise ETerminologyError.Create('filter "'+prop+' '+CODES_TFhirFilterOperator[op]+' '+value+'" not understood for OMOP', itBusinessRule); end; function TOMOPServices.filterLocate(ctxt: TCodeSystemProviderFilterContext; code: String; var message: String): TCodeSystemProviderContext; begin - raise ETerminologyError.Create('not done yet: filterLocate'); + raise ETerminologyError.Create('not done yet: filterLocate', itBusinessRule); end; function TOMOPServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boolean; @@ -373,6 +402,11 @@ function TOMOPServices.FilterMore(ctxt: TCodeSystemProviderFilterContext): boole result := (ctxt as TOMOPFilter).Conn.FetchNext; end; +function TOMOPServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := (ctxt as TOMOPFilter).Conn.RowsAffected; +end; + function TOMOPServices.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TCodeSystemProviderContext; var conn : TFDBConnection; @@ -392,7 +426,7 @@ function TOMOPServices.FilterConcept(ctxt: TCodeSystemProviderFilterContext): TC function TOMOPServices.InFilter(ctxt: TCodeSystemProviderFilterContext; concept: TCodeSystemProviderContext): Boolean; begin - raise ETerminologyError.Create('not done yet: InFilter'); + raise ETerminologyError.Create('not done yet: InFilter', itBusinessRule); end; function TOMOPServices.isNotClosed(textFilter: TSearchFilterText; propFilter: TCodeSystemProviderFilterContext): boolean; @@ -402,7 +436,7 @@ function TOMOPServices.isNotClosed(textFilter: TSearchFilterText; propFilter: TC procedure TOMOPServices.getCDSInfo(card: TCDSHookCard; langList : THTTPLanguageList; baseURL, code, display: String); begin - raise ETerminologyError.Create('not done yet: getCDSInfo'); + raise ETerminologyError.Create('not done yet: getCDSInfo', itBusinessRule); end; procedure TOMOPServices.extendLookup(factory: TFHIRFactory; ctxt: TCodeSystemProviderContext; langList : THTTPLanguageList; props: TArray; resp: TFHIRLookupOpResponseW); @@ -431,6 +465,8 @@ procedure TOMOPServices.extendLookup(factory: TFHIRFactory; ctxt: TCodeSystemPro procedure TOMOPServices.defineFeatures(features: TFslList); begin - raise ETerminologyError.Create('not done yet: defineFeatures'); + raise ETerminologyError.Create('not done yet: defineFeatures', itBusinessRule); end; -end. \ No newline at end of file + +end. + diff --git a/server/tx/tx_rxnorm.pas b/server/tx/tx_rxnorm.pas index c68492236..a102cc56c 100644 --- a/server/tx/tx_rxnorm.pas +++ b/server/tx/tx_rxnorm.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, Generics.Collections, - fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, + fsl_base, fsl_utilities, fsl_http, fsl_threads, fsl_lang, fsl_logging, fsl_i18n, fdb_manager, fdb_dialects, fhir_objects, fhir_common, fhir_factory, fhir_utilities, fhir_features, fhir_uris, fhir_cdshooks, @@ -78,13 +78,14 @@ TUMLSServices = class (TCodeSystemProvider) db : TFDBManager; rels : TStringList; reltypes : TStringList; + FVersion : String; procedure load(list : TStringList; sql : String); protected class function getSAB : String; virtual; function getCodeField : String; virtual; public - constructor Create(languages : TIETFLanguageDefinitions; nci : boolean; db : TFDBManager); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; nci : boolean; db : TFDBManager); destructor Destroy; Override; Function Link : TUMLSServices; overload; @@ -103,6 +104,7 @@ TUMLSServices = class (TCodeSystemProvider) function Display(context : TCodeSystemProviderContext; langList : THTTPLanguageList) : string; override; procedure Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); override; function Definition(context : TCodeSystemProviderContext) : string; override; + function version : String; override; function getPrepContext : TCodeSystemProviderFilterPreparationContext; override; function prepare(prep : TCodeSystemProviderFilterPreparationContext) : boolean; override; @@ -111,6 +113,7 @@ TUMLSServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -123,9 +126,8 @@ TUMLSServices = class (TCodeSystemProvider) TRxNormServices = class (TUMLSServices) public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); + function systemUri : String; override; function name(context : TCodeSystemProviderContext) : String; override; function description : String; override; end; @@ -135,9 +137,8 @@ TNDFRTServices = class (TUMLSServices) class function getSAB : String; override; function getCodeField : String; override; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); + function systemUri : String; override; function name(context : TCodeSystemProviderContext) : String; override; function description : String; override; end; @@ -466,9 +467,9 @@ procedure TUMLSImporter.Doinstall(sender: TObject; context: TObject; callback: T { TUMLSServices } -constructor TUMLSServices.Create(languages : TIETFLanguageDefinitions; nci: boolean; db: TFDBManager); +constructor TUMLSServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; nci: boolean; db: TFDBManager); begin - inherited Create(Languages); + inherited Create(Languages, i18n); self.nci := nci; if (nci) then @@ -476,24 +477,31 @@ constructor TUMLSServices.Create(languages : TIETFLanguageDefinitions; nci: bool else dbprefix := 'RxNorm'; self.db := db; + try + FVersion := inttostr(db.CountSQL('select version from RXNVer', 'Version')); + except + FVersion := '??'; + end; rels := TStringList.Create; reltypes := TStringList.Create; + Logging.log('Load RxNorm metadata #1'); if (TotalCount = 0) then raise EDBException.Create('Error Connecting to RxNorm'); + Logging.log('Load RxNorm metadata #2'); load(rels, 'select distinct REL from RXNREL'); + Logging.log('Load RxNorm metadata #3'); load(reltypes, 'select distinct RELA from RXNREL'); + Logging.log('Load RxNorm metadata #4'); end; - - procedure TUMLSServices.defineFeatures(features: TFslList); begin - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'TTY:in')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'STY:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'SAB:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'TTY:equals')); - features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri(nil)+'.filter', 'CUI:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'TTY:in')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'STY:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'SAB:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'TTY:equals')); + features.Add(TFHIRFeature.fromString('rest.Codesystem:'+systemUri+'.filter', 'CUI:equals')); end; function TUMLSServices.TotalCount : integer; @@ -502,7 +510,7 @@ function TUMLSServices.TotalCount : integer; begin qry := db.GetConnection(dbprefix+'.Count'); try - qry.SQL := 'Select Count(*) from rxnconso where SAB = '''+getSAB+''' and TTY <> ''SY'''; + qry.SQL := 'Select Count(RXCUI) from rxnconso where SAB = '''+getSAB+''' and TTY <> ''SY'''; qry.prepare; qry.execute; qry.FetchNext; @@ -641,6 +649,11 @@ function TUMLSServices.Definition(context: TCodeSystemProviderContext): string; result := ''; end; +function TUMLSServices.version: String; +begin + Result := FVersion; +end; + destructor TUMLSServices.Destroy; begin DB.free; @@ -865,6 +878,7 @@ function TUMLSServices.filter(forIteration : boolean; prop : String; op : TFhirF res : TUMLSFilter; ok : boolean; begin + prop := prop.toUpper; res := TUMLSFilter.Create; try ok := true; @@ -958,6 +972,22 @@ function TUMLSServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : boo result := filter.qry.FetchNext; end; +function TUMLSServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +var + filter : TUMLSFilter; +begin + filter := TUMLSFilter(ctxt); + if (filter.qry = nil) then + begin + // search on full rxnorm + filter.qry := db.GetConnection(dbprefix+'.filter'); + filter.qry.SQL := 'Select RXCUI, STR from rxnconso where SAB = '''+getSAB+''' and TTY <> ''SY'' '+filter.sql; + filter.qry.prepare; + filter.qry.Execute; + end; + result := filter.qry.RowsAffected; // todo: check this +end; + function TUMLSServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; var filter : TUMLSFilter; @@ -1039,9 +1069,9 @@ destructor TUMLSConcept.Destroy; { TRxNormServices } -constructor TRxNormServices.Create(languages : TIETFLanguageDefinitions; db: TFDBManager); +constructor TRxNormServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db: TFDBManager); begin - inherited Create(languages, false, db); + inherited Create(languages, i18n, false, db); end; function TRxNormServices.description: String; @@ -1054,21 +1084,16 @@ function TRxNormServices.name(context: TCodeSystemProviderContext): String; result := 'RxNorm'; end; -function TRxNormServices.systemUri(context: TCodeSystemProviderContext): String; +function TRxNormServices.systemUri: String; begin result := URI_RXNORM; end; -function TRxNormServices.version(context: TCodeSystemProviderContext): String; -begin - result := '??rx1'; -end; - { TNDFRTServices } -constructor TNDFRTServices.Create(languages : TIETFLanguageDefinitions; db: TFDBManager); +constructor TNDFRTServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db: TFDBManager); begin - inherited Create(languages, false, db); + inherited Create(languages, i18n, false, db); end; function TNDFRTServices.description: String; @@ -1091,14 +1116,9 @@ function TNDFRTServices.name(context: TCodeSystemProviderContext): String; result := 'NDFRT'; end; -function TNDFRTServices.systemUri(context: TCodeSystemProviderContext): String; +function TNDFRTServices.systemUri: String; begin result := URI_NDFRT; end; -function TNDFRTServices.version(context: TCodeSystemProviderContext): String; -begin - result := '??rx2'; -end; - end. diff --git a/server/tx/tx_unii.pas b/server/tx/tx_unii.pas index 21b488923..65567bf9b 100644 --- a/server/tx/tx_unii.pas +++ b/server/tx/tx_unii.pas @@ -35,7 +35,7 @@ interface uses SysUtils, Classes, - fsl_utilities, fsl_base, fsl_collections, fsl_stream, fsl_http, fsl_lang, fsl_threads, + fsl_utilities, fsl_base, fsl_collections, fsl_stream, fsl_http, fsl_lang, fsl_threads, fsl_i18n, fdb_manager, fhir_objects, fhir_features, fhir_uris, ftx_service; @@ -70,7 +70,7 @@ TUniiServices = class (TCodeSystemProvider) db : TFDBManager; FVersion : String; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); destructor Destroy; Override; Function Link : TUniiServices; overload; @@ -79,9 +79,9 @@ TUniiServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function version(context : TCodeSystemProviderContext) : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -100,6 +100,7 @@ TUniiServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -116,11 +117,11 @@ implementation { TUniiServices } -constructor TUniiServices.Create(languages : TIETFLanguageDefinitions; db: TFDBManager); +constructor TUniiServices.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db: TFDBManager); var conn : TFDBConnection; begin - inherited Create(languages); + inherited Create(languages, i18n); self.db := db; conn := db.GetConnection('version'); @@ -171,12 +172,12 @@ function TUniiServices.TotalCount : integer; end; -function TUniiServices.version(context: TCodeSystemProviderContext): String; +function TUniiServices.version: String; begin result := FVersion; end; -function TUniiServices.systemUri(context : TCodeSystemProviderContext) : String; +function TUniiServices.systemUri : String; begin result := URI_UNII; end; @@ -252,7 +253,7 @@ function TUniiServices.getPrepContext: TCodeSystemProviderFilterPreparationConte map := TFslStringIntegerMatch.Create; try map.forced := true; - f := TFslFile.Create(filename, fmOpenRead); + f := TFslFile.Create(filename, fmOpenRead + fmShareDenyWrite); try size := f.Size; t := 0; @@ -456,6 +457,11 @@ function TUniiServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : boo raise ETerminologyTodo.Create('TUniiServices.FilterMore'); end; +function TUniiServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyTodo.Create('TUniiServices.FilterMore'); +end; + function TUniiServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin raise ETerminologyTodo.Create('TUniiServices.FilterConcept'); diff --git a/server/tx/tx_uri.pas b/server/tx/tx_uri.pas index 00ac10c18..10ab222e9 100644 --- a/server/tx/tx_uri.pas +++ b/server/tx/tx_uri.pas @@ -47,6 +47,8 @@ TUriHolder = class (TCodeSystemProviderContext) constructor Create(url : String); end; + { TUriServices } + TUriServices = class (TCodeSystemProvider) public Function Link : TUriServices; overload; @@ -56,8 +58,8 @@ TUriServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function version(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; + function version : String; override; function name(context : TCodeSystemProviderContext) : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; @@ -76,6 +78,7 @@ TUriServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -93,12 +96,12 @@ function TUriServices.TotalCount : integer; end; -function TUriServices.version(context: TCodeSystemProviderContext): String; +function TUriServices.version: String; begin result := 'n/a'; end; -function TUriServices.systemUri(context : TCodeSystemProviderContext) : String; +function TUriServices.systemUri : String; begin result := URI_URIs; end; @@ -213,6 +216,11 @@ function TUriServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : bool raise ETerminologyTodo.Create('TUriServices.FilterMore'); end; +function TUriServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + raise ETerminologyTodo.Create('TUriServices.FilterSize'); +end; + function TUriServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin raise ETerminologyTodo.Create('TUriServices.FilterConcept'); diff --git a/server/tx/tx_us_states.pas b/server/tx/tx_us_states.pas index f021233ec..d8ef9e427 100644 --- a/server/tx/tx_us_states.pas +++ b/server/tx/tx_us_states.pas @@ -34,7 +34,7 @@ interface uses SysUtils, Classes, - fsl_utilities, fsl_base, fsl_stream, fsl_http, fsl_lang, + fsl_utilities, fsl_base, fsl_stream, fsl_http, fsl_lang, fsl_i18n, fhir_objects, fhir_common, fhir_features, ftx_service; @@ -60,6 +60,8 @@ TUSStateConceptFilter = class (TCodeSystemProviderFilterContext) function link : TUSStateConceptFilter; overload; end; + { TUSStateServices } + TUSStateServices = class (TCodeSystemProvider) private FCodes : TFslList; @@ -67,7 +69,7 @@ TUSStateServices = class (TCodeSystemProvider) procedure load; public - constructor Create(languages : TIETFLanguageDefinitions); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport); destructor Destroy; Override; Function Link : TUSStateServices; overload; @@ -75,7 +77,7 @@ TUSStateServices = class (TCodeSystemProvider) function TotalCount : integer; override; function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; + function systemUri : String; override; function getDisplay(code : String; langList : THTTPLanguageList):String; override; function getDefinition(code : String):String; override; function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; @@ -93,6 +95,7 @@ TUSStateServices = class (TCodeSystemProvider) function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; + function filterSize(ctxt : TCodeSystemProviderFilterContext) : integer; override; function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; @@ -105,7 +108,7 @@ implementation { TUSStateServices } -Constructor TUSStateServices.Create(languages : TIETFLanguageDefinitions); +constructor TUSStateServices.Create(languages: TIETFLanguageDefinitions; i18n : TI18nSupport); begin inherited; FCodes := TFslList.Create; @@ -125,7 +128,7 @@ function TUSStateServices.TotalCount : integer; end; -function TUSStateServices.systemUri(context : TCodeSystemProviderContext) : String; +function TUSStateServices.systemUri : String; begin result := 'https://www.usps.com/'; end; @@ -322,7 +325,7 @@ function TUSStateServices.subsumesTest(codeA, codeB: String): String; function TUSStateServices.filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; begin - raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri(nil), itNotSupported); + raise ETerminologyError.Create('the filter '+prop+' '+CODES_TFhirFilterOperator[op]+' = '+value+' is not supported for '+systemUri, itNotSupported); end; function TUSStateServices.filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; @@ -336,6 +339,11 @@ function TUSStateServices.FilterMore(ctxt : TCodeSystemProviderFilterContext) : result := TUSStateConceptFilter(ctxt).FCursor < TUSStateConceptFilter(ctxt).FList.Count; end; +function TUSStateServices.filterSize(ctxt: TCodeSystemProviderFilterContext): integer; +begin + result := TUSStateConceptFilter(ctxt).FList.Count; +end; + function TUSStateServices.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; begin result := TUSStateConceptFilter(ctxt).FList[TUSStateConceptFilter(ctxt).FCursor].link; diff --git a/server/tx_manager.pas b/server/tx_manager.pas index b3400c8ba..91b2eb2f8 100644 --- a/server/tx_manager.pas +++ b/server/tx_manager.pas @@ -37,7 +37,7 @@ interface fsl_utilities, fsl_stream, fsl_base, fsl_collections, fsl_http, fsl_lang, fsl_logging, fsl_i18n, fdb_manager, fhir_objects, fhir_common, fhir_cdshooks, fhir_factory, fhir_features, fhir_uris, - fhir_codesystem_service, fhir_valuesets, + fhir_codesystem_service, fhir_tx, fhir_valuesets, ftx_service, ftx_loinc_services, ftx_ucum_services, ftx_sct_services, tx_rxnorm, tx_unii, tx_acir, xig_provider, tx_uri, tx_areacode, tx_countrycode, tx_us_states, tx_iso_4217, tx_version, tx_mimetypes, ftx_lang, tx_ndc, tx_hgvs, tx_cpt, tx_omop, @@ -86,8 +86,9 @@ TCodeSystemProviderGeneralFactory = class (TCodeSystemProviderFactory) TSnomedProviderFactory = class (TCodeSystemProviderFactory) private FSnomed : TSnomedServices; + FI18n : TI18nSupport; public - Constructor Create(snomed : TSnomedServices); + Constructor Create(snomed : TSnomedServices; i18n : TI18nSupport); Destructor Destroy; override; function getProvider : TCodeSystemProvider; override; @@ -118,8 +119,10 @@ TCommonTerminologies = class (TFslObject) FNDC : TNDCServices; FOMOP : TOMOPServices; FXIG: TXIGProvider; + FI18n : TI18nSupport; procedure SetCPT(AValue: TCPTServices); + procedure SetI18n(AValue: TI18nSupport); procedure SetOMOP(AValue: TOMOPServices); procedure SetLoinc(const Value: TLOINCServices); procedure SetDefSnomed(const Value: TSnomedServices); @@ -129,7 +132,7 @@ TCommonTerminologies = class (TFslObject) procedure SetUnii(const Value: TUniiServices); procedure SetACIR(const Value: TACIRServices); - procedure getSummary(b : TStringBuilder); + procedure getSummary(b : TFslStringBuilder); procedure SetNDFRT(const Value: TNDFRTServices); procedure SetXIG(AValue: TXIGProvider); @@ -144,8 +147,6 @@ TCommonTerminologies = class (TFslObject) procedure add(p : TCodeSystemProviderFactory; defVer : boolean); overload; Property ProviderClasses : TFslMap read FProviderClasses; property Settings : TFHIRServerSettings read FSettings; - procedure sweepSnomed(callback : TFhirServerMaintenanceThreadTaskCallBack); - procedure clearSnomed; procedure defineFeatures(features : TFslList); virtual; procedure getCacheInfo(ci: TCacheInformation); virtual; @@ -154,6 +155,7 @@ TCommonTerminologies = class (TFslObject) procedure load(txlist: TFHIRServerConfigSection; testing : boolean); procedure listVersions(url : String; list : TStringList); + property i18n : TI18nSupport read FI18n write SetI18n; property Languages : TIETFLanguageDefinitions read FLanguages; Property Loinc : TLOINCServices read FLoinc write SetLoinc; Property Snomed : TFslList read FSnomed; @@ -169,36 +171,6 @@ TCommonTerminologies = class (TFslObject) property XIG : TXIGProvider read FXIG write SetXIG; end; - TLoadedConceptMap = class (TFslObject) - private - FSource: TFhirValueSetW; - FResource: TFhirConceptMapW; - FTarget: TFhirValueSetW; - procedure SetResource(const Value: TFhirConceptMapW); - procedure SetSource(const Value: TFhirValueSetW); - procedure SetTarget(const Value: TFhirValueSetW); - - function HasTranslation(list : TFslList; system, code : String; out maps : TFslList) : boolean; overload; - public - destructor Destroy; override; - function Link : TLoadedConceptMap; overload; - Property Source : TFhirValueSetW read FSource write SetSource; - Property Resource : TFhirConceptMapW read FResource write SetResource; - Property Target : TFhirValueSetW read FTarget write SetTarget; - - function HasTranslation(system, code : String; out maps : TFslList) : boolean; overload; - end; - - TLoadedConceptMapList = class (TFslObjectList) - private - function getMap(iIndex: integer): TLoadedConceptMap; - protected - function ItemClass : TFslObjectClass; override; - public - Property map[iIndex : integer] : TLoadedConceptMap read getMap; default; - - end; - // the terminology server maintains a cache of terminology related resources // the rest server notifies terminology server whenever this list changes // (and at start up) @@ -230,9 +202,9 @@ TTerminologyServerStore = class (TFslObject) FBaseValueSets : TFslMap; // value sets out of the specification - these can be overriden, but they never go away FBaseCodeSystems : TFslMap; // value sets out of the specification - these can be overriden, but they never go away - FBaseConceptMaps : TFslMap; // value sets out of the specification - these can be overriden, but they never go away - FConceptMapsById : TFslMap; - FConceptMapsByURL : TFslMap; + FBaseConceptMaps : TFslMap; // value sets out of the specification - these can be overriden, but they never go away + FConceptMapsById : TFslMap; + FConceptMapsByURL : TFslMap; FLoading : boolean; @@ -242,9 +214,9 @@ TTerminologyServerStore = class (TFslObject) procedure BuildStems(cs : TFhirCodeSystemW); procedure checkForDuplicates(codes: TStringList; list: TFhirCodeSystemConceptListW; url : String); - function checkVersion(system, version: String; profile: TFHIRExpansionParams): String; + function checkVersion(system, version: String; profile: TFHIRTxOperationParams): String; procedure AddCodeSystemToCache(cs : TFHIRResourceProxyV; base : boolean); overload; - procedure AddCodeSystemToCache(cs : TFHIRCodeSystemW; base : boolean); overload; + procedure AddCodeSystemToCache(packageId : String; cs : TFHIRCodeSystemW; base : boolean); overload; procedure RemoveCodeSystemFromCache(id : String); function getProviderClasses: TFslMap; function defToLatestForSystem(system : String) : boolean; @@ -252,7 +224,7 @@ TTerminologyServerStore = class (TFslObject) FLock : TFslLock; // it would be possible to use a read/write lock, but the complexity doesn't seem to be justified by the short amount of time in the lock anyway FDB : TFDBManager; procedure invalidateVS(id : String); virtual; - procedure getSummary(b : TStringBuilder); + procedure getSummary(b : TFslStringBuilder); public constructor Create(db : TFDBManager; factory : TFHIRFactory; common : TCommonTerminologies; i18n : TI18nSupport); virtual; destructor Destroy; Override; @@ -267,18 +239,21 @@ TTerminologyServerStore = class (TFslObject) procedure SeeSpecificationResource(resource : TFHIRResourceProxyV); procedure SeeTerminologyResource(resource : TFHIRResourceProxyV); procedure DropTerminologyResource(aType : String; id : String); + procedure loadCodeSystem(cs : TFHIRResourceProxyV); overload; + procedure loadCodeSystem(cs : TFHIRCodeSystemW); overload; // access procedures. All return values are owned, and must be freed - Function getProvider(system : String; version : String; profile : TFHIRExpansionParams; noException : boolean = false) : TCodeSystemProvider; overload; - Function getProvider(codesystem : TFHIRCodeSystemW; profile : TFHIRExpansionParams) : TCodeSystemProvider; overload; + Function getProvider(system : String; version : String; profile : TFHIRTxOperationParams; noException : boolean = false) : TCodeSystemProvider; overload; + Function getProvider(codesystem : TFHIRCodeSystemW; profile : TFHIRTxOperationParams) : TCodeSystemProvider; overload; function getValueSetByUrl(url, version : String; txResources : TFslMetadataResourceList = nil) : TFHIRValueSetW; function getValueSetById(id : String) : TFHIRValueSetW; function getCodeSystemById(id : String) : TFHIRCodeSystemW; function getCodeSystemByValueSet(vs : String) : TFHIRCodeSystemW; function getCodeSystem(url : String; txResources : TFslMetadataResourceList = nil) : TFHIRCodeSystemW; function hasCodesystemUri(url : String; txResources : TFslMetadataResourceList = nil) : Boolean; - function getConceptMapById(id : String) : TLoadedConceptMap; - function getConceptMapBySrcTgt(src, tgt : String) : TLoadedConceptMap; + function getConceptMapById(id : String) : TFHIRConceptMapW; + function getConceptMapByUrl(url : String) : TFHIRConceptMapW; + function getConceptMapBySrcTgt(src, tgt : String) : TFHIRConceptMapW; procedure listVersions(url : String; list : TStringList); // publishing access @@ -286,7 +261,7 @@ TTerminologyServerStore = class (TFslObject) procedure GetCodeSystemList(list : TFslMetadataResourceList); overload; procedure GetValueSetList(list : TFslList); overload; procedure GetValueSetList(list : TFslMetadataResourceList); overload; - function GetConceptMapList : TLoadedConceptMapList; + function GetConceptMapList : TFslList; Property ProviderClasses : TFslMap read getProviderClasses; function ValueSetCount : integer; function CodeSystemCount : integer; @@ -317,119 +292,6 @@ TTerminologyServerStore = class (TFslObject) implementation -Type - - { TAllCodeSystemsProviderFilterPreparationContext } - - TAllCodeSystemsProviderFilterPreparationContext = class (TCodeSystemProviderFilterPreparationContext) - private - rxnorm : TCodeSystemProviderFilterPreparationContext; - ncimeta : TCodeSystemProviderFilterPreparationContext; - snomed : TCodeSystemProviderFilterPreparationContext; - loinc : TCodeSystemProviderFilterPreparationContext; - actcode : TCodeSystemProviderFilterPreparationContext; - unii : TCodeSystemProviderFilterPreparationContext; - public - destructor Destroy; override; - end; - - TAllCodeSystemsProviderFilter = class (TCodeSystemProviderFilterContext) - private - rxnormDone : boolean; - ncimetaDone : boolean; - uniiDone : boolean; - snomedDone : boolean; - loincDone : boolean; - actcodeDone : boolean; - - rxnorm : TCodeSystemProviderFilterContext; - ncimeta : TCodeSystemProviderFilterContext; - unii : TCodeSystemProviderFilterContext; - snomed : TCodeSystemProviderFilterContext; - loinc : TCodeSystemProviderFilterContext; - actcode : TCodeSystemProviderFilterContext; - public - destructor Destroy; override; - end; - - TAllCodeSystemsSource = (acssLoinc, acssSnomed, acssRxNorm, acssActCode, acssUnii); - - { TAllCodeSystemsProviderContext } - - TAllCodeSystemsProviderContext = class (TCodeSystemProviderContext) - private - source : TAllCodeSystemsSource; - context : TCodeSystemProviderContext; - public - destructor Destroy; override; - end; - - TAllCodeSystemsProvider = class (TCodeSystemProvider) - private - FStore: TCommonTerminologies; - FSnomed : TSnomedProvider; - FActCode : TCodeSystemProvider; - public - constructor Create(store : TCommonTerminologies; actCode : TCodeSystemProvider); - destructor Destroy; override; - function TotalCount : integer; override; - function description : String; override; - function getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; override; - function getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; override; - function systemUri(context : TCodeSystemProviderContext) : String; override; - function getDisplay(code : String; langList : THTTPLanguageList):String; override; - function getDefinition(code : String):String; override; - function locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; override; - function sameContext(a, b : TCodeSystemProviderContext) : boolean; override; - function locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; override; - function IsAbstract(context : TCodeSystemProviderContext) : boolean; override; - function Code(context : TCodeSystemProviderContext) : string; override; - function Display(context : TCodeSystemProviderContext; langList : THTTPLanguageList) : string; override; - function Definition(context : TCodeSystemProviderContext) : string; override; - - procedure Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); overload; override; - function searchFilter(filter : TSearchFilterText; prep : TCodeSystemProviderFilterPreparationContext; sort : boolean) : TCodeSystemProviderFilterContext; override; - function filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; override; - function prepare(prep : TCodeSystemProviderFilterPreparationContext) : boolean; override; - function filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; override; - function FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; override; - function FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; override; - function InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; override; - function isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; override; - function getPrepContext : TCodeSystemProviderFilterPreparationContext; override; - procedure defineFeatures(features : TFslList); override; - end; - -{ TAllCodeSystemsProviderContext } - -destructor TAllCodeSystemsProviderContext.Destroy; -begin - context.free; - inherited Destroy; -end; - -destructor TAllCodeSystemsProviderFilter.Destroy; -begin - rxnorm.free; - unii.free; - loinc.free; - snomed.free; - actcode.free; - inherited Destroy; -end; - -{ TAllCodeSystemsProviderFilterPreparationContext } - -destructor TAllCodeSystemsProviderFilterPreparationContext.Destroy; -begin - rxnorm.free; - unii.free; - loinc.free; - snomed.free; - actcode.free; - inherited Destroy; -end; - { TCodeSystemProviderFactory } function TCodeSystemProviderFactory.link: TCodeSystemProviderFactory; @@ -437,371 +299,49 @@ function TCodeSystemProviderFactory.link: TCodeSystemProviderFactory; result := TCodeSystemProviderFactory(inherited link); end; - -function TAllCodeSystemsProvider.TotalCount : integer; -begin - result := FStore.DefSnomed.TotalCount + FStore.Loinc.TotalCount + FActCode.TotalCount + FStore.Unii.TotalCount; - if FStore.RxNorm <> nil then - result := result + FStore.RxNorm.TotalCount; -end; - -function TAllCodeSystemsProvider.getIterator(context : TCodeSystemProviderContext) : TCodeSystemIteratorContext; -begin - if (context = nil) then - result := TCodeSystemIteratorContext.Create(nil, TotalCount) - else - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.getNextContext(context : TCodeSystemIteratorContext) : TCodeSystemProviderContext; -begin - result := nil; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.systemUri(context : TCodeSystemProviderContext) : String; -var - c : TAllCodeSystemsProviderContext; -begin - if Context = nil then - result := ALL_CODE_CS - else - begin - c := context as TAllCodeSystemsProviderContext; - case c.source of - acssLoinc : result := FStore.Loinc.systemUri(c.context); - acssSnomed : result := FStore.DefSnomed.systemUri(); - acssRxNorm : if FStore.RxNorm <> nil then result := FStore.RxNorm.systemUri(c.context) else result := '??tx1'; - acssUnii : result := FStore.Unii.systemUri(c.context); - acssActCode : result := FActCode.systemUri(c.context); - end; - end; -end; - -function TAllCodeSystemsProvider.getDisplay(code : String; langList : THTTPLanguageList):String; -begin - result := ''; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.getPrepContext: TCodeSystemProviderFilterPreparationContext; -var - ctxt : TAllCodeSystemsProviderFilterPreparationContext; -begin - ctxt := TAllCodeSystemsProviderFilterPreparationContext.Create; - try - if FStore.RxNorm <> nil then - ctxt.rxnorm := FStore.RxNorm.getPrepContext; - ctxt.unii := nil; - ctxt.loinc := FStore.Loinc.getPrepContext; - ctxt.snomed := FSnomed.getPrepContext; - ctxt.actcode := Factcode.getPrepContext; - result := ctxt.link; - finally - ctxt.free; - end; -end; - -function TAllCodeSystemsProvider.getDefinition(code : String):String; -begin - result := ''; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.locate(code : String; altOpt : TAlternateCodeOptions; var message : String) : TCodeSystemProviderContext; -begin - result := nil; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - - -function TAllCodeSystemsProvider.locateIsA(code, parent : String; disallowParent : boolean = false) : TCodeSystemProviderContext; -begin - result := nil; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.IsAbstract(context : TCodeSystemProviderContext) : boolean; -var - c : TAllCodeSystemsProviderContext; -begin - result := true; - c := context as TAllCodeSystemsProviderContext; - case c.source of - acssLoinc : result := FStore.Loinc.IsAbstract(c.context); - acssSnomed : result := FSnomed.IsAbstract(c.context); - acssRxNorm : if FStore.RxNorm <> nil then result := FStore.RxNorm.IsAbstract(c.context) else result := false; - acssUnii : result := FStore.Unii.IsAbstract(c.context); - acssActCode : result := FActCode.IsAbstract(c.context); - end; -end; - -function TAllCodeSystemsProvider.Code(context : TCodeSystemProviderContext) : string; -var - c : TAllCodeSystemsProviderContext; -begin - c := context as TAllCodeSystemsProviderContext; - case c.source of - acssLoinc : result := FStore.Loinc.Code(c.context); - acssSnomed : result := FSnomed.Code(c.context); - acssRxNorm : if FStore.RxNorm <> nil then result := FStore.RxNorm.Code(c.context) else result := '??tx2'; - acssUnii : result := FStore.Unii.Code(c.context); - acssActCode : result := FActCode.Code(c.context); - end; -end; - -constructor TAllCodeSystemsProvider.Create(store: TCommonTerminologies; actCode : TCodeSystemProvider); -begin - inherited Create(store.Languages.link); - FStore := store; - FSnomed := TSnomedProvider.Create(FStore.defSnomed.link, nil); - FActCode := actCode; -end; - -procedure TAllCodeSystemsProvider.defineFeatures(features: TFslList); -begin - -end; - -function TAllCodeSystemsProvider.Display(context : TCodeSystemProviderContext; langList : THTTPLanguageList) : string; -var - c : TAllCodeSystemsProviderContext; -begin - c := context as TAllCodeSystemsProviderContext; - case c.source of - acssLoinc : result := FStore.Loinc.Display(c.context, langList)+' (LOINC: '+FStore.Loinc.Code(c.context)+')'; - acssSnomed : result := FSnomed.Display(c.context, langList)+' (S-CT: '+FSnomed.Code(c.context)+')'; - acssRxNorm : if FStore.RxNorm <> nil then result := FStore.RxNorm.Display(c.context, langList)+' (RxN: '+FStore.RxNorm.Code(c.context)+')' else result := ''; - acssUnii : result := FStore.Unii.Display(c.context, langList)+' (Unii: '+FStore.Unii.Code(c.context)+')'; - acssActCode : result := FActCode.Display(c.context, langList)+' (ActCode: '+FActCode.Code(c.context)+')'; - end; -end; - -function TAllCodeSystemsProvider.Definition(context : TCodeSystemProviderContext) : string; -var - c : TAllCodeSystemsProviderContext; -begin - c := context as TAllCodeSystemsProviderContext; - case c.source of - acssLoinc : result := FStore.Loinc.Definition(c.context); - acssSnomed : result := FSnomed.Definition(c.context); - acssRxNorm : if FStore.RxNorm <> nil then result := FStore.RxNorm.Definition(c.context) else result := '??tx3'; - acssUnii : result := FStore.Unii.Definition(c.context); - acssActCode : result := FActCode.Definition(c.context); - end; -end; -function TAllCodeSystemsProvider.description: String; -begin - result := 'All Code Systems combined'; -end; - -destructor TAllCodeSystemsProvider.Destroy; -begin - FActCode.free; - FSnomed.free; - FStore.free; - inherited; -end; - -procedure TAllCodeSystemsProvider.Designations(context : TCodeSystemProviderContext; list : TConceptDesignations); -begin - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.sameContext(a, b: TCodeSystemProviderContext): boolean; -begin - result := false; -end; - -function TAllCodeSystemsProvider.searchFilter(filter : TSearchFilterText; prep : TCodeSystemProviderFilterPreparationContext; sort : boolean) : TCodeSystemProviderFilterContext; -var - ctxt : TAllCodeSystemsProviderFilter; -begin - if filter.filter.trim.Length < 3 then - result := nil - else - begin - ctxt := TAllCodeSystemsProviderFilter.Create; - try - if FStore.RxNorm <> nil then - ctxt.rxnorm := FStore.RxNorm.searchFilter(filter, TAllCodeSystemsProviderFilterPreparationContext(prep).rxnorm, sort); - ctxt.unii := nil; // FStore.Unii.searchFilter(filter, TAllCodeSystemsProviderFilterPreparationContext(prep).unii, sort); - ctxt.snomed := FSnomed.searchFilter(filter, TAllCodeSystemsProviderFilterPreparationContext(prep).snomed, sort); - ctxt.loinc := FStore.loinc.searchFilter(filter, TAllCodeSystemsProviderFilterPreparationContext(prep).loinc, sort); - ctxt.actcode := FActCode.searchFilter(filter, TAllCodeSystemsProviderFilterPreparationContext(prep).actcode, sort); - result := ctxt.Link; - finally - ctxt.free; - end; - end; -end; - -function TAllCodeSystemsProvider.filter(forIteration : boolean; prop : String; op : TFhirFilterOperator; value : String; prep : TCodeSystemProviderFilterPreparationContext) : TCodeSystemProviderFilterContext; -begin - result := nil; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.prepare(prep : TCodeSystemProviderFilterPreparationContext) : boolean; -var - ctxt : TAllCodeSystemsProviderFilterPreparationContext; -begin - result := false; - ctxt := prep as TAllCodeSystemsProviderFilterPreparationContext; - if (ctxt <> nil) then - begin - FStore.Loinc.prepare(ctxt.loinc); - FSnomed.prepare(ctxt.snomed); - if FStore.RxNorm <> nil then - FStore.RxNorm.prepare(ctxt.rxnorm); -// FStore.FUnii.prepare(ctxt.unii); - FActCode.prepare(ctxt.actcode); - end; -end; - -function TAllCodeSystemsProvider.filterLocate(ctxt : TCodeSystemProviderFilterContext; code : String; var message : String) : TCodeSystemProviderContext; -begin - result := nil; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.FilterMore(ctxt : TCodeSystemProviderFilterContext) : boolean; -var - c : TAllCodeSystemsProviderFilter; -begin - if ctxt = nil then - result := false - else - begin - c := TAllCodeSystemsProviderFilter(ctxt); - result := true; - if not c.snomedDone then - c.snomedDone := not FSnomed.FilterMore(c.snomed); - if c.snomedDone then - begin - if not c.actcodeDone then - c.actcodeDone := not FActCode.FilterMore(c.actcode); - if c.actcodeDone then - begin - if not c.loincDone then - c.loincDone := not FStore.Loinc.FilterMore(c.loinc); - if c.loincDone then - begin - if not c.uniiDone then - c.uniiDone := true; // not FStore.unii.FilterMore(c.unii); - if c.uniiDone then - begin - if FStore.RxNorm = nil then - result := false - else - begin - if not c.rxNormDone then - c.rxNormDone := not FStore.RxNorm.FilterMore(c.rxNorm); - result := not c.rxnormDone; - end; - end; - end; - end; - end; - end; -end; - -function TAllCodeSystemsProvider.FilterConcept(ctxt : TCodeSystemProviderFilterContext): TCodeSystemProviderContext; -var - c : TAllCodeSystemsProviderContext; - d : TAllCodeSystemsProviderFilter; -begin - d := ctxt as TAllCodeSystemsProviderFilter; - c := TAllCodeSystemsProviderContext.Create; - try - if not d.snomedDone then - begin - c.source := acssSnomed; - c.context := FSnomed.FilterConcept(d.snomed); - end - else if not d.actCodeDone then - begin - c.source := acssActCode; - c.context := FActCode.FilterConcept(d.actcode); - end - else if not d.loincDone then - begin - c.source := acssLoinc; - c.context := FStore.Loinc.FilterConcept(d.loinc); - end - else if not d.uniiDone then - begin - c.source := acssunii; - c.context := FStore.unii.FilterConcept(d.unii); - end - else if FStore.RxNorm = nil then - begin - // nothing - end - else - begin - c.source := acssRxNorm; - c.context := FStore.RxNorm.FilterConcept(d.rxNorm); - end; - result := c.link; - finally - c.free; - end; -end; - -function TAllCodeSystemsProvider.InFilter(ctxt : TCodeSystemProviderFilterContext; concept : TCodeSystemProviderContext) : Boolean; -begin - result := false; - raise ETerminologyError.Create('Not Created Yet', itNotSupported); -end; - -function TAllCodeSystemsProvider.isNotClosed(textFilter : TSearchFilterText; propFilter : TCodeSystemProviderFilterContext = nil) : boolean; -begin - result := true; -end; - { TTerminologyServerStore } procedure TTerminologyServerStore.BuildStems(cs: TFhirCodeSystemW); - function stems(c : TFhirCodeSystemConceptW) : TConceptAdornment; - var - s, t : String; - begin - result := TConceptAdornment.Create; - c.Tag := result; - t := c.display; - while (t <> '') Do - begin - StringSplit(t, [',', ' ', ':', '.', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', '|', '\', ';', '"', '<', '>', '?', '/', '~', '`', '-', '_', '+', '='], s, t); - if (s <> '') Then - result.Add(lowercase(FStem.Stem(s))); - end; - result.SortAscending; - end; - procedure processConcepts(parent : TFhirCodeSystemConceptW; list : TFhirCodeSystemConceptListW; map : TFhirCodeSystemConceptMapW); - var - c : TFhirCodeSystemConceptW; - begin - for c in list do - begin - stems(c).parent := parent; - if map.ContainsKey(c.code) then - Logging.log('Duplicate code '+c.code+' in '+cs.url) - else - map.Add(c.code, c.Link); - processConcepts(c, c.conceptList, map); - end; - end; + //function stems(c : TFhirCodeSystemConceptW) : TConceptAdornment; + //var + // s, t : String; + //begin + // result := TConceptAdornment.Create; + // c.Tag := result; + // t := c.display; + // while (t <> '') Do + // begin + // StringSplit(t, [',', ' ', ':', '.', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', '|', '\', ';', '"', '<', '>', '?', '/', '~', '`', '-', '_', '+', '='], s, t); + // if (s <> '') Then + // result.Add(lowercase(FStem.Stem(s))); + // end; + // result.SortAscending; + //end; + //procedure processConcepts(parent : TFhirCodeSystemConceptW; list : TFhirCodeSystemConceptListW; map : TFhirCodeSystemConceptMapW); + //var + // c : TFhirCodeSystemConceptW; + //begin + // for c in list do + // begin + // stems(c).parent := parent; + // if map.ContainsKey(c.code) then + // Logging.log('Duplicate code '+c.code+' in '+cs.url) + // else + // map.Add(c.code, c.Link); + // processConcepts(c, c.conceptList, map); + // end; + //end; var map : TFhirCodeSystemConceptMapW; begin - map := TFhirCodeSystemConceptMapW.Create('stems'); - try - cs.Tag := TCodeSystemAdornment.Create(map.link); - processConcepts(nil, cs.conceptList, map); - finally - map.free; - end; + raise EFslException.create('todo'); + //map := TFhirCodeSystemConceptMapW.Create('stems'); + //try + // !cs.Tag := TCodeSystemAdornment.Create(map.link); + // processConcepts(nil, cs.conceptList, map); + //finally + // map.free; + //end; end; @@ -886,9 +426,9 @@ constructor TTerminologyServerStore.Create(db : TFDBManager; factory : TFHIRFact FBaseCodeSystems := TFslMap.Create('tx.cs.base'); FSupplementsById := TFslMap.Create('tx.cs.suppl'); - FBaseConceptMaps := TFslMap.Create('tx.cm.base'); - FConceptMapsById := TFslMap.Create('tx.cm.id'); - FConceptMapsByURL := TFslMap.Create('tx.cm.url'); + FBaseConceptMaps := TFslMap.Create('tx.cm.base'); + FConceptMapsById := TFslMap.Create('tx.cm.id'); + FConceptMapsByURL := TFslMap.Create('tx.cm.url'); FBaseValueSets.defaultValue := nil; FBaseCodeSystems.defaultValue := nil; @@ -952,30 +492,30 @@ procedure TTerminologyServerStore.declareCodeSystems(list : TFslList nil then - addCodesystemUri('LOINC', 'loinc', FCommonTerminologies.FLoinc.systemUri(nil), FCommonTerminologies.FLoinc.version(nil), FCommonTerminologies.FLoinc.TotalCount); + addCodesystemUri('LOINC', 'loinc', FCommonTerminologies.FLoinc.systemUri, FCommonTerminologies.FLoinc.version, FCommonTerminologies.FLoinc.TotalCount); for sn in FCommonTerminologies.FSnomed do begin - sp := TSnomedProvider.Create(sn.link, nil); + sp := TSnomedProvider.Create(sn.link, FI18n.link, nil); try - addCodesystemUri('SNOMED CT', 'sct', sp.systemUri(nil), sp.version(nil), sp.TotalCount); + addCodesystemUri('SNOMED CT', 'sct', sp.systemUri, sp.version, sp.TotalCount); finally sp.free; end; end; if FCommonTerminologies.FUcum <> nil then - addCodesystemUri('Ucum', 'ucum', FCommonTerminologies.FUcum.systemUri(nil), FCommonTerminologies.FUcum.version(nil), FCommonTerminologies.FUcum.TotalCount); + addCodesystemUri('Ucum', 'ucum', FCommonTerminologies.FUcum.systemUri, FCommonTerminologies.FUcum.version, FCommonTerminologies.FUcum.TotalCount); if FCommonTerminologies.FRxNorm <> nil then - addCodesystemUri('RxNorm', 'rxnorm', FCommonTerminologies.FRxNorm.systemUri(nil), FCommonTerminologies.FRxNorm.version(nil), FCommonTerminologies.FRxNorm.TotalCount); + addCodesystemUri('RxNorm', 'rxnorm', FCommonTerminologies.FRxNorm.systemUri, FCommonTerminologies.FRxNorm.version, FCommonTerminologies.FRxNorm.TotalCount); if FCommonTerminologies.NDFRT <> nil then - addCodesystemUri('NDFRT', 'ndfrt', FCommonTerminologies.NDFRT.systemUri(nil), FCommonTerminologies.NDFRT.version(nil), FCommonTerminologies.NDFRT.TotalCount); + addCodesystemUri('NDFRT', 'ndfrt', FCommonTerminologies.NDFRT.systemUri, FCommonTerminologies.NDFRT.version, FCommonTerminologies.NDFRT.TotalCount); if FCommonTerminologies.FUnii <> nil then - addCodesystemUri('Unii', 'unii', FCommonTerminologies.FUnii.systemUri(nil), FCommonTerminologies.FUnii.version(nil), FCommonTerminologies.FUnii.TotalCount); + addCodesystemUri('Unii', 'unii', FCommonTerminologies.FUnii.systemUri, FCommonTerminologies.FUnii.version, FCommonTerminologies.FUnii.TotalCount); if FCommonTerminologies.FCPT <> nil then - addCodesystemUri('CPT', 'cpt', FCommonTerminologies.FCPT.systemUri(nil), FCommonTerminologies.FCPT.version(nil), FCommonTerminologies.FCPT.TotalCount); + addCodesystemUri('CPT', 'cpt', FCommonTerminologies.FCPT.systemUri, FCommonTerminologies.FCPT.version, FCommonTerminologies.FCPT.TotalCount); if FCommonTerminologies.FOMOP <> nil then - addCodesystemUri('OMOP', 'omop', FCommonTerminologies.FOMOP.systemUri(nil), FCommonTerminologies.FOMOP.version(nil), FCommonTerminologies.FOMOP.TotalCount); + addCodesystemUri('OMOP', 'omop', FCommonTerminologies.FOMOP.systemUri, FCommonTerminologies.FOMOP.version, FCommonTerminologies.FOMOP.TotalCount); if FCommonTerminologies.FACIR <> nil then - addCodesystemUri('ACIR', 'acir', FCommonTerminologies.FACIR.systemUri(nil), FCommonTerminologies.FACIR.version(nil), FCommonTerminologies.FACIR.TotalCount); + addCodesystemUri('ACIR', 'acir', FCommonTerminologies.FACIR.systemUri, FCommonTerminologies.FACIR.version, FCommonTerminologies.FACIR.TotalCount); end; @@ -1070,6 +610,7 @@ procedure TTerminologyServerStore.AddCodeSystemToCache(cs : TFHIRResourceProxyV; begin cse := TFHIRCodeSystemEntry.Create(cs.Link); try + cs.TagObject := cse; if base then FBaseCodeSystems.AddOrSetValue(cs.url, cse.Link); if (cs.supplements <> '') then @@ -1099,7 +640,7 @@ procedure TTerminologyServerStore.AddCodeSystemToCache(cs : TFHIRResourceProxyV; end; end; -procedure TTerminologyServerStore.AddCodeSystemToCache(cs: TFHIRCodeSystemW; base: boolean); +procedure TTerminologyServerStore.AddCodeSystemToCache(packageId : String; cs: TFHIRCodeSystemW; base: boolean); var cse, ct : TFHIRCodeSystemEntry; supp : TFHIRResourceProxyV; @@ -1110,14 +651,14 @@ procedure TTerminologyServerStore.AddCodeSystemToCache(cs: TFHIRCodeSystemW; bas FBaseCodeSystems.AddOrSetValue(cs.url, cse.Link); if (cs.supplements <> '') then begin - FSupplementsById.AddOrSetValue(cs.id, TFHIRResourceProxyW.create(cs.Link, cs.url, cs.version)); + FSupplementsById.AddOrSetValue(cs.id, TFHIRResourceProxyW.create(packageId, cs.Link, cs.url, cs.version)); if cs.supplements.StartsWith('CodeSystem/') then begin if FCodeSystems.has(cs.supplements.Substring(11), ct) then - ct.SupplementProxies.Add(TFHIRResourceProxyW.create(cs.Link, cs.vurl, cs.version)); + ct.SupplementProxies.Add(TFHIRResourceProxyW.create(packageId, cs.Link, cs.vurl, cs.version)); end else if FCodeSystems.has(cs.supplements, ct) then - ct.SupplementProxies.Add(TFHIRResourceProxyW.create(cs.Link, cs.url, cs.version)); + ct.SupplementProxies.Add(TFHIRResourceProxyW.create(packageId, cs.Link, cs.url, cs.version)); end else begin @@ -1128,7 +669,7 @@ procedure TTerminologyServerStore.AddCodeSystemToCache(cs: TFHIRCodeSystemW; bas // BuildStems(cs); // todo: bring it back and move this out of the lock for supp in FSupplementsById.values do if (supp.supplements = cs.url) or (supp.supplements = 'CodeSystem/'+cs.id) then - cse.SupplementProxies.Add(TFHIRResourceProxyW.create(cs.Link, cs.url, cs.version)); + cse.SupplementProxies.Add(TFHIRResourceProxyW.create(packageId, cs.Link, cs.url, cs.version)); end; finally cse.free; @@ -1174,7 +715,7 @@ procedure TTerminologyServerStore.SeeSpecificationResource(resource : TFHIRResou var vs : TFhirValueSetW; cs : TFhirCodeSystemW; - cm : TLoadedConceptMap; + cm : TFHIRConceptMapW; begin FLock.Lock('SeeSpecificationResource'); try @@ -1192,7 +733,7 @@ procedure TTerminologyServerStore.SeeSpecificationResource(resource : TFHIRResou begin cs := FFactory.wrapCodesystem(vs.Resource.link); try - AddCodeSystemToCache(cs, true); + AddCodeSystemToCache(resource.packageId, cs, true); finally cs.free; end; @@ -1207,17 +748,11 @@ procedure TTerminologyServerStore.SeeSpecificationResource(resource : TFHIRResou end else if (resource.fhirType = 'ConceptMap') then begin - cm := TLoadedConceptMap.Create; - try - cm.Resource := resource.resourceW.Link as TFHIRConceptMapW; - cm.Source := getValueSetByUrl(cm.Resource.source, ''); - cm.Target := getValueSetByUrl(cm.Resource.target, ''); - FConceptMapsById.AddOrSetValue(cm.Resource.id, cm.Link); - FConceptMapsByURL.AddOrSetValue(cm.Resource.url, cm.Link); - FBaseConceptMaps.AddOrSetValue(cm.Resource.url, cm.Link); - finally - cm.free; - end; + cm := resource.resourceW as TFHIRConceptMapW; + FConceptMapsById.AddOrSetValue(cm.id, cm.Link); + FConceptMapsByURL.AddOrSetValue(cm.url, cm.Link); + FConceptMapsByURL.AddOrSetValue(cm.vurl, cm.Link); + FBaseConceptMaps.AddOrSetValue(cm.url, cm.Link); end finally FLock.Unlock; @@ -1228,7 +763,7 @@ procedure TTerminologyServerStore.SeeTerminologyResource(resource : TFHIRResourc var vs : TFhirValueSetW; cs : TFhirCodeSystemW; - cm : TLoadedConceptMap; + cm : TFHIRConceptMapW; begin FLock.Lock('SeeTerminologyResource'); try @@ -1246,7 +781,7 @@ procedure TTerminologyServerStore.SeeTerminologyResource(resource : TFHIRResourc begin cs := FFactory.wrapCodesystem(vs.resource.Link); try - AddCodeSystemToCache(cs, true); + AddCodeSystemToCache(resource.packageId, cs, true); finally cs.free; end; @@ -1257,20 +792,14 @@ procedure TTerminologyServerStore.SeeTerminologyResource(resource : TFHIRResourc else if (resource.fhirType = 'CodeSystem') then begin cs := resource.resourceW as TFHIRCodeSystemW; - AddCodeSystemToCache(cs, false); + AddCodeSystemToCache(resource.packageId, cs, false); end else if (resource.fhirType = 'ConceptMap') then begin - cm := TLoadedConceptMap.Create; - try - cm.Resource := resource.resourceW.Link as TFHIRConceptMapW; - cm.Source := getValueSetByUrl(cm.Resource.source, ''); - cm.Target := getValueSetByUrl(cm.Resource.target, ''); - FConceptMapsById.AddOrSetValue(cm.Resource.id, cm.Link); - FConceptMapsByURL.AddOrSetValue(cm.Resource.url, cm.Link); - finally - cm.free; - end; + cm := resource.resourceW as TFHIRConceptMapW; + FConceptMapsById.AddOrSetValue(cm.id, cm.Link); + FConceptMapsByURL.AddOrSetValue(cm.url, cm.Link); + FConceptMapsByURL.AddOrSetValue(cm.vurl, cm.Link); end; finally FLock.Unlock; @@ -1285,7 +814,7 @@ procedure TTerminologyServerStore.SetCacheStatus(status: boolean); procedure TTerminologyServerStore.DropTerminologyResource(aType : String; id : String); var vs, vs1 : TFhirResourceProxyV; - cm, cm1 : TLoadedConceptMap; + cm, cm1 : TFhirConceptMapW; cs : TFhirCodeSystemW; vsW : TFHIRValueSetW; begin @@ -1335,16 +864,16 @@ procedure TTerminologyServerStore.DropTerminologyResource(aType : String; id : S cm := FConceptMapsById[id]; if cm <> nil then begin - cm1 := FBaseConceptMaps[cm.Resource.url]; - FConceptMapsByURL.Remove(cm.Resource.url); + cm1 := FBaseConceptMaps[cm.url]; + FConceptMapsByURL.Remove(cm.url); FConceptMapsByid.Remove(id); // cm is no longer valid // add the base one back if we are dropping a concept map that overrides it // current logical flaw: what if there's another one that overrides this? how do we prevent or deal with this? if cm1 <> nil then begin - FConceptMapsById.AddOrSetValue(cm1.Resource.id, cm1.Link); - FConceptMapsByURL.AddOrSetValue(cm1.Resource.url, cm1.Link); + FConceptMapsById.AddOrSetValue(cm1.id, cm1.Link); + FConceptMapsByURL.AddOrSetValue(cm1.url, cm1.Link); end; end; end; @@ -1353,37 +882,28 @@ procedure TTerminologyServerStore.DropTerminologyResource(aType : String; id : S end; end; -procedure TTerminologyServerStore.UpdateConceptMaps; +procedure TTerminologyServerStore.loadCodeSystem(cs: TFHIRResourceProxyV); var - cm : TLoadedConceptMap; + cse : TFHIRCodeSystemEntry; +begin + cse := cs.TagObject as TFHIRCodeSystemEntry; + checkCSLoaded(cse); +end; + +procedure TTerminologyServerStore.loadCodeSystem(cs: TFHIRCodeSystemW); +begin + raise EFslException.create('loadCodeSystem(TFHIRCodeSystemW) not done yet'); +end; + +procedure TTerminologyServerStore.UpdateConceptMaps; begin - assert(FLock.LockedToMe); - for cm in FConceptMapsById.values do - begin - if cm.Resource.source = '' then - cm.source := nil - else - begin - cm.Source := getValueSetByUrl(cm.Resource.source, ''); - if (cm.Source = nil) then - cm.Source := getValueSetById(cm.Resource.source); - end; - if cm.Resource.target = '' then - cm.Target := nil - else - begin - cm.Target := getValueSetByUrl(cm.Resource.target, ''); - if (cm.Target = nil) then - cm.Target := getValueSetById(cm.Resource.target); - end; - end; end; procedure TTerminologyServerStore.SetLoading(AValue: boolean); begin if FLoading then begin - FLock.Lock; + FLock.Lock('SetLoading'); try UpdateConceptMaps; finally @@ -1488,29 +1008,55 @@ procedure TTerminologyServerStore.GetCodeSystemList(list : TFslList "'+tgt+'"') + else + Logging.log('Find map "'+lcm.url+'" for "'+src+'" -> "'+tgt+'"'); end; -function TTerminologyServerStore.GetConceptMapList: TLoadedConceptMapList; +function TTerminologyServerStore.GetConceptMapList: TFslList; var - cm : TLoadedConceptMap; + cm : TFhirConceptMapW; begin - result := TLoadedConceptMapList.Create; + result := TFslList.Create; try FLock.Lock('GetConceptMapList'); try for cm in FConceptMapsById.values do - result.Add(TLoadedConceptMap(cm.Link)); + result.Add(cm.Link); finally FLock.Unlock; end; @@ -1539,6 +1089,7 @@ function TTerminologyServerStore.GetConceptMapList: TLoadedConceptMapList; end; end; + procedure TTerminologyServerStore.GetValueSetList(list : TFslList); begin FLock.Lock('GetValueSetList'); @@ -1550,7 +1101,7 @@ procedure TTerminologyServerStore.GetValueSetList(list : TFslList nil then begin checkCSLoaded(cs); - result := TFhirCodeSystemProvider.Create(FCommonTerminologies.FLanguages.link, ffactory.link, cs.link); + result := TFhirCodeSystemProvider.Create(FCommonTerminologies.FLanguages.link, FI18n.link, ffactory.link, cs.link); end; finally cs.free; @@ -1666,26 +1211,91 @@ function TTerminologyServerStore.getProvider(system: String; version: String; procedure TTerminologyServerStore.checkCSLoaded(codesystem: TFHIRCodeSystemEntry); var p : TFHIRResourceProxyV; + state : integer; // go = 0, load = 1, wait for loading = 2, exception = 3 + msg : String; begin - // todo: make this more efficient on the lock - FLock.Lock; + FLock.Lock('checkCSLoaded'); try - if not codeSystem.Loaded then - begin - codeSystem.Loaded := true; - codesystem.CodeSystem := codeSystem.CodeSystemProxy.resourceW.link as TFHIRCodeSystemW; - for p in codeSystem.SupplementProxies do - codeSystem.Supplements.add(p.resourceW.link as TFHIRCodeSystemW); + case codesystem.LoadingState of + cseNotLoaded : // first encounter + begin + state := 1; + codesystem.LoadingState := cseLoading; + end; + cseLoading : // some other thread is loading it + begin + state := 2; + end; + cseLoaded: + begin + state := 0; + end; + cseLoadingFailed: + begin + state := 3; + msg := codesystem.LoadingFailMessage; + end; end; finally FLock.Unlock; end; + case state of + 0: ; // nothing + 1: + begin + try + msg := ''; + try + codesystem.CodeSystem := codeSystem.CodeSystemProxy.resourceW.link as TFHIRCodeSystemW; + for p in codeSystem.SupplementProxies do + codeSystem.Supplements.add(p.resourceW.link as TFHIRCodeSystemW); + except + on e : Exception do + msg := e.Message; + end; + + finally + FLock.Lock('checkCSLoaded2'); + try + if msg = '' then + codesystem.LoadingState := cseLoaded + else + begin + codesystem.LoadingState := cseLoadingFailed; + codesystem.LoadingFailMessage := msg; + end; + finally + FLock.Unlock; + end; + if (msg <> '') then + raise ETerminologyError.create(msg, itException); + end; + end; + 2: + begin + repeat + sleep(100); + FLock.Lock('checkCSLoaded3'); + try + case codesystem.LoadingState of + cseNotLoaded: raise ETerminologyError.create('Impossible State NotLoaded', itException); + cseLoading : state := 0; + cseLoaded: state := 1; + cseLoadingFailed:raise ETerminologyError.create(codesystem.LoadingFailMessage, itException); + end; + finally + FLock.Unlock; + end; + until state = 1; + end; + 3: raise ETerminologyError.create(msg, itException); + end; end; -function TTerminologyServerStore.getProvider(codesystem: TFHIRCodeSystemW; profile: TFHIRExpansionParams): TCodeSystemProvider; +function TTerminologyServerStore.getProvider(codesystem: TFHIRCodeSystemW; profile: TFHIRTxOperationParams): TCodeSystemProvider; begin checkVersion(codeSystem.url, codeSystem.version, profile); - result := TFhirCodeSystemProvider.Create(FCommonTerminologies.FLanguages.link, FFactory.link, TFHIRCodeSystemEntry.Create(codesystem.link)); + result := TFhirCodeSystemProvider.Create(FCommonTerminologies.FLanguages.link, FI18n.link, FFactory.link, TFHIRCodeSystemEntry.Create(codesystem.link)); end; function TTerminologyServerStore.getProviderClasses: TFslMap; @@ -1693,7 +1303,7 @@ function TTerminologyServerStore.getProviderClasses: TFslMap) : boolean; -var - gl : TFslList; -begin - gl := Resource.groups; - try - result := HasTranslation(gl, system, code, maps); - finally - gl.free; - end; -end; - -function TLoadedConceptMap.Link: TLoadedConceptMap; -begin - result := TLoadedConceptMap(inherited Link); -end; - -function TLoadedConceptMap.HasTranslation(list : TFslList; system, code : String; out maps : TFslList) : boolean; -var - g : TFhirConceptMapGroupW; - c : TFhirConceptMapGroupElementW; -begin - result := false; - for g in list do - for c in g.elements.forEnum do - begin - if (g.source = system) and (c.code = code) then - begin - maps := c.targets; - result := true; - exit; - end; - end; -end; - -procedure TLoadedConceptMap.SetResource(const Value: TFhirConceptMapW); -begin - FResource.free; - FResource := Value; -end; - -procedure TLoadedConceptMap.SetSource(const Value: TFhirValueSetW); -begin - FSource.free; - FSource := Value; -end; - -procedure TLoadedConceptMap.SetTarget(const Value: TFhirValueSetW); -begin - FTarget.free; - FTarget := Value; -end; - -{ TLoadedConceptMapList } - -function TLoadedConceptMapList.getMap(iIndex: integer): TLoadedConceptMap; -begin - result := TLoadedConceptMap(ObjectByIndex[iIndex]); -end; - -function TLoadedConceptMapList.itemClass: TFslObjectClass; -begin - result := TLoadedConceptMap; -end; - - { TCommonTerminologies } function TCommonTerminologies.add(p: TCodeSystemProvider) : TCodeSystemProvider; begin - if p.version(nil) <> '' then - FProviderClasses.Add(p.systemUri(nil)+URI_VERSION_BREAK+p.version(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); - if not FProviderClasses.ContainsKey(p.systemUri(nil)) then - FProviderClasses.Add(p.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); + if p.version <> '' then + FProviderClasses.Add(p.systemUri+URI_VERSION_BREAK+p.version, TCodeSystemProviderGeneralFactory.Create(p.link)); + if not FProviderClasses.ContainsKey(p.systemUri) then + FProviderClasses.Add(p.systemUri, TCodeSystemProviderGeneralFactory.Create(p.link)); result := p; end; procedure TCommonTerminologies.add(p: TCodeSystemProvider; defVer: boolean); begin - if p.version(nil) <> '' then - FProviderClasses.Add(p.systemUri(nil)+URI_VERSION_BREAK+p.version(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); - if defVer and not FProviderClasses.ContainsKey(p.systemUri(nil)) then - FProviderClasses.Add(p.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); + if p.version <> '' then + FProviderClasses.Add(p.systemUri+URI_VERSION_BREAK+p.version, TCodeSystemProviderGeneralFactory.Create(p.link)); + if defVer and not FProviderClasses.ContainsKey(p.systemUri) then + FProviderClasses.Add(p.systemUri, TCodeSystemProviderGeneralFactory.Create(p.link)); end; procedure TCommonTerminologies.add(p: TCodeSystemProviderFactory; defVer: boolean); @@ -2039,20 +1573,12 @@ procedure TCommonTerminologies.add(p: TCodeSystemProviderFactory; defVer: boolea FProviderClasses.Add(p.systemUri, p.link); end; -procedure TCommonTerminologies.clearSnomed; -var - ss : TSnomedServices; -begin - for ss in FSnomed do - if ss <> FDefSnomed then - ss.unloadMe; -end; - -constructor TCommonTerminologies.Create(settings : TFHIRServerSettings); +constructor TCommonTerminologies.Create(settings: TFHIRServerSettings); begin inherited Create; FSettings := settings; - FSnomed := TFslList.Create; + FSnomed := TFslList.Create; + FI18n := i18n; end; procedure TCommonTerminologies.defineFeatures(features: TFslList); @@ -2063,7 +1589,7 @@ procedure TCommonTerminologies.defineFeatures(features: TFslList); FLoinc.defineFeatures(features); if FDefSnomed <> nil then begin - sp := TSnomedProvider.Create(FDefSnomed.link, nil); + sp := TSnomedProvider.Create(FDefSnomed.link, FI18n.link, nil); try sp.defineFeatures(features); finally @@ -2089,7 +1615,8 @@ procedure TCommonTerminologies.defineFeatures(features: TFslList); end; destructor TCommonTerminologies.Destroy; -begin +begin + FI18n.free; FProviderClasses.free; FNDFRT.free; FNDC.free; @@ -2133,11 +1660,10 @@ procedure TCommonTerminologies.recordStats(rec: TStatusRecord); ss : TSnomedServices; begin for ss in FSnomed do - if (ss.Loaded) then - rec.SnomedsLoaded := rec.SnomedsLoaded + 1; + rec.SnomedsLoaded := rec.SnomedsLoaded + 1; end; -procedure TCommonTerminologies.getSummary(b: TStringBuilder); +procedure TCommonTerminologies.getSummary(b: TFslStringBuilder); var sn : TSnomedServices; sp : TSnomedProvider; @@ -2145,7 +1671,7 @@ procedure TCommonTerminologies.getSummary(b: TStringBuilder); if FLoinc = nil then b.append('
        • LOINC: not loaded
        • ') else - b.append('
        • LOINC: '+FLoinc.version(nil)+' ('+inttostr(FLoinc.UseCount)+' uses)'); + b.append('
        • LOINC: '+FLoinc.version+' ('+inttostr(FLoinc.UseCount)+' uses)'); if FSnomed.Count = 0 then @@ -2156,37 +1682,37 @@ procedure TCommonTerminologies.getSummary(b: TStringBuilder); if FUcum = nil then b.append('
        • Ucum: not loaded
        • ') else - b.append('
        • Ucum: '+FUcum.version(nil)+' ('+inttostr(FUcum.UseCount)+' uses)'); + b.append('
        • Ucum: '+FUcum.version+' ('+inttostr(FUcum.UseCount)+' uses)'); if FRxNorm = nil then b.append('
        • RxNorm: not loaded
        • ') else - b.append('
        • RxNorm: '+FRxNorm.version(nil)+' ('+inttostr(FRxNorm.UseCount)+' uses)'); + b.append('
        • RxNorm: '+FRxNorm.version+' ('+inttostr(FRxNorm.UseCount)+' uses)'); if FNDFRT = nil then b.append('
        • NDFRT: not loaded
        • ') else - b.append('
        • NDFRT: '+NDFRT.version(nil)+' ('+inttostr(NDFRT.UseCount)+' uses)'); + b.append('
        • NDFRT: '+NDFRT.version+' ('+inttostr(NDFRT.UseCount)+' uses)'); if FUnii = nil then b.append('
        • Unii: not loaded
        • ') else - b.append('
        • Unii: '+FUnii.version(nil)+' ('+inttostr(FUnii.UseCount)+' uses)'); + b.append('
        • Unii: '+FUnii.version+' ('+inttostr(FUnii.UseCount)+' uses)'); if FCPT = nil then b.append('
        • CPT: not loaded
        • ') else - b.append('
        • CPT: '+FCPT.version(nil)+' ('+inttostr(FCPT.UseCount)+' uses)'); + b.append('
        • CPT: '+FCPT.version+' ('+inttostr(FCPT.UseCount)+' uses)'); if FOMOP = nil then b.append('
        • OMOP: not loaded
        • ') else - b.append('
        • OMOP: '+FOMOP.version(nil)+' ('+inttostr(FOMOP.UseCount)+' uses)'); + b.append('
        • OMOP: '+FOMOP.version+' ('+inttostr(FOMOP.UseCount)+' uses)'); if FACIR = nil then b.append('
        • ACIR: not loaded
        • ') else - b.append('
        • ACIR: '+FACIR.version(nil)+' ('+inttostr(FACIR.UseCount)+' uses)'); + b.append('
        • ACIR: '+FACIR.version+' ('+inttostr(FACIR.UseCount)+' uses)'); end; function TCommonTerminologies.link: TCommonTerminologies; @@ -2216,7 +1742,7 @@ procedure TCommonTerminologies.load(txlist: TFHIRServerConfigSection; testing : s : string; sn: TSnomedServices; sp : TSnomedProviderFactory; -// def : boolean; + def : boolean; p : TUriServices; function fixFile(name, fn : String) : String; begin @@ -2239,22 +1765,22 @@ procedure TCommonTerminologies.load(txlist: TFHIRServerConfigSection; testing : FLanguages := TIETFLanguageDefinitions.Create(FileToString(s, TEncoding.ASCII)); FProviderClasses := TFslMap.Create('tc.common'); - p := TUriServices.Create(FLanguages.link); + p := TUriServices.Create(FLanguages.link, FI18n.link); try - FProviderClasses.Add(p.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); - FProviderClasses.Add(p.systemUri(nil)+URI_VERSION_BREAK+p.version(nil), TCodeSystemProviderGeneralFactory.Create(p.link)); + FProviderClasses.Add(p.systemUri, TCodeSystemProviderGeneralFactory.Create(p.link)); + FProviderClasses.Add(p.systemUri+URI_VERSION_BREAK+p.version, TCodeSystemProviderGeneralFactory.Create(p.link)); finally p.free; end; - add(TIETFLanguageCodeServices.Create(FLanguages.link)).free; - add(TACIRServices.Create(FLanguages.link)).free; - add(TAreaCodeServices.Create(FLanguages.link)).free; - add(TIso4217Services.Create(FLanguages.link)).free; - add(TMimeTypeCodeServices.Create(FLanguages.link)).free; - add(TCountryCodeServices.Create(FLanguages.link)).free; - add(TUSStateServices.Create(FLanguages.link)).free; - add(THGVSProvider.Create(FLanguages.link)).free; + add(TIETFLanguageCodeServices.Create(FLanguages.link, FI18n.link)).free; + add(TACIRServices.Create(FLanguages.link, FI18n.link)).free; + add(TAreaCodeServices.Create(FLanguages.link, FI18n.link)).free; + add(TIso4217Services.Create(FLanguages.link, FI18n.link)).free; + add(TMimeTypeCodeServices.Create(FLanguages.link, FI18n.link)).free; + add(TCountryCodeServices.Create(FLanguages.link, FI18n.link)).free; + add(TUSStateServices.Create(FLanguages.link, FI18n.link)).free; + add(THGVSProvider.Create(FLanguages.link, FI18n.link)).free; for tx in txList.sections do begin @@ -2266,12 +1792,13 @@ procedure TCommonTerminologies.load(txlist: TFHIRServerConfigSection; testing : Logging.log('load '+s+' from '+tx['source'].value); sn := TSnomedServices.Create(FLanguages.link); try - sn.Load(fixFile('sct', tx['source'].value), tx['default'].value = 'true'); - sp := TSnomedProviderFactory.Create(sn.link); + sn.Load(fixFile('sct', tx['source'].value)); + sp := TSnomedProviderFactory.Create(sn.link, FI18n.link); try - add(sp, tx['default'].readAsBool); - if not FProviderClasses.ContainsKey(sn.systemUri()+URI_VERSION_BREAK+sn.EditionUri) then - FProviderClasses.Add(sn.systemUri()+URI_VERSION_BREAK+sn.EditionUri, sp.link); + def := tx['default'].readAsBool; + add(sp, def); + if not FProviderClasses.ContainsKey(sn.systemUri()+URI_VERSION_BREAK+sn.EditionUri) or def then + FProviderClasses.AddOrSetValue(sn.systemUri()+URI_VERSION_BREAK+sn.EditionUri, sp.link); finally sp.free; end; @@ -2285,7 +1812,7 @@ procedure TCommonTerminologies.load(txlist: TFHIRServerConfigSection; testing : else if tx['type'].value = 'loinc' then begin Logging.log('load '+s+' from '+tx['source'].value); - Loinc := TLoincServices.Create(FLanguages.link); + Loinc := TLoincServices.Create(FLanguages.link, FI18n.link); try Loinc.Load(fixFile('loinc', tx['source'].value)); add(Loinc.link); @@ -2296,43 +1823,43 @@ procedure TCommonTerminologies.load(txlist: TFHIRServerConfigSection; testing : else if tx['type'].value = 'ucum' then begin Logging.log('load '+s+' from '+tx['source'].value); - Ucum := TUcumServices.Create(FLanguages.link); + Ucum := TUcumServices.Create(FLanguages.link, FI18n.link); Ucum.Import(fixFile('ucum', tx['source'].value)); end else if tx['type'].value = 'rxnorm' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - RxNorm := TRxNormServices.Create(FLanguages.link, connectToDatabase(tx)) + RxNorm := TRxNormServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else if tx['type'].value = 'ndc' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - NDC := TNDCServices.Create(FLanguages.link, connectToDatabase(tx), tx['version'].value) + NDC := TNDCServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true), tx['version'].value) end else if tx['type'].value = 'ndfrt' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - NDFRT := TNDFRTServices.Create(FLanguages.link, connectToDatabase(tx)) + NDFRT := TNDFRTServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else if tx['type'].value = 'unii' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - Unii := TUniiServices.Create(FLanguages.link, connectToDatabase(tx)) + Unii := TUniiServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else if tx['type'].value = 'cpt' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - CPT := TCPTServices.Create(FLanguages.link, connectToDatabase(tx)) + CPT := TCPTServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else if tx['type'].value = 'omop' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - OMOP := TOMOPServices.Create(FLanguages.link, connectToDatabase(tx)) + OMOP := TOMOPServices.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else if tx['type'].value = 'xig' then begin Logging.log('load '+s+' from '+describeDatabase(tx)); - XIG := TXIGProvider.Create(FLanguages.link, connectToDatabase(tx)) + XIG := TXIGProvider.Create(FLanguages.link, FI18n.link, connectToDatabase(tx, true)) end else raise EFslException.Create('Unknown type '+tx['type'].value); @@ -2350,31 +1877,37 @@ procedure TCommonTerminologies.SetCPT(AValue: TCPTServices); begin if FCPT <> nil then begin - FProviderClasses.Remove(FCPT.systemUri(nil)); - FProviderClasses.Remove(FCPT.systemUri(nil)+URI_VERSION_BREAK+FCPT.version(nil)); + FProviderClasses.Remove(FCPT.systemUri); + FProviderClasses.Remove(FCPT.systemUri+URI_VERSION_BREAK+FCPT.version); end; FCPT.free; FCPT := AValue; if FCPT <> nil then begin - FProviderClasses.add(FCPT.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FCPT.Link)); - FProviderClasses.add(FCPT.systemUri(nil)+URI_VERSION_BREAK+FCPT.version(nil), TCodeSystemProviderGeneralFactory.Create(FCPT.Link)); + FProviderClasses.add(FCPT.systemUri, TCodeSystemProviderGeneralFactory.Create(FCPT.Link)); + FProviderClasses.add(FCPT.systemUri+URI_VERSION_BREAK+FCPT.version, TCodeSystemProviderGeneralFactory.Create(FCPT.Link)); end; end; +procedure TCommonTerminologies.SetI18n(AValue: TI18nSupport); +begin + FI18n.free; + FI18n := AValue; +end; + procedure TCommonTerminologies.SetOMOP(AValue: TOMOPServices); begin if FOMOP <> nil then begin - FProviderClasses.Remove(FOMOP.systemUri(nil)); - FProviderClasses.Remove(FOMOP.systemUri(nil)+URI_VERSION_BREAK+FOMOP.version(nil)); + FProviderClasses.Remove(FOMOP.systemUri); + FProviderClasses.Remove(FOMOP.systemUri+URI_VERSION_BREAK+FOMOP.version); end; FOMOP.free; FOMOP := AValue; if FOMOP <> nil then begin - FProviderClasses.add(FOMOP.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FOMOP.Link)); - FProviderClasses.add(FOMOP.systemUri(nil)+URI_VERSION_BREAK+FOMOP.version(nil), TCodeSystemProviderGeneralFactory.Create(FOMOP.Link)); + FProviderClasses.add(FOMOP.systemUri, TCodeSystemProviderGeneralFactory.Create(FOMOP.Link)); + FProviderClasses.add(FOMOP.systemUri+URI_VERSION_BREAK+FOMOP.version, TCodeSystemProviderGeneralFactory.Create(FOMOP.Link)); end; end; @@ -2382,15 +1915,15 @@ procedure TCommonTerminologies.SetRxNorm(const Value: TRxNormServices); begin if FRxNorm <> nil then begin - FProviderClasses.Remove(FRxNorm.systemUri(nil)); - FProviderClasses.Remove(FRxNorm.systemUri(nil)+URI_VERSION_BREAK+FRxNorm.version(nil)); + FProviderClasses.Remove(FRxNorm.systemUri); + FProviderClasses.Remove(FRxNorm.systemUri+URI_VERSION_BREAK+FRxNorm.version); end; FRxNorm.free; FRxNorm := Value; if FRxNorm <> nil then begin - FProviderClasses.add(FRxNorm.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FRxNorm.Link)); - FProviderClasses.add(FRxNorm.systemUri(nil)+URI_VERSION_BREAK+FRxNorm.version(nil), TCodeSystemProviderGeneralFactory.Create(FRxNorm.Link)); + FProviderClasses.add(FRxNorm.systemUri, TCodeSystemProviderGeneralFactory.Create(FRxNorm.Link)); + FProviderClasses.add(FRxNorm.systemUri+URI_VERSION_BREAK+FRxNorm.version, TCodeSystemProviderGeneralFactory.Create(FRxNorm.Link)); end; end; @@ -2398,15 +1931,15 @@ procedure TCommonTerminologies.SetNDC(const Value: TNDCServices); begin if FNDC <> nil then begin - FProviderClasses.Remove(FNDC.systemUri(nil)); - FProviderClasses.Remove(FNDC.systemUri(nil)+URI_VERSION_BREAK+FNDC.version(nil)); + FProviderClasses.Remove(FNDC.systemUri); + FProviderClasses.Remove(FNDC.systemUri+URI_VERSION_BREAK+FNDC.version); end; FNDC.free; FNDC := Value; if FNDC <> nil then begin - FProviderClasses.add(FNDC.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FNDC.Link)); - FProviderClasses.add(FNDC.systemUri(nil)+URI_VERSION_BREAK+FNDC.version(nil), TCodeSystemProviderGeneralFactory.Create(FNDC.Link)); + FProviderClasses.add(FNDC.systemUri, TCodeSystemProviderGeneralFactory.Create(FNDC.Link)); + FProviderClasses.add(FNDC.systemUri+URI_VERSION_BREAK+FNDC.version, TCodeSystemProviderGeneralFactory.Create(FNDC.Link)); end; end; @@ -2414,15 +1947,15 @@ procedure TCommonTerminologies.SetNDFRT(const Value: TNDFRTServices); begin if FNDFRT <> nil then begin - FProviderClasses.Remove(FNDFRT.systemUri(nil)); - FProviderClasses.Remove(FNDFRT.systemUri(nil)+URI_VERSION_BREAK+FNDFRT.version(nil)); + FProviderClasses.Remove(FNDFRT.systemUri); + FProviderClasses.Remove(FNDFRT.systemUri+URI_VERSION_BREAK+FNDFRT.version); end; FNDFRT.free; FNDFRT := Value; if FNDFRT <> nil then begin - FProviderClasses.add(FNDFRT.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FNDFRT.Link)); - FProviderClasses.add(FNDFRT.systemUri(nil)+URI_VERSION_BREAK+FNDFRT.version(nil), TCodeSystemProviderGeneralFactory.Create(FNDFRT.Link)); + FProviderClasses.add(FNDFRT.systemUri, TCodeSystemProviderGeneralFactory.Create(FNDFRT.Link)); + FProviderClasses.add(FNDFRT.systemUri+URI_VERSION_BREAK+FNDFRT.version, TCodeSystemProviderGeneralFactory.Create(FNDFRT.Link)); end; end; @@ -2436,41 +1969,31 @@ procedure TCommonTerminologies.SetUnii(const Value: TUniiServices); begin if FUnii <> nil then begin - FProviderClasses.Remove(FUnii.systemUri(nil)); - FProviderClasses.Remove(FUnii.systemUri(nil)+URI_VERSION_BREAK+FUnii.version(nil)); + FProviderClasses.Remove(FUnii.systemUri); + FProviderClasses.Remove(FUnii.systemUri+URI_VERSION_BREAK+FUnii.version); end; FUnii.free; FUnii := Value; if FUnii <> nil then begin - FProviderClasses.add(FUnii.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FUnii.Link)); - FProviderClasses.add(FUnii.systemUri(nil)+URI_VERSION_BREAK+FUnii.version(nil), TCodeSystemProviderGeneralFactory.Create(FUnii.Link)); + FProviderClasses.add(FUnii.systemUri, TCodeSystemProviderGeneralFactory.Create(FUnii.Link)); + FProviderClasses.add(FUnii.systemUri+URI_VERSION_BREAK+FUnii.version, TCodeSystemProviderGeneralFactory.Create(FUnii.Link)); end; end; -procedure TCommonTerminologies.sweepSnomed(callback: TFhirServerMaintenanceThreadTaskCallBack); -var - ss : TSnomedServices; -begin - callback(self, 'Sweeping Snomed', -1); - for ss in FSnomed do - if ss <> FDefSnomed then - ss.checkUnloadMe; -end; - procedure TCommonTerminologies.SetACIR(const Value: TACIRServices); begin if FACIR <> nil then begin - FProviderClasses.Remove(FACIR.systemUri(nil)); - FProviderClasses.Remove(FACIR.systemUri(nil)+URI_VERSION_BREAK+FACIR.version(nil)); + FProviderClasses.Remove(FACIR.systemUri); + FProviderClasses.Remove(FACIR.systemUri+URI_VERSION_BREAK+FACIR.version); end; FACIR.free; FACIR := Value; if FACIR <> nil then begin - FProviderClasses.add(FACIR.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FACIR.Link)); - FProviderClasses.add(FACIR.systemUri(nil)+URI_VERSION_BREAK+FACIR.version(nil), TCodeSystemProviderGeneralFactory.Create(FACIR.Link)); + FProviderClasses.add(FACIR.systemUri, TCodeSystemProviderGeneralFactory.Create(FACIR.Link)); + FProviderClasses.add(FACIR.systemUri+URI_VERSION_BREAK+FACIR.version, TCodeSystemProviderGeneralFactory.Create(FACIR.Link)); end; end; @@ -2484,15 +2007,15 @@ procedure TCommonTerminologies.SetUcum(const Value: TUcumServices); begin if FUcum <> nil then begin - FProviderClasses.Remove(FUcum.systemUri(nil)); - FProviderClasses.Remove(FUcum.systemUri(nil)+URI_VERSION_BREAK+FUcum.version(nil)); + FProviderClasses.Remove(FUcum.systemUri); + FProviderClasses.Remove(FUcum.systemUri+URI_VERSION_BREAK+FUcum.version); end; FUcum.free; FUcum := Value; if FUcum <> nil then begin - FProviderClasses.add(FUcum.systemUri(nil), TCodeSystemProviderGeneralFactory.Create(FUcum.Link)); - FProviderClasses.add(FUcum.systemUri(nil)+URI_VERSION_BREAK+FUcum.version(nil), TCodeSystemProviderGeneralFactory.Create(FUcum.Link)); + FProviderClasses.add(FUcum.systemUri, TCodeSystemProviderGeneralFactory.Create(FUcum.Link)); + FProviderClasses.add(FUcum.systemUri+URI_VERSION_BREAK+FUcum.version, TCodeSystemProviderGeneralFactory.Create(FUcum.Link)); end; end; @@ -2517,12 +2040,12 @@ function TCodeSystemProviderGeneralFactory.getProvider: TCodeSystemProvider; function TCodeSystemProviderGeneralFactory.systemUri: String; begin - result := FProvider.systemUri(nil); + result := FProvider.systemUri; end; function TCodeSystemProviderGeneralFactory.version: String; begin - result := FProvider.version(nil); + result := FProvider.version; end; function TCodeSystemProviderGeneralFactory.name: String; @@ -2537,7 +2060,7 @@ function TCodeSystemProviderGeneralFactory.TotalCount: integer; function TCodeSystemProviderGeneralFactory.versionDesc: String; begin - result := FProvider.version(nil); + result := FProvider.version; end; function TCodeSystemProviderGeneralFactory.description: String; @@ -2547,21 +2070,23 @@ function TCodeSystemProviderGeneralFactory.description: String; { TSnomedProviderFactory } -constructor TSnomedProviderFactory.Create(snomed: TSnomedServices); +constructor TSnomedProviderFactory.Create(snomed: TSnomedServices; i18n : TI18nSupport); begin inherited Create; FSnomed := snomed; + FI18n := i18n; end; destructor TSnomedProviderFactory.Destroy; begin + FI18n.free; FSnomed.free; inherited Destroy; end; function TSnomedProviderFactory.getProvider: TCodeSystemProvider; begin - result := TSnomedProvider.Create(FSnomed.Link, nil); + result := TSnomedProvider.Create(FSnomed.Link, FI18n.link, nil); end; function TSnomedProviderFactory.systemUri: String; diff --git a/server/tx_operations.pas b/server/tx_operations.pas index 2a5d46d3f..7aa27714a 100644 --- a/server/tx_operations.pas +++ b/server/tx_operations.pas @@ -37,10 +37,12 @@ interface fsl_base, fsl_utilities, fsl_logging, fsl_http, fsl_lang, fdb_manager, fhir_objects, fhir_utilities, fhir_common, fhir_factory, - fhir_valuesets, + fhir_tx, fhir_valuesets, session, storage, ftx_service, tx_manager, tx_server, closuremanager, time_tracker; type + TLoadCodedType = (lctCS, lctVS, lctCMSrc, lctCMTgt); + { TFhirTerminologyOperation } @@ -49,9 +51,9 @@ TFhirTerminologyOperation = class (TFhirOperation) FServer : TTerminologyServer; function isValidation : boolean; virtual; - procedure processExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params : TFhirParametersW; result : TFHIRExpansionParams); - function buildExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params : TFhirParametersW) : TFHIRExpansionParams; - function loadCoded(request : TFHIRRequest; isValueSet : boolean; var issuePath : string; var mode : TValidationCheckMode) : TFhirCodeableConceptW; + procedure processExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params : TFhirParametersW; result : TFHIRTxOperationParams); + function buildExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params : TFhirParametersW) : TFHIRTxOperationParams; + function loadCoded(request : TFHIRRequest; loadType : TLoadCodedType; var issuePath : string; var mode : TValidationCheckMode) : TFhirCodeableConceptW; function processAdditionalResources(context : TOperationContext; manager: TFHIROperationEngine; mr : TFHIRMetadataResourceW; params : TFHIRParametersW) : TFslMetadataResourceList; public constructor Create(factory : TFHIRFactory; server : TTerminologyServer; languages : TIETFLanguageDefinitions); @@ -112,10 +114,16 @@ TFhirSubsumesOperation = class (TFhirTerminologyOperation) function formalURL : String; override; end; + { TFhirConceptMapTranslationOperation } + TFhirConceptMapTranslationOperation = class (TFhirTerminologyOperation) protected function isWrite : boolean; override; function owningResource : String; override; + + function findSystem(params : TFHIRParametersW; name, prefix : String) : String; + procedure findConceptMap(list : TFslList; srcCS, srcVS, tgtCS, tgtVS : String; txResources : TFslMetadataResourceList); + function mapOk(map : TFHIRConceptMapW; srcCS, srcVS, tgtCS, tgtVS: String): boolean; public function Name : String; override; function Types : TArray; override; @@ -152,6 +160,26 @@ TFhirConceptMapClosureOperation = class (TFhirTerminologyOperation) function formalURL : String; override; end; + {$IFDEF DEV_FEATURES} + { TFhirFeatureNegotiation } + + TFhirFeatureNegotiation = class (TFhirOperation) + protected + function isWrite : boolean; override; + function owningResource : String; override; + + procedure loadFromParameters(list : TFslList; params : THTTPParameters); + procedure loadFromResource(list : TFslList; params : TFhirResourceV); + function processFeature(context : TOperationContext; manager: TFHIROperationEngine; feature : TFhirFeatureQueryItem) : TFhirFeatureQueryAnswer; + procedure encodeAnswer(p : TFhirParametersParameterW; answer : TFhirFeatureQueryAnswer); + public + function Name : String; override; + function Types : TArray; override; + function CreateDefinition(base : String) : TFHIROperationDefinitionW; override; + function Execute(context : TOperationContext; manager: TFHIROperationEngine; request: TFHIRRequest; response : TFHIRResponse; tt : TTimeTracker) : String; override; + function formalURL : String; override; + end; + {$ENDIF} implementation @@ -216,7 +244,7 @@ function TFhirExpandValueSetOperation.Execute(context : TOperationContext; manag vs, dst : TFHIRValueSetW; resourceKey, versionKey : integer; url, cacheId, filter, id, version : String; - profile : TFHIRExpansionParams; + profile : TFHIRTxOperationParams; limit, count, offset : integer; params : TFhirParametersW; needSecure : boolean; @@ -322,12 +350,10 @@ function TFhirExpandValueSetOperation.Execute(context : TOperationContext; manag limit := -1 else if limit > UPPER_LIMIT_TEXT then limit := UPPER_LIMIT_TEXT; // can't ask for more than this externally, though you can internally - if (count > 0) and (offset = -1) then - offset := 0; if (txResources = nil) then txResources := processAdditionalResources(context, manager, nil, params); - dst := FServer.expandVS(vs, cacheId, profile, filter, limit, count, offset, txResources); + dst := FServer.expandVS(vs, request.internalRequestId, cacheId, profile, filter, limit, count, offset, txResources, params.str('no-cache') = 'please'); try response.HTTPCode := 200; response.Message := 'OK'; @@ -424,18 +450,23 @@ function TFhirValueSetValidationOperation.Execute(context : TOperationContext; m var vs : TFHIRValueSetW; resourceKey, versionKey : integer; - cacheId, url, summary, issuePath, version : String; + cacheId, url, summary, issuePath, version, msg : String; coded : TFhirCodeableConceptW; // coding : TFhirCodingW; abstractOk, inferSystem : boolean; params, pout : TFhirParametersW; - needSecure, isValueSet : boolean; + oOut : TFHIROperationOutcomeW; + needSecure : boolean; + loadType : TLoadCodedType; mode : TValidationCheckMode; - profile : TFhirExpansionParams; + profile : TFhirTxOperationParams; txResources : TFslMetadataResourceList; - mr : TFHIRMetadataResourceW; + mr : TFHIRMetadataResourceW; begin - isValueSet := request.ResourceName = 'ValueSet'; + if request.ResourceName = 'ValueSet' then + loadType := lctVS + else + loadType := lctCS; result := 'Validate Code'; try @@ -449,84 +480,98 @@ function TFhirValueSetValidationOperation.Execute(context : TOperationContext; m try vs := nil; txResources := nil; + pout := nil; + oOut := nil; profile := nil; try - coded := loadCoded(request, isValueSet, issuePath, mode); + profile := buildExpansionParams(request, manager, params); + coded := loadCoded(request, loadType, issuePath, mode); try result := 'Validate Code '+coded.renderText; - if isValueSet then - begin - // first, we have to identify the value set. - if request.Id <> '' then // and it must exist, because of the check above - begin - vs := FFactory.wrapValueSet(manager.GetResourceById(request, 'ValueSet', request.Id, request.baseUrl, needSecure)); - cacheId := vs.url; - result := result+' in vs '+request.id; - end - else if params.has('url') then + try + if loadType = lctVS then begin - url := params.str('url'); - version := params.str('valueSetVersion'); - if (version = '') then - result := result+' in vs '+url+'|'+version+' (ref)' - else - result := result+' in vs '+url+' (ref)'; - txResources := processAdditionalResources(context, manager, nil, params); - for mr in txResources do - if (canonicalMatches(mr, url, version)) and (mr is TFHIRValueSetW) then + // first, we have to identify the value set. + if request.Id <> '' then // and it must exist, because of the check above + begin + vs := FFactory.wrapValueSet(manager.GetResourceById(request, 'ValueSet', request.Id, request.baseUrl, needSecure)); + cacheId := vs.url; + result := result+' in vs '+request.id; + end + else if params.has('url') then + begin + url := params.str('url'); + version := params.str('valueSetVersion'); + if (version = '') then + result := result+' in vs '+url+'|'+version+' (ref)' + else + result := result+' in vs '+url+' (ref)'; + txResources := processAdditionalResources(context, manager, nil, params); + for mr in txResources do + if (canonicalMatches(mr, url, version)) and (mr is TFHIRValueSetW) then + begin + vs := (mr as TFHIRValueSetW).link; + break; + end; + if vs = nil then + vs := FServer.getValueSetByUrl(url, version); + if vs = nil then + if not FServer.isKnownValueSet(url, vs) then + vs := FFactory.wrapValueSet(manager.GetResourceByUrl('ValueSet', url, version, false, needSecure)); + if vs = nil then begin - vs := (mr as TFHIRValueSetW).link; - break; - end; - if vs = nil then - vs := FServer.getValueSetByUrl(url, version); - if vs = nil then - if not FServer.isKnownValueSet(url, vs) then - vs := FFactory.wrapValueSet(manager.GetResourceByUrl('ValueSet', url, version, false, needSecure)); - if vs = nil then - raise ETerminologySetup.Create('Unable to resolve value set "'+url+'"'); - cacheId := vs.vurl; - end - else if params.has('valueSet') then - begin - if not (params.obj('valueSet') is TFHIRResourceV) then - raise ETerminologyError.Create('Error with valueSet parameter - must be a value set', itInvalid); - vs := FFactory.wrapValueSet(params.obj('valueSet').Link as TFHIRResourceV); - result := result+' in vs '+vs.url+' (param)'; - txResources := processAdditionalResources(context, manager, vs, params); - end - else if (request.Resource <> nil) and (request.Resource.fhirType = 'ValueSet') then - begin - vs := FFactory.wrapValueSet(request.Resource.Link); - result := result+' in vs '+vs.url+' (res)'; - txResources := processAdditionalResources(context, manager, vs, params); - end - // else - // raise ETerminologyError.Create('Unable to find valueset to validate against (not provided by id, identifier, or directly)'); - end; - - abstractOk := params.str('abstract') = 'true'; - inferSystem := (params.str('inferSystem') = 'true') or (params.str('implySystem') = 'true'); - - if (coded = nil) then - raise ETerminologyError.Create('Unable to find code to validate (looked for coding | codeableConcept | code in parameters ='+params.names+')', itNotFound); + msg := FServer.i18n.translate('Unable_to_resolve_value_Set_', profile.HTTPLanguages, [url]); + oOut := FFactory.wrapOperationOutcome(FFactory.makeResource('OperationOutcome')); + oOut.addIssue(isError, itNotFound, '', msg, oicNotFound); + end + else + cacheId := vs.vurl; + end + else if params.has('valueSet') then + begin + if not (params.obj('valueSet') is TFHIRResourceV) then + raise ETerminologyError.Create('Error with valueSet parameter - must be a value set', itInvalid); + vs := FFactory.wrapValueSet(params.obj('valueSet').Link as TFHIRResourceV); + result := result+' in vs '+vs.url+' (param)'; + txResources := processAdditionalResources(context, manager, vs, params); + end + else if (request.Resource <> nil) and (request.Resource.fhirType = 'ValueSet') then + begin + vs := FFactory.wrapValueSet(request.Resource.Link); + result := result+' in vs '+vs.url+' (res)'; + txResources := processAdditionalResources(context, manager, vs, params); + end + // else + // raise ETerminologyError.Create('Unable to find valueset to validate against (not provided by id, identifier, or directly)'); + end; - if vs <> nil then - begin - vs.checkNoImplicitRules('ValueSetValidation', 'ValueSet'); - FFactory.checkNoModifiers(vs.Resource, 'ValueSetValidation', 'ValueSet'); - end; - if txResources = nil then - txResources := processAdditionalResources(context, manager, nil, params); + abstractOk := params.str('abstract') <> 'false'; + inferSystem := (params.str('inferSystem') = 'true') or (params.str('implySystem') = 'true'); - profile := buildExpansionParams(request, manager, params); - pout := FServer.validate(issuePath, vs, coded, profile, abstractOk, inferSystem, mode, txResources, summary); - try + if (oOut = nil) and (pout = nil) then + begin + if (coded = nil) then + raise ETerminologyError.Create('Unable to find code to validate (looked for coding | codeableConcept | code in parameters ='+params.names+')', itNotFound); + + if vs <> nil then + begin + vs.checkNoImplicitRules('ValueSetValidation', 'ValueSet'); + FFactory.checkNoModifiers(vs.Resource, 'ValueSetValidation', 'ValueSet'); + end; + if txResources = nil then + txResources := processAdditionalResources(context, manager, nil, params); + + pout := FServer.validate(request.id, issuePath, vs, coded, profile, abstractOk, inferSystem, mode, txResources, summary); + end; if summary <> '' then result := result + ': '+summary; - response.resource := pout.Resource.link; + if (oOut <> nil) then + response.resource := oOut.Resource.link + else + response.resource := pout.Resource.link; finally pOut.free; + oOut.free; end; response.HTTPCode := 200; response.Message := 'OK'; @@ -683,9 +728,81 @@ function TFhirConceptMapTranslationOperation.owningResource: String; result := 'ConceptMap'; end; +function TFhirConceptMapTranslationOperation.findSystem(params: TFHIRParametersW; name, prefix: String): String; +var + c : TFHIRCodingW; + cc : TFhirCodeableConceptW; +begin + if params.has(name) then + result := params.str(name) + else if params.has(prefix+'Coding') then + begin + c := FFactory.wrapCoding(params.param[prefix+'Coding'].value.link); + try + result := c.systemUri; + finally + c.free; + end; + end + else if params.has(prefix+'CodeableConcept') then + begin + cc := FFactory.wrapCodeableConcept(params.param[prefix+'CodeableConcept'].value.link); + try + for c in cc.codings.forEnum do + result := c.systemUri; + finally + c.free; + end; + end + else + result := ''; +end; + + +function TFhirConceptMapTranslationOperation.mapOk(map : TFHIRConceptMapW; srcCS, srcVS, tgtCS, tgtVS: String): boolean; +var + srcOk, tgtOk : boolean; + g : TFhirConceptMapGroupW; +begin + srcOk := (srcVS <> '') and (map.source = srcVS); + if (srcCS <> '') then + for g in map.groups.forEnum do + if (g.source = srcCS) then + srcOk := true; + + tgtOk := (tgtVS <> '') and (map.target = srcVS); + if (tgtCS <> '') then + for g in map.groups.forEnum do + if (g.target = tgtCS) then + tgtOk := true; + + result := srcOk and tgtOk; + Logging.log('Map: '+map.url+' ('+map.source+'->'+map.target+'): '+boolToStr(result)+' for '+srcCS+':'+srcVS+' -> '+tgtCS+':'+tgtVS); +end; + +procedure TFhirConceptMapTranslationOperation.findConceptMap(list : TFslList; srcCS, srcVS, tgtCS, tgtVS: String; txResources: TFslMetadataResourceList); +var + mr : TFHIRMetadataResourceW; + all : TFslList; + cm : TFHIRConceptMapW; +begin + for mr in txResources do + if (mr is TFHIRConceptMapW) then + if mapOk(mr as TFHIRConceptMapW, srcCS, srcVS, tgtCS, tgtVS) then + list.add(mr.link as TFHIRConceptMapW); + //all := FServer.GetConceptMapList; + //try + // for cm in all do + // if mapOk(cm, srcCS, srcVS, tgtCS, tgtVS) then + // list.add(cm.link); + //finally + // all.free; + //end; +end; + function TFhirConceptMapTranslationOperation.Execute(context : TOperationContext; manager: TFHIROperationEngine; request: TFHIRRequest; response: TFHIRResponse; tt : TTimeTracker) : String; var - cm : TLoadedConceptMap; + cml : TFslList; // op : TFhirOperationOutcome; // resourceKey : integer; coded : TFhirCodeableConceptW; @@ -693,71 +810,78 @@ function TFhirConceptMapTranslationOperation.Execute(context : TOperationContext dummy : TValidationCheckMode; params, pOut : TFhirParametersW; issuePath : String; + txResources : TFslMetadataResourceList; + profile : TFhirTxOperationParams; + srcSystem, tgtSystem : String; begin result := 'Translate'; - try - manager.NotFound(request, response); - if manager.check(response, manager.opAllowed(request.ResourceName, request.CommandType), 400, manager.langList, StringFormat(GetFhirMessage('MSG_OP_NOT_ALLOWED', manager.langList), [CODES_TFHIRCommandType[request.CommandType], request.ResourceName]), itForbidden) then - begin + try + txResources := nil; + try + manager.NotFound(request, response); + if manager.check(response, manager.opAllowed(request.ResourceName, request.CommandType), 400, manager.langList, StringFormat(GetFhirMessage('MSG_OP_NOT_ALLOWED', manager.langList), [CODES_TFHIRCommandType[request.CommandType], request.ResourceName]), itForbidden) then + begin params := makeParams(request); try - // we have to find the right concept map - // it doesn't matter whether the value sets are actually defined or not - if request.id <> '' then - cm := FServer.getConceptMapById(request.id) - else - cm := FServer.getConceptMapBySrcTgt(params.str('valueset'), params.str('target')); - if cm = nil then - raise ETerminologyError.Create('Unable to find concept map to use', itNotFound); + profile := buildExpansionParams(request, manager, params); try - // ok, now we need to find the source code to validate - coded := loadCoded(request, true, issuePath, dummy); -(* if params.has('coding') then - begin - coded := TFhirCodeableConcept.Create; - coded.codingList.add(LoadDTFromParam(request.Context, params.str['coding'], request.lang, 'coding', TFhirCoding) as TFhirCoding) - end - else if params.has('codeableConcept') then - coded := LoadDTFromParam(request.Context, params.str['codeableConcept'], request.lang, 'codeableConcept', TFhirCodeableConcept) as TFhirCodeableConcept - else if params.has('code') and params.has('system') then - begin - coded := TFhirCodeableConcept.Create; - coding := coded.codingList.Append; - coding.system := params.str['system']; - coding.version := params.str['version']; - coding.code := params.str['code']; - coding.display := params.str['display']; - end - else - raise ETerminologyError.Create('Unable to find code to translate (looked for coding | codeableConcept | code in parameters ='+params.names+')'); - *) + txResources := processAdditionalResources(context, manager, nil, params); + + cml := TFslList.create; try - coding := coded.codings; + // concept map - might be provided by id, url, vurl, or inline, or we might infer it from additional and known concept maps + if request.id <> '' then + cml.addIfNotNull(FServer.getConceptMapById(request.id)) + else if params.has('conceptMapVersion') and params.has('url') then + cml.addIfNotNull(FServer.getConceptMapByUrl(params.str('url')+'|'+params.str('conceptMapVersion'))) + else if params.str('url') <> '' then + cml.addIfNotNull(FServer.getConceptMapByUrl(params.str('url'))) + else if (params.has('conceptMap')) then + cml.addIfNotNull(FFactory.wrapConceptMap(params.param['conceptMap'].resource)) + else + begin + srcSystem := findSystem(params, 'system', 'source'); + tgtSystem := findSystem(params, 'targetSystem', 'target'); + findConceptMap(cml, srcSystem, params.str('sourceScope'), tgtSystem, params.str('targetScope'), txResources); + end; + if (cml.Empty) then + raise ETerminologyError.Create('Unable to find a conceptMap to use when translating (not provided by id, url, directly, or found by scope)'); + + // ok, now we need to find the source code to validate + coded := loadCoded(request, lctCMSrc, issuePath, dummy); try - pOut := FServer.translate(request.langList, cm, coding[0]); + coding := coded.codings; try - response.resource := pOut.Resource.link; - response.HTTPCode := 200; - response.Message := 'OK'; - response.Body := ''; - response.LastModifiedDate := now; + pOut := FServer.translate(request.langList, request.id, cml, coding[0], params, txResources, profile); + try + response.resource := pOut.Resource.link; + response.HTTPCode := 200; + response.Message := 'OK'; + response.Body := ''; + response.LastModifiedDate := now; + finally + pOut.free; + end; finally - pOut.free; + coding.free; end; finally - coding.free; + coded.free; end; finally - coded.free; + cml.free; end; finally - cm.free; + profile.free; end; finally params.free; end; + end; + manager.AuditRest(request.session, request.internalRequestId, request.externalRequestId, request.ip, request.ResourceName, request.id, response.versionId, 0, request.CommandType, request.Provenance, request.OperationName, response.httpCode, '', response.message, []); + finally + txResources.free; end; - manager.AuditRest(request.session, request.internalRequestId, request.externalRequestId, request.ip, request.ResourceName, request.id, response.versionId, 0, request.CommandType, request.Provenance, request.OperationName, response.httpCode, '', response.message, []); except on e: exception do begin @@ -800,58 +924,70 @@ function TFhirLookupCodeSystemOperation.Execute(context : TOperationContext; man req : TFHIRLookupOpRequestW; resp : TFHIRLookupOpResponseW; c : TFhirCodingW; - langList : THTTPLanguageList; + langList : THTTPLanguageList; + txResources : TFslMetadataResourceList; + profile : TFhirTxOperationParams; + params, pOut : TFhirParametersW; + worker : TFHIRCodeSystemInformationProvider; begin result := 'lookup code'; try - manager.NotFound(request, response); - if manager.check(response, manager.opAllowed(request.ResourceName, request.CommandType), 400, manager.langList, StringFormat(GetFhirMessage('MSG_OP_NOT_ALLOWED', manager.langList), [CODES_TFHIRCommandType[request.CommandType], request.ResourceName]), itForbidden) then - begin - if (request.id <> '') then - raise ETerminologyError.Create('Lookup does not take an identified resource', itInvalid); - req := ffactory.makeOpReqLookup; - try - if (request.Resource <> nil) and (request.Resource.fhirType = 'Parameters') then - req.load(request.Resource) - else - req.load(request.Parameters); - req.loadCoding; - if req.displayLanguage <> '' then - langList := THTTPLanguageList.Create(req.displayLanguage, false) - else - langList := request.langList.Link; + txResources := nil; + try + manager.NotFound(request, response); + if manager.check(response, manager.opAllowed(request.ResourceName, request.CommandType), 400, manager.langList, StringFormat(GetFhirMessage('MSG_OP_NOT_ALLOWED', manager.langList), [CODES_TFHIRCommandType[request.CommandType], request.ResourceName]), itForbidden) then + begin + if (request.id <> '') then + raise ETerminologyError.Create('Lookup does not take an identified resource', itInvalid); + params := makeParams(request); + req := ffactory.makeOpReqLookup; try - result := 'lookup code '+req.coding.renderText; - - response.Body := ''; - response.LastModifiedDate := now; - resp := ffactory.makeOpRespLookup; + if (request.Resource <> nil) and (request.Resource.fhirType = 'Parameters') then + req.load(request.Resource) + else + req.load(request.Parameters); + req.loadCoding; + profile := buildExpansionParams(request, manager, params); + if req.displayLanguage <> '' then + langList := THTTPLanguageList.Create(req.displayLanguage, false) + else + langList := request.langList.Link; try + txResources := processAdditionalResources(context, manager, nil, params); + result := 'lookup code '+req.coding.renderText; + response.Body := ''; + response.LastModifiedDate := now; + resp := ffactory.makeOpRespLookup; try - FServer.lookupCode(req.coding, langList, req.propList, resp); // currently, we ignore the date - response.CacheControl := cacheNotAtAll; - response.Resource := resp.asParams; - response.HTTPCode := 200; - response.Message := 'OK'; - except - on e : Exception do - begin - response.HTTPCode := 400; - response.Message := 'Error'; - response.Resource := FFactory.BuildOperationOutcome(request.LangList, e, itInvalid); + try + FServer.lookupCode(req.coding, request.id, profile, langList, req.propList, resp, txResources); // currently, we ignore the date + response.CacheControl := cacheNotAtAll; + response.Resource := resp.asParams; + response.HTTPCode := 200; + response.Message := 'OK'; + except + on e : Exception do + begin + response.HTTPCode := 400; + response.Message := 'Error'; + response.Resource := FFactory.BuildOperationOutcome(request.LangList, e, itInvalid); + end; end; + finally + resp.free; end; finally - resp.free; + langList.free; + profile.free; end; finally - langList.free; + req.free; end; - finally - req.free; end; + manager.AuditRest(request.session, request.internalRequestId, request.externalRequestId, request.ip, request.ResourceName, request.id, response.versionId, 0, request.CommandType, request.Provenance, request.OperationName, response.httpCode, '', response.message, []); + finally + txResources.free; end; - manager.AuditRest(request.session, request.internalRequestId, request.externalRequestId, request.ip, request.ResourceName, request.id, response.versionId, 0, request.CommandType, request.Provenance, request.OperationName, response.httpCode, '', response.message, []); except on e: exception do begin @@ -1175,6 +1311,7 @@ function TFhirTerminologyOperation.processAdditionalResources(context : TOperati cacheId : String; vs : TFHIRValueSetW; cs : TFHIRCodeSystemW; + cm : TFHIRConceptMapW; begin cacheId := ''; list := TFslMetadataResourceList.Create; @@ -1187,9 +1324,9 @@ function TFhirTerminologyOperation.processAdditionalResources(context : TOperati begin cacheId := p.valueString; end; - if (p.name = 'tx-resource') then + if (p.name = 'tx-resource') and (p.resource <> nil) then begin - if p.resource.fhirType = 'ValueSet' then + if (p.resource.fhirType = 'ValueSet') then begin vs := FFactory.wrapValueSet(p.resource.link); list.Add(vs); @@ -1200,6 +1337,12 @@ function TFhirTerminologyOperation.processAdditionalResources(context : TOperati cs := FFactory.wrapCodeSystem(p.resource.link); list.Add(cs); cs.TagInt := 1; // marks it as not stored + end + else if p.resource.fhirType = 'ConceptMap' then + begin + cm := FFactory.wrapConceptMap(p.resource.link); + list.Add(cm); + cm.TagInt := 1; // marks it as not stored end; end; end; @@ -1222,7 +1365,7 @@ function TFhirTerminologyOperation.isValidation: boolean; result := false; end; -procedure TFhirTerminologyOperation.processExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params: TFhirParametersW; result : TFHIRExpansionParams); +procedure TFhirTerminologyOperation.processExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params: TFhirParametersW; result : TFHIRTxOperationParams); var p : TFhirParametersParameterW; obj : TFHIRObject; @@ -1251,7 +1394,9 @@ procedure TFhirTerminologyOperation.processExpansionParams(request: TFHIRRequest if (params.str('default-to-latest-version') <> '') then result.defaultToLatestVersion := StrToBoolDef(params.str('default-to-latest-version'), false); if (params.str('incomplete-ok') <> '') then - result.incompleteOK := StrToBoolDef(params.str('incomplete-ok'), false); + result.incompleteOK := StrToBoolDef(params.str('incomplete-ok'), false); + if (params.str('diagnostics') <> '') then + result.diagnostics := StrToBoolDef(params.str('diagnostics'), false); for p in params.parameterList do begin if (p.name = 'system-version') then @@ -1261,7 +1406,7 @@ procedure TFhirTerminologyOperation.processExpansionParams(request: TFHIRRequest else if (p.name = 'force-system-version') then result.seeVersionRule(p.valueString, fvmOverride) else if (p.name = 'displayLanguage') then - result.languages := THTTPLanguageList.create(p.valueString, not isValidation) + result.DisplayLanguages := THTTPLanguageList.create(p.valueString, not isValidation) else if (p.name = 'property') then result.properties.add(p.valueString) else if (p.name = 'lenient-display-validation') and (p.valueString = 'true') then @@ -1287,15 +1432,15 @@ procedure TFhirTerminologyOperation.processExpansionParams(request: TFHIRRequest end end; - if not result.hasLanguages and (request.ContentLanguage <> '') then - result.languages := THTTPLanguageList.create(request.ContentLanguage, not isValidation);; - if not result.hasLanguages and (request.LangList <> nil) and (request.LangList.source <> '') then - result.languages := THTTPLanguageList.create(request.LangList.source, not isValidation); + if not result.hasHTTPLanguages and (request.ContentLanguage <> '') then + result.HTTPLanguages := THTTPLanguageList.create(request.ContentLanguage, not isValidation);; + if not result.hasHTTPLanguages and (request.LangList <> nil) and (request.LangList.source <> '') then + result.HTTPLanguages := THTTPLanguageList.create(request.LangList.source, not isValidation); end; -function TFhirTerminologyOperation.buildExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params: TFhirParametersW): TFHIRExpansionParams; +function TFhirTerminologyOperation.buildExpansionParams(request: TFHIRRequest; manager: TFHIROperationEngine; params: TFhirParametersW): TFHIRTxOperationParams; begin - result := TFHIRExpansionParams.Create; + result := TFHIRTxOperationParams.Create; try processExpansionParams(request, manager, params, result); result.link; @@ -1316,7 +1461,7 @@ destructor TFhirTerminologyOperation.Destroy; inherited; end; -function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet : boolean; var issuePath : string; var mode : TValidationCheckMode): TFhirCodeableConceptW; +function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; loadType : TLoadCodedType; var issuePath : string; var mode : TValidationCheckMode): TFhirCodeableConceptW; var coding : TFhirCodingW; params : TFhirParametersW; @@ -1357,7 +1502,7 @@ function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet coding.free; end; end - else if not isValueSet and request.Parameters.has('code') and request.Parameters.has('url') then + else if (loadType = lctCS) and request.Parameters.has('code') and request.Parameters.has('url') then begin issuePath := ''; mode := vcmCode; @@ -1394,7 +1539,7 @@ function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet result := FFactory.wrapCodeableConcept(params.obj('codeableConcept').Link); issuePath := 'CodeableConcept'; end - else if (params.has('code') and (params.has('system')) or (isValueSet and (params.has('code') and (params.bool('inferSystem') or params.bool('implySystem'))))) then + else if (params.has('code') and (params.has('system')) or ((loadType = lctVS) and (params.has('code') and (params.bool('inferSystem') or params.bool('implySystem'))))) then begin issuePath := ''; mode := vcmCode; @@ -1414,7 +1559,7 @@ function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet coding.free; end; end - else if not isValueSet and (params.has('code') and params.has('url')) then + else if (loadType = lctCS) and (params.has('code') and params.has('url')) then begin issuePath := ''; mode := vcmCode; @@ -1431,6 +1576,23 @@ function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet coding.free; end; end + else if (loadType = lctCMSrc) then + begin + if params.has('sourceCode') and params.has('system') then + begin + result := FFactory.wrapCodeableConcept(fFactory.makeByName('CodeableConcept')); + coding := result.addCoding; + try + coding.systemUri := params.str('system'); + coding.version := params.str('version'); + coding.code := params.str('sourceCode'); + finally + coding.free; + end; + end + else + raise ETerminologyError.Create('Unable to find code to validate (looked for coding | codeableConcept | code in parameters ='+params.names+')', itNotFound); + end else raise ETerminologyError.Create('Unable to find code to validate (looked for coding | codeableConcept | code in parameters ='+params.names+')', itNotFound); finally @@ -1441,4 +1603,160 @@ function TFhirTerminologyOperation.loadCoded(request : TFHIRRequest; isValueSet raise ETerminologyError.Create('Unable to find code to validate (looked for coding | codeableConcept | code+system in parameters ='+request.Parameters.Source+')', itNotFound); end; + +{$IFDEF DEV_FEATURES} +{ TFhirFeatureNegotiation } + +function TFhirFeatureNegotiation.isWrite: boolean; +begin + Result := false; +end; + +function TFhirFeatureNegotiation.owningResource: String; +begin + Result := ''; +end; + +procedure TFhirFeatureNegotiation.loadFromParameters(list: TFslList; params: THTTPParameters); +var + s : String; +begin + for s in params.values('param') do + list.add(TFhirFeatureQueryItem.fromParam(FFactory, s)); +end; + +procedure TFhirFeatureNegotiation.loadFromResource(list: TFslList; params: TFhirResourceV); +var + p : TFHIRParametersW; + pp, ppp : TFhirParametersParameterW; + f, c: String; + v : TFHIRObject; +begin + p := FFactory.wrapParams(params.link); + try + for pp in p.parameterList do + if pp.name = 'feature' then + begin + v := nil; + for ppp in pp.partList do + begin + if ppp.name = 'name' then + f := ppp.valueString + else if ppp.name = 'context' then + c := ppp.valueString + else if ppp.name = 'value' then + v := ppp.value.link; + end; + if (f <> '') then + list.add(TFhirFeatureQueryItem.create(f, c, v)); + end; + finally + p.free; + end; +end; + +function TFhirFeatureNegotiation.processFeature(context : TOperationContext; manager: TFHIROperationEngine; feature: TFhirFeatureQueryItem): TFhirFeatureQueryAnswer; +begin + result := TFhirFeatureQueryAnswer.create; + try + result.Feature := feature.Feature; + result.Context := feature.context; + if (feature.feature = 'instantiates') then + begin + if (result.Context = '') then + begin + result.ProcessingStatus := fqpsAllOk; + if (feature.values.Empty) then + result.values.add(FFactory.makeUri('http://hl7.org/fhir/CapabilityStatement/terminology-server')) + else + begin + result.values.addAll(feature.values.Link); + result.setAnswer(feature.Values[0].ToString = 'http://hl7.org/fhir/CapabilityStatement/terminology-server'); + end; + end + else + result.ProcessingStatus := fqpsUnknownContext; + end + else + begin + result.ProcessingStatus := fqpsUnknownFeature; + manager.processFeature(feature, result); + end; + result.link; + finally + result.free; + end; +end; + +procedure TFhirFeatureNegotiation.encodeAnswer(p: TFhirParametersParameterW; answer: TFhirFeatureQueryAnswer); +var + v : TFHIRObject; +begin + p.addParamUri('name', answer.Feature); + if (answer.Context <> '') then + p.addParamUri('context', answer.Context); + for v in answer.Values do + p.addParam('value', v.link); + p.addParamCode('processing-status', CODES_TFeatureQueryProcessingStatus[answer.ProcessingStatus]); + if (answer.Answer <> nbNone) then + if (answer.Answer = nbFalse) then + p.addParamBool('answer', false) + else + p.addParamBool('answer', true); +end; + +function TFhirFeatureNegotiation.Name: String; +begin + Result := 'feature-query'; +end; + +function TFhirFeatureNegotiation.Types: TArray; +begin + Result := []; +end; + +function TFhirFeatureNegotiation.CreateDefinition(base: String): TFHIROperationDefinitionW; +begin + Result := nil; +end; + +function TFhirFeatureNegotiation.Execute(context: TOperationContext; manager: TFHIROperationEngine; request: TFHIRRequest; response: TFHIRResponse; tt: TTimeTracker): String; +var + features : TFslList; + feature : TFhirFeatureQueryItem; + answers : TFslList; + answer : TFhirFeatureQueryAnswer; + p : TFHIRParametersW; +begin + features := TFslList.create; + try + loadFromParameters(features, request.Parameters); + if (request.Resource <> nil) and (request.Resource.fhirType = 'Parameters') then + loadFromResource(features, request.resource); + answers := TFslList.create; + try + for feature in features do + answers.add(processFeature(context, manager, feature)); + p := FFactory.makeParameters; + try + for answer in answers do + encodeAnswer(p.addParam('feature'), answer); + response.resource := p.Resource.link; + finally + p.free; + end; + finally + answers.free; + end; + finally + features.free; + end; +end; + +function TFhirFeatureNegotiation.formalURL: String; +begin + result := 'http://www.hl7.org/fhir/uv/capstmt/OperationDefinition/feature-query'; +end; +{$ENDIF} + end. diff --git a/server/tx_registry_model.pas b/server/tx_registry_model.pas index 2779c99da..77a39a262 100644 --- a/server/tx_registry_model.pas +++ b/server/tx_registry_model.pas @@ -1,12 +1,40 @@ unit tx_registry_model; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface uses Classes, SysUtils, - fsl_base, fsl_json, fsl_utilities, fsl_versions; + fsl_base, fsl_json, fsl_utilities, fsl_versions, fsl_threads; Type TServerSecurity = (ssOpen, ssPassword, ssToken, ssOAuth, ssSmart, ssCert); @@ -22,8 +50,10 @@ TServerVersionInformation = class (TFslObject) private FError: String; FAddress : String; + FLastTat: String; FVersion : String; - FTerminologies : TStringList; + FCodeSystems : TStringList; + FValueSets : TStringList; FLastSuccess : TFslDateTime; FSecurity : TServerSecuritySet; public @@ -35,8 +65,14 @@ TServerVersionInformation = class (TFslObject) property Security : TServerSecuritySet read FSecurity write FSecurity; property Error : String read FError write FError; property LastSuccess : TFslDateTime read FLastSuccess write FLastSuccess; - property Terminologies : TStringList read FTerminologies; + property lastTat : String read FLastTat write FLastTat; + property CodeSystems : TStringList read FCodeSystems; + property ValueSets : TStringList read FValueSets; procedure update(source : TServerVersionInformation); + + function Details : String; + function cslist : String; + function vslist : String; end; { TServerInformation } @@ -47,7 +83,9 @@ TServerInformation = class (TFslObject) FName : string; FAddress : String; FAccessInfo : String; - FAuthlist : TStringList; + FAuthCSlist : TStringList; + FAuthVSlist : TStringList; + FUsageList : TStringList; FVersions : TFslList; public constructor Create; override; @@ -57,12 +95,17 @@ TServerInformation = class (TFslObject) property Name : String read FName write FName; property Address : String read FAddress write FAddress; property AccessInfo : String read FAccessInfo write FAccessInfo; - property AuthList : TStringList read FAuthList; + property AuthCSList : TStringList read FAuthCSList; + property AuthVSList : TStringList read FAuthVSList; + property UsageList : TStringList read FUsageList; property Versions : TFslList read FVersions; function version(ver : String) : TServerVersionInformation; procedure update(source : TServerInformation); - function isAuth(tx : String) : boolean; + function Details : String; + function isAuthCS(tx : String) : boolean; + function isAuthVS(vs : String) : boolean; + function Description : String; end; { TServerRegistry } @@ -95,18 +138,23 @@ TServerRegistry = class (TFslObject) TServerRegistries = class (TFslObject) private FAddress : String; + FDoco: String; FLastRun : TFslDateTime; FOutcome : String; FRegistries: TFslList; + FLock : TFslLock; public constructor Create; override; destructor Destroy; override; function Link : TServerRegistries; overload; property Address : String read FAddress write FAddress; + property doco : String read FDoco write FDoco; property LastRun : TFslDateTime read FLastRun write FLastRun; property Outcome : String read FOutcome write FOutcome; property Registries : TFslList read FRegistries; - + procedure Lock(name : String); + procedure UnLock; + function registry(code : String) : TServerRegistry; procedure update(source : TServerRegistries); end; @@ -124,9 +172,12 @@ TServerRow = class (TFslObject) FServerCode: String; FServerName: String; FSystems: integer; + FSets : integer; FURL: String; FVersion: String; - FAuthlist : TStringList; + FAuthCSList : TStringList; + FAuthVSList : TStringList; + FAuthoritative : boolean; public constructor Create; override; destructor Destroy; override; @@ -136,7 +187,8 @@ TServerRow = class (TFslObject) property RegistryName : String read FRegistryName write FRegistryName; property RegistryCode : String read FRegistryCode write FRegistryCode; property RegistryUrl : String read FRegistryUrl write FRegistryUrl; - property AuthList : TStringList read FAuthList; + property AuthCSList : TStringList read FAuthCSList; + property AuthVSList : TStringList read FAuthVSList; property Version : String read FVersion write FVersion; property URL : String read FURL write FURL; @@ -144,6 +196,8 @@ TServerRow = class (TFslObject) property Security : TServerSecuritySet read FSecurity write FSecurity; property LastSuccess : cardinal read FLastSuccess write FLastSuccess; // ms property systems : integer read FSystems write FSystems; + property sets : integer read FSets write FSets; + property Authoritative : boolean read FAuthoritative write FAuthoritative; end; { TServerRegistryUtilities } @@ -160,7 +214,7 @@ TServerRegistryUtilities = class (TFslObject) class function readServer(fv : String; json : TJsonObject): TServerInformation; class function readRegistry(fv : String; json : TJsonObject): TServerRegistry; - class procedure addRow(rows : TFslList; reg: TServerRegistry; srvr : TServerInformation; version : TServerVersionInformation); + class procedure addRow(rows : TFslList; reg: TServerRegistry; srvr : TServerInformation; version : TServerVersionInformation; auth : boolean); class procedure buildRows(reg: TServerRegistry; srvr : TServerInformation; version, tx : String; rows : TFslList); overload; class procedure buildRows(reg : TServerRegistry; srvrCode, version, tx : String; rows : TFslList); overload; class procedure buildRows(info : TServerRegistries; regCode, srvrCode, version, tx : String; rows : TFslList); overload; @@ -171,6 +225,8 @@ TServerRegistryUtilities = class (TFslObject) class function toJson(row : TServerRow) : TJsonObject; overload; class function buildRows(info : TServerRegistries; regCode, srvrCode, version, tx : String) : TFslList; overload; + class function hasMatchingCodeSystem(cs : String; list : TStringList; mask : boolean) : boolean; + class function hasMatchingValueSet(vs : String; list : TStringList; mask : boolean) : boolean; end; implementation @@ -180,12 +236,14 @@ implementation constructor TServerRow.Create; begin inherited Create; - FAuthlist := TStringList.Create; + FAuthCSList := TStringList.Create; + FAuthVSList := TStringList.Create; end; destructor TServerRow.Destroy; begin - FAuthlist.free; + FAuthCSList.free; + FAuthVSList.free; inherited Destroy; end; @@ -228,8 +286,10 @@ class function TServerRegistryUtilities.toJson(v: TServerVersionInformation): TJ result.str['security'] := securitySetToString(v.Security); result.str['error'] := v.Error; result.str['last-success'] := v.LastSuccess.toXML; - for s in v.Terminologies do + for s in v.CodeSystems do result.forceArr['terminologies'].add(s); + for s in v.ValueSets do + result.forceArr['valuesets'].add(s); result.link; finally result.free; @@ -247,7 +307,8 @@ class function TServerRegistryUtilities.readVersion(fv : String; json: TJsonObje result.Security := stringToSecuritySet(json.str['security']); result.Error := json.str['error']; result.LastSuccess := TFslDateTime.fromXML(json.str['last-success']); - json.forceArr['terminologies'].readStrings(result.Terminologies); + json.forceArr['terminologies'].readStrings(result.CodeSystems); + json.forceArr['valuesets'].readStrings(result.ValueSets); result.link; finally result.free; @@ -265,7 +326,8 @@ class function TServerRegistryUtilities.toJson(s: TServerInformation): TJsonObje result.str['name'] := s.Name; result.str['address'] := s.Address; result.str['access-info'] := s.AccessInfo; - result.str['authoritative'] := s.AuthList.CommaText; + result.str['authoritative'] := s.AuthCSList.CommaText; + result.str['authoritative-valuesets'] := s.AuthVSList.CommaText; for v in s.Versions do result.forceArr['versions'].add(toJson(s)); result.link; @@ -285,7 +347,8 @@ class function TServerRegistryUtilities.readServer(fv : String; json: TJsonObjec result.Name := json.str['name']; result.Address := json.str['address']; result.AccessInfo := json.str['access-info']; - result.AuthList.CommaText := json.str['authoritative'];; + result.AuthCSList.CommaText := json.str['authoritative']; + result.AuthVSList.CommaText := json.str['authoritative-valuesets']; for obj in json.forceArr['versions'].asObjects.forEnum do result.versions.add(readVersion(fv, json)); result.link; @@ -333,12 +396,13 @@ class function TServerRegistryUtilities.readRegistry(fv : String; json: TJsonObj end; end; -class procedure TServerRegistryUtilities.addRow(rows: TFslList; reg: TServerRegistry; srvr: TServerInformation; version: TServerVersionInformation); +class procedure TServerRegistryUtilities.addRow(rows: TFslList; reg: TServerRegistry; srvr: TServerInformation; version: TServerVersionInformation; auth : boolean); var row : TServerRow; begin row := TServerRow.Create; try + row.Authoritative := auth; row.ServerName := srvr.Name; row.ServerCode := srvr.Code; row.RegistryName := reg.Name; @@ -353,8 +417,10 @@ class procedure TServerRegistryUtilities.addRow(rows: TFslList; reg: row.LastSuccess := trunc(TFslDateTime.makeUTC.difference(version.LastSuccess) * DATETIME_DAY_MILLISECONDS); row.security := version.security; row.Version := version.Version; - row.systems := version.Terminologies.Count; - row.Authlist.assign(srvr.AuthList); + row.systems := version.CodeSystems.Count; + row.sets := version.ValueSets.Count; + row.AuthCSList.assign(srvr.AuthCSList); + row.AuthVSList.assign(srvr.AuthVSList); rows.add(row.link); finally @@ -362,14 +428,61 @@ class procedure TServerRegistryUtilities.addRow(rows: TFslList; reg: end; end; +function passesMask(mask, tx : string) : Boolean; +begin + if mask.EndsWith('*') then + result := tx.StartsWith(mask.Substring(0, mask.length-1)) + else + result := tx = mask; +end; + + +class function TServerRegistryUtilities.hasMatchingCodeSystem(cs : String; list : TStringList; mask : boolean) : boolean; +var + s, r : String; +begin + r := cs; + if r.contains('|') then + r := r.subString(0, r.indexOf('|')); + result := false; + for s in list do + begin + if mask and passesMask(s, cs) then + exit(true); + if not mask and ((s = cs) or (r = s)) then + exit(true); + end; +end; + +class function TServerRegistryUtilities.hasMatchingValueSet(vs : String; list : TStringList; mask : boolean) : boolean; +var + s, r : String; +begin + r := vs; + if r.contains('|') then + r := r.subString(0, r.indexOf('|')); + result := false; + for s in list do + begin + if mask and passesMask(s, vs) then + exit(true); + if not mask and ((s = vs) or (r = s)) then + exit(true); + end; +end; + class procedure TServerRegistryUtilities.buildRows(reg: TServerRegistry; srvr: TServerInformation; version, tx: String; rows: TFslList); var ver : TServerVersionInformation; + auth : boolean; begin + auth := hasMatchingCodeSystem(tx, srvr.AuthCSList, true); for ver in srvr.Versions do if (version = '') or (TSemanticVersion.matches(version, ver.version, semverAuto)) then - if (tx = '') or (ver.Terminologies.IndexOf(tx) > -1) then - addRow(rows, reg, srvr, ver); + begin + if auth or (tx = '') or hasMatchingCodeSystem(tx, ver.CodeSystems, false) then + addRow(rows, reg, srvr, ver, auth); + end; end; class procedure TServerRegistryUtilities.buildRows(reg: TServerRegistry; srvrCode, version, tx: String; rows: TFslList); @@ -414,6 +527,8 @@ class function TServerRegistryUtilities.toJson(row: TServerRow): TJsonObject; begin result := TJsonObject.Create; try + if (row.Authoritative) then + result.bool['is-authoritative'] := true; result.str['server-name'] := row.ServerName; result.str['server-code'] := row.ServerCode; @@ -426,8 +541,10 @@ class function TServerRegistryUtilities.toJson(row: TServerRow): TJsonObject; result.str['error'] := row.Error; result.int['last-success'] := row.LastSuccess; result.int['systems'] := row.systems; - for s in row.Authlist do + for s in row.AuthCSList do result.forceArr['authoritative'].add(s); + for s in row.AuthVSList do + result.forceArr['authoritative-valuesets'].add(s); if (ssOpen in row.Security) then result.bool[CODES_TServerSecurity[ssOpen]] := true; if (ssPassword in row.Security) then result.bool[CODES_TServerSecurity[ssPassword]] := true; @@ -444,12 +561,17 @@ class function TServerRegistryUtilities.toJson(row: TServerRow): TJsonObject; class function TServerRegistryUtilities.buildRows(info: TServerRegistries; regCode, srvrCode, version, tx: String): TFslList; begin - result := TFslList.Create; + info.Lock('build'); try - buildRows(info, regCode, srvrCode, version, tx, result); - result.link; + result := TFslList.Create; + try + buildRows(info, regCode, srvrCode, version, tx, result); + result.link; + finally + result.free; + end; finally - result.free; + info.unlock; end; end; @@ -485,6 +607,7 @@ constructor TServerRegistries.Create; destructor TServerRegistries.Destroy; begin + FLock.Free; FRegistries.free; inherited Destroy; end; @@ -494,6 +617,18 @@ function TServerRegistries.Link: TServerRegistries; result := TServerRegistries(inherited link); end; +procedure TServerRegistries.Lock(name: String); +begin + if (FLock = nil) then + FLock := TFslLock.create('ServerRegistries'); + FLock.Lock(name); +end; + +procedure TServerRegistries.UnLock; +begin + FLock.unlock; +end; + function TServerRegistries.registry(code: String): TServerRegistry; var t : TServerRegistry; @@ -510,9 +645,10 @@ procedure TServerRegistries.update(source: TServerRegistries); begin FLastRun := source.FLastRun; FOutcome := source.FOutcome; + FDoco := source.doco; for t in source.Registries do begin - sr := registry(t.Name); + sr := registry(t.Code); if (sr = nil) then FRegistries.add(t.link) else @@ -559,7 +695,7 @@ procedure TServerRegistry.update(source: TServerRegistry); FError := source.FError; for t in source.Servers do begin - s := server(t.Name); + s := server(t.Code); if (s = nil) then FServers.add(t.link) else @@ -573,12 +709,16 @@ constructor TServerInformation.Create; begin inherited Create; FVersions := TFslList.Create; - FAuthlist := TStringList.Create; + FAuthCSList := TStringList.Create; + FAuthVSList := TStringList.Create; + FUsageList := TStringList.create; end; destructor TServerInformation.Destroy; begin - FAuthlist.free; + FUsageList.free; + FAuthVSList.free; + FAuthCSList.free; FVersions.free; inherited Destroy; end; @@ -605,6 +745,9 @@ procedure TServerInformation.update(source: TServerInformation); FName := source.FName; FAddress := source.FAddress; FAccessInfo := source.FAccessInfo; + FAuthCSList.Assign(source.FAuthCSList); + FAuthVSList.Assign(source.FAuthVSList); + FUsagelist.Assign(source.FUsagelist); for t in source.Versions do begin v := version(t.Version); @@ -615,35 +758,76 @@ procedure TServerInformation.update(source: TServerInformation); end; end; -function passesMask(mask, tx : string) : Boolean; +function TServerInformation.Details: String; begin - if mask.EndsWith('*') then - result := tx.StartsWith(mask.Substring(0, mask.length-1)) - else - result := tx = mask; + result := FAccessInfo; end; -function TServerInformation.isAuth(tx: String): boolean; +function TServerInformation.isAuthCS(tx: String): boolean; var mask : String; begin result := false; - for mask in AuthList do + for mask in AuthCSList do if passesMask(mask, tx) then exit(true); end; +function TServerInformation.isAuthVS(vs: String): boolean; +var + mask : String; +begin + result := false; + for mask in AuthVSList do + if passesMask(mask, vs) then + exit(true); +end; + +function TServerInformation.description: String; +var + s : String; +begin + result := ''; + if (FusageList.count > 0) then + result := 'Usage Tags: '+FUsageList.CommaText; + if (FAuthCSList.count > 0) then + begin + if (result <> '') then + result := result+'. '; + result := result + 'Authoritative for the following CodeSystems:
            '; + for s in FAuthCSlist do + result := result + '
          • '+FormatTextToHtml(s).replace('*', '*')+'
          • '; + result := result + '
          '; + end; + if (FAuthVSList.count > 0) then + begin + if (result <> '') then + result := result+'. '; + result := result + 'Authoritative for the following ValueSets:
            '; + for s in FAuthVSlist do + result := result + '
          • '+FormatTextToHtml(s).replace('*', '*')+'
          • '; + result := result + '
          '; + end; +end; + { TServerVersionInformation } constructor TServerVersionInformation.Create; begin inherited Create; - FTerminologies := TStringList.Create; + FCodeSystems := TStringList.Create; + FCodeSystems.Sorted := true; + FCodeSystems.Duplicates := dupIgnore; + + FValueSets := TStringList.Create; + FValueSets.Sorted := true; + FValueSets.Duplicates := dupIgnore; end; destructor TServerVersionInformation.Destroy; begin - FTerminologies.free; + FValueSets.free; + FCodeSystems.free; inherited Destroy; end; @@ -660,7 +844,40 @@ procedure TServerVersionInformation.update(source: TServerVersionInformation); begin FSecurity := source.FSecurity; FLastSuccess := source.FLastSuccess; - FTerminologies.assign(source.Terminologies); + FCodeSystems.assign(source.FCodeSystems); + FValueSets.assign(source.FValueSets); end; end; -end. \ No newline at end of file + +function TServerVersionInformation.Details: String; +begin + if FError = '' then + result := 'Server Processed Ok' + else + result := FError; + result := result + ' (last seen '+LastSuccess.toXML()+', last tat = '+FLastTat+')'; +end; + +function TServerVersionInformation.cslist: String; +var + s : String; +begin + result := '
            '; + for s in FCodeSystems do + result := result + '
          • '+FormatTextToHtml(s)+'
          • '; + result := result + '
          '; +end; + +function TServerVersionInformation.vslist: String; +var + s : String; +begin + result := '
            '; + for s in FValueSets do + result := result + '
          • '+FormatTextToHtml(s)+'
          • '; + result := result + '
          '; +end; + + +end. + diff --git a/server/tx_registry_spider.pas b/server/tx_registry_spider.pas index 1d3d14bad..4081b3b75 100644 --- a/server/tx_registry_spider.pas +++ b/server/tx_registry_spider.pas @@ -35,12 +35,12 @@ interface uses SysUtils, Classes, IniFiles, IdHashSHA, - fsl_base, fsl_utilities, fsl_json, fsl_logging, fsl_versions, fsl_http, + fsl_base, fsl_utilities, fsl_json, fsl_logging, fsl_versions, fsl_http, fsl_threads, fsl_fetcher, fsl_zulip, - fhir_objects, fhir_client_http, - fhir3_client, fhir3_types, fhir3_resources, fhir3_resources_canonical, fhir3_utilities, - fhir4_client, fhir4_types, fhir4_resources_canonical, fhir4_utilities, - fhir5_client, fhir5_types, fhir5_resources_canonical, fhir5_enums, fhir5_utilities, + fhir_objects, fhir_client, fhir_client_http, + fhir3_client, fhir3_types, fhir3_resources_base, fhir3_resources, fhir3_resources_canonical, fhir3_utilities, + fhir4_client, fhir4_types, fhir4_resources_base, fhir4_resources, fhir4_resources_canonical, fhir4_utilities, + fhir5_client, fhir5_types, fhir5_resources_base, fhir5_resources, fhir5_resources_canonical, fhir5_enums, fhir5_utilities, tx_registry_model; const @@ -80,6 +80,8 @@ TTxRegistryScanner = class (TFslObject) FOnSendEmail : TSendEmailEvent; FIni : TIniFile; FZulip : TZulipTracker; + FLogFileName : String; + procedure DoSendEmail(dest, subj, body : String); procedure log(msg, source : String; error : boolean); @@ -118,6 +120,7 @@ constructor TTxRegistryScanner.Create(zulip: TZulipTracker); inherited Create; FZulip := zulip; FAddress := MASTER_URL; + FLogFileName := FilePath(['[tmp]', 'tx-registry-spider.log']); end; destructor TTxRegistryScanner.Destroy; @@ -178,7 +181,10 @@ procedure TTxRegistryScanner.update(name : String; info : TServerRegistries); arr : TJsonArray; i : integer; reg : TServerRegistry; + s : String; begin + DeleteFile(FLogFileName); + FIni := TIniFile.Create(tempFile('tx-registry-'+name+'.ini')); try info.LastRun := TFslDateTime.makeUTC; @@ -189,9 +195,12 @@ procedure TTxRegistryScanner.update(name : String; info : TServerRegistries); log('Fetch '+FAddress, '', false); json := fetchJson(FAddress); try - if json.str['formatVersion'] <> '1' then + s := json.str['formatVersion']; + if s <> '1' then raise EFslException.Create('Unable to proceed: registries version is '+json.str['formatVersion']+' not "1"'); + info.doco := json.str['documentation']; + info.Address := FAddress; arr := json.arr['registries']; for i := 0 to arr.Count - 1 do begin @@ -206,7 +215,7 @@ procedure TTxRegistryScanner.update(name : String; info : TServerRegistries); finally json.free; end; - info.Outcome := 'All OK'; + info.Outcome := 'Processed OK'; except on e : Exception do begin @@ -227,6 +236,7 @@ procedure TTxRegistryScanner.processRegistry(obj : TJsonObject; reg : TServerReg json : TJsonObject; arr : TJsonArray; i : integer; + s : String; srvr : TServerInformation; begin try @@ -238,12 +248,14 @@ procedure TTxRegistryScanner.processRegistry(obj : TJsonObject; reg : TServerReg reg.Address := obj.str['url']; if (reg.Address = '') then raise EFslException.Create('No url provided for '+reg.Name); + SetThreadStatus(reg.Address); log('Fetch '+reg.Address, FAddress, false); FRegistryErrors := ''; json := fetchJson(reg.Address); try - if json.str['formatVersion'] <> '1' then + s := json.str['formatVersion']; + if s <> '1' then raise EFslException.Create('Unable to proceed: registry version @'+reg.Address+' is '+json.str['formatVersion']+' not "1"'); arr := json.arr['servers']; @@ -286,9 +298,16 @@ procedure TTxRegistryScanner.processServer(source : String; obj: TJsonObject; sr raise EFslException.Create('No name provided'); srvr.AccessInfo := obj.str['access_info']; srvr.Address := obj.str['url']; + SetThreadStatus(srvr.Address); if (srvr.Address = '') then raise EFslException.Create('No url provided for '+srvr.Name); - obj.forceArr['authoritative'].readStrings(srvr.AuthList); + obj.forceArr['authoritative'].readStrings(srvr.AuthCSList); + obj.forceArr['authoritative-valuesets'].readStrings(srvr.AuthVSList); + srvr.AuthCSList.sort; + srvr.AuthVSList.sort; + + obj.forceArr['usage'].readStrings(srvr.UsageList); + srvr.UsageList.sort; arr := obj.arr['fhirVersions']; for i := 0 to arr.Count - 1 do @@ -307,22 +326,40 @@ procedure TTxRegistryScanner.processServer(source : String; obj: TJsonObject; sr procedure TTxRegistryScanner.processServerVersion(source: String; srvr: TServerInformation; obj: TJsonObject; ver: TServerVersionInformation); var v : TSemanticVersion; -begin + d : TDateTime; +begin try - ver.Address := obj.str['url']; + d := now; + ver.CodeSystems.clear; + ver.ValueSets.clear; + ver.Address := obj.str['url']; + SetThreadStatus(ver.Address); + Logging.log('Check on server '+ver.Address); ver.Security := [ssOpen]; v := TSemanticVersion.fromString(obj.str['version']); - case v.Major of - 3: processServerVersionR3(obj.str['version'], source, obj.str['url'], ver); - 4: processServerVersionR4(obj.str['version'], source, obj.str['url'], ver); - 5: processServerVersionR5(obj.str['version'], source, obj.str['url'], ver); - else - log('Exception processing server: '+srvr.Name+'@'+srvr.address+' : Version '+obj.str['version']+' not supported', source, false); + try + case v.Major of + 3: processServerVersionR3(obj.str['version'], source, obj.str['url'], ver); + 4: processServerVersionR4(obj.str['version'], source, obj.str['url'], ver); + 5: processServerVersionR5(obj.str['version'], source, obj.str['url'], ver); + else + log('Exception processing server: '+srvr.Name+'@'+srvr.address+' : Version '+obj.str['version']+' not supported', source, false); + end; + finally + v.free; end; + ver.CodeSystems.sort; + ver.ValueSets.sort; ver.LastSuccess := TFslDateTime.makeUTC; + ver.lastTAT := DescribePeriod(now - d); + Logging.log('Server '+ver.Address+': '+DescribePeriod(now - d)+' for '+inttostr(ver.CodeSystems.count)+' CodeSystems and '+inttostr(ver.ValueSets.count)+' ValueSets'); except on e : Exception do + begin + Logging.log('Server '+ver.Address+': Error after '+DescribePeriod(now - d)+': '+e.message); ver.Error := e.message; + ver.lastTAT := DescribePeriod(now - d); + end; end; end; @@ -335,49 +372,70 @@ procedure TTxRegistryScanner.processServerVersionR4(version, source, url : Strin tc : fhir4_resources_canonical.TFhirTerminologyCapabilities; tcs : fhir4_resources_canonical.TFhirTerminologyCapabilitiesCodeSystem; tcsv : fhir4_resources_canonical.TFhirTerminologyCapabilitiesCodeSystemVersion; + bnd : fhir4_resources.TFhirBundle; + be : fhir4_resources.TFhirBundleEntry; + vs : fhir4_resources.TFHIRValueSet; begin - client := TFhirClient4.Create(nil, nil, TFHIRHTTPCommunicator.Create(url)); try - client.format := ffJson; - cs := client.conformance(true); + client := TFhirClient4.Create(nil, nil, TFHIRHTTPCommunicator.Create(url)); try - ver.Version := cs.fhirVersionElement.ToString; - for csr in cs.restList do - if (csr.mode = fhir4_types.RestfulCapabilityModeServer) then + client.Logger := TTextFileLogger.create(FLogFileName); + client.format := ffJson; + cs := client.conformance(true); + try + ver.Version := cs.fhirVersionElement.ToString; + for csr in cs.restList do + if (csr.mode = fhir4_types.RestfulCapabilityModeServer) then + begin + if csr.security <> nil then + for cc in csr.security.serviceList do + begin + if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'OAuth')) then + ver.Security := ver.Security + [ssOAuth] + else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'SMART-on-FHIR')) then + ver.Security := ver.Security + [ssSmart] + else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Basic')) then + ver.Security := ver.Security + [ssPassword] + else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Certificates')) then + ver.Security := ver.Security + [ssCert] + else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Token')) then + ver.Security := ver.Security + [ssToken] + else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Open')) then + ver.Security := ver.Security + [ssOpen]; + end; + end; + finally + cs.free; + end; + tc := client. terminologyCaps; + try + for tcs in tc.codeSystemList do begin - if csr.security <> nil then - for cc in csr.security.serviceList do - begin - if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'OAuth')) then - ver.Security := ver.Security + [ssOAuth] - else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'SMART-on-FHIR')) then - ver.Security := ver.Security + [ssSmart] - else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Basic')) then - ver.Security := ver.Security + [ssPassword] - else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Certificates')) then - ver.Security := ver.Security + [ssCert] - else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Token')) then - ver.Security := ver.Security + [ssToken] - else if (cc.hasCode('http://hl7.org/fhir/restful-security-service', 'Open')) then - ver.Security := ver.Security + [ssOpen]; - end; + ver.CodeSystems.add(tcs.uri); + for tcsv in tcs.versionList do + ver.CodeSystems.add(tcs.uri+'|'+tcsv.code); end; - finally - cs.free; - end; - tc := client. terminologyCaps; - try - for tcs in tc.codeSystemList do - begin - ver.Terminologies.add(tcs.uri); - for tcsv in tcs.versionList do - ver.Terminologies.add(tcs.uri+'|'+tcsv.code); + finally + tc.free; + end; + bnd := client.search(fhir4_resources_base.frtValueSet, true, '_elements=url,version'); + try + for be in bnd.entryList do + begin + vs := be.resource as fhir4_resources.TFHIRValueSet; + ver.ValueSets.add(vs.url); + if vs.version <> '' then + ver.valueSets.add(vs.url+'|'+vs.version); + end; + finally + bnd.free; end; finally - tc.free; + client.free; end; - finally - client.free; + except + on e : Exception do + raise EFslException.create('Error getting server details: '+e.message); end; end; @@ -390,9 +448,13 @@ procedure TTxRegistryScanner.processServerVersionR5(version, source, url : Strin tc : fhir5_resources_canonical.TFhirTerminologyCapabilities; tcs : fhir5_resources_canonical.TFhirTerminologyCapabilitiesCodeSystem; tcsv : fhir5_resources_canonical.TFhirTerminologyCapabilitiesCodeSystemVersion; + bnd : fhir5_resources.TFhirBundle; + be : fhir5_resources.TFhirBundleEntry; + vs : fhir5_resources.TFHIRValueSet; begin client := TFhirClient5.Create(nil, nil, TFHIRHTTPCommunicator.Create(url)); try + client.Logger := TTextFileLogger.create(FilePath(['[tmp]', 'tx-registry-spider.log'])); client.format := ffJson; cs := client.conformance(true); try @@ -424,12 +486,24 @@ procedure TTxRegistryScanner.processServerVersionR5(version, source, url : Strin try for tcs in tc.codeSystemList do begin - ver.Terminologies.add(tcs.uri); + ver.CodeSystems.add(tcs.uri); for tcsv in tcs.versionList do - ver.Terminologies.add(tcs.uri+'|'+tcsv.code); + ver.CodeSystems.add(tcs.uri+'|'+tcsv.code); end; finally tc.free; + end; + bnd := client.search(fhir5_resources_base.frtValueSet, true, '_elements=url,version'); + try + for be in bnd.entryList do + begin + vs := be.resource as fhir5_resources.TFHIRValueSet; + ver.ValueSets.add(vs.url); + if vs.version <> '' then + ver.valueSets.add(vs.url+'|'+vs.version); + end; + finally + bnd.free; end; finally client.free; @@ -445,10 +519,14 @@ procedure TTxRegistryScanner.processServerVersionR3(version, source, url : Strin tc : fhir3_resources.TFhirParameters; tcs : fhir3_resources.TFhirParametersParameter; tcsv : fhir3_resources.TFhirParametersParameter; + bnd : fhir3_resources.TFhirBundle; + be : fhir3_resources.TFhirBundleEntry; + vs : fhir3_resources.TFHIRValueSet; n : String; begin client := TFhirClient3.Create(nil, nil, TFHIRHTTPCommunicator.Create(url)); try + client.Logger := TTextFileLogger.create(FilePath(['[tmp]', 'tx-registry-spider.log'])); client.format := ffJson; cs := client.conformance(true); try @@ -483,18 +561,30 @@ procedure TTxRegistryScanner.processServerVersionR3(version, source, url : Strin n := tcs.name; if (n = 'system') then begin - ver.Terminologies.add(tcs.value.primitiveValue); + ver.CodeSystems.add(tcs.value.primitiveValue); for tcsv in tcs.partList do begin n := tcsv.name; if (n = 'version') then - ver.Terminologies.add(tcs.value.primitiveValue+'|'+tcsv.value.primitiveValue); + ver.CodeSystems.add(tcs.value.primitiveValue+'|'+tcsv.value.primitiveValue); end; end; end; finally tc.free; end; + bnd := client.search(fhir3_resources_base.frtValueSet, true, '_elements=url,version'); + try + for be in bnd.entryList do + begin + vs := be.resource as fhir3_resources.TFHIRValueSet; + ver.ValueSets.add(vs.url); + if vs.version <> '' then + ver.valueSets.add(vs.url+'|'+vs.version); + end; + finally + bnd.free; + end; finally client.free; end; diff --git a/server/tx_server.pas b/server/tx_server.pas index d26d19ebe..a8d9cb75c 100644 --- a/server/tx_server.pas +++ b/server/tx_server.pas @@ -43,7 +43,7 @@ interface fsl_base, fsl_utilities, fsl_collections, fsl_http, fsl_threads, fsl_i18n, fdb_manager, fhir_objects, fhir_common, fhir_cdshooks, fhir_factory, fhir_features, fhir_uris, - fhir_valuesets, + fhir_tx, fhir_valuesets, session, ftx_service, ftx_sct_services, ftx_loinc_services, ftx_ucum_services, tx_rxnorm, tx_unii, ftx_lang, closuremanager, adaptations, utilities, bundlebuilder, server_stats, @@ -90,6 +90,7 @@ TTerminologyServer = class (TTerminologyServerStore) FExpansions : TFslMap; FDependencies : TFslMap; // object is TFslStringList of identity FClosures : TFslMap; + FOnGetCurrentRequestCount: TGetCurrentRequestCountEvent; FWebBase : String; FCaching : boolean; FCacheDwellTime : TDateTime; @@ -102,16 +103,15 @@ TTerminologyServer = class (TTerminologyServerStore) // database maintenance procedure processValueSet(ValueSetKey : integer; URL : String; conn2, conn3 : TFDBConnection); procedure processConcept(ConceptKey : integer; URL, version, Code : String; conn2, conn3 : TFDBConnection); - function isOkTarget(cm: TLoadedConceptMap; vs: TFhirValueSetW): boolean; - function isOkSource(cm: TLoadedConceptMap; vs: TFhirValueSetW; coding: TFHIRCodingW; out group : TFhirConceptMapGroupW; out match : TFhirConceptMapGroupElementW): boolean; overload; - function isOkSource(cm: TLoadedConceptMap; coding: TFHIRCodingW; out group : TFhirConceptMapGroupW; out match : TFhirConceptMapGroupElementW): boolean; overload; procedure LoadClosures; procedure BuildIndexesInternal(prog : boolean; conn1, conn2, conn3 : TFDBConnection); function workerGetDefinition(sender : TObject; url, version : String) : TFHIRValueSetW; - function workerGetProvider(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; - function workerGetExpansion(sender : TObject; opContext : TTerminologyOperationContext; url, version, filter : String; params : TFHIRExpansionParams; dependencies : TStringList; additionalResources : TFslMetadataResourceList; limit : integer) : TFHIRValueSetW; + function workerGetProvider(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; + function workerGetExpansion(sender : TObject; opContext : TTerminologyOperationContext; url, version, filter : String; params : TFHIRTxOperationParams; dependencies : TStringList; additionalResources : TFslMetadataResourceList; limit : integer; noCacheThisOne : boolean) : TFHIRValueSetW; procedure workerGetVersions(sender : TObject; url : String; list : TStringList); + function handlePrepareException(e : EFHIROperationException; profile : TFHIRTxOperationParams; unknownValueSets : TStringList; url : String) : TFhirParametersW; + procedure processCoding(coding : TFHIRCodingW; params : TFhirParametersW); protected procedure invalidateVS(id : String); override; public @@ -126,24 +126,24 @@ TTerminologyServer = class (TTerminologyServerStore) function isKnownValueSet(id : String; out vs : TFhirValueSetW): Boolean; // given a value set, expand it - function expandVS(vs : TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList) : TFhirValueSetW; overload; - function expandVS(vs : TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList) : TFhirValueSetW; overload; - function expandVS(uri, version : String; profile : TFHIRExpansionParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList) : TFhirValueSetW; overload; + function expandVS(vs : TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean) : TFhirValueSetW; overload; + function expandVS(vs : TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean) : TFhirValueSetW; overload; + function expandVS(reqId, uri, version : String; profile : TFHIRTxOperationParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean) : TFhirValueSetW; overload; // these are internal services - not for use outside the terminology server - function expandVS(uri, version: String; profile : TFHIRExpansionParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList) : TFhirValueSetW; overload; - function expandVS(uri, version: String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList) : TFhirValueSetW; overload; - function expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; overload; - function expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; overload; - - procedure lookupCode(coding : TFHIRCodingW; langList : THTTPLanguageList; props : TArray; resp : TFHIRLookupOpResponseW); - function validate(vs : TFhirValueSetW; coding : TFHIRCodingW; profile : TFHIRExpansionParams; abstractOk, inferSystem : boolean; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; overload; - function validate(issuePath : String; vs : TFhirValueSetW; coded : TFhirCodeableConceptW; profile : TFHIRExpansionParams; abstractOk, inferSystem: boolean; mode : TValidationCheckMode; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; overload; + function expandVS(reqId, uri, version: String; profile : TFHIRTxOperationParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean) : TFhirValueSetW; overload; + function expandVS(reqId, uri, version: String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean) : TFhirValueSetW; overload; + function expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; overload; + function expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; overload; + + procedure lookupCode(coding : TFHIRCodingW; reqId : String; profile : TFHIRTxOperationParams; langList : THTTPLanguageList; props : TArray; resp : TFHIRLookupOpResponseW; txResources : TFslMetadataResourceList); + function validate(reqId : String; vs : TFhirValueSetW; coding : TFHIRCodingW; profile : TFHIRTxOperationParams; abstractOk, inferSystem : boolean; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; overload; + function validate(reqId, issuePath : String; vs : TFhirValueSetW; coded : TFhirCodeableConceptW; profile : TFHIRTxOperationParams; abstractOk, inferSystem: boolean; mode : TValidationCheckMode; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; overload; function codeInValueSet(c : TFHIRCodingW; valueSet : String) : boolean; - function translate(langList : THTTPLanguageList; cm : TLoadedConceptMap; coding : TFHIRCodingW) : TFhirParametersW; overload; - function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW) : TFhirParametersW; overload; - function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW) : TFhirParametersW; overload; - Function MakeChecker(uri, version : string; profile : TFHIRExpansionParams) : TValueSetChecker; + function translate(langList : THTTPLanguageList; reqId : String; cml : TFslList; coding : TFHIRCodingW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams): TFhirParametersW; overload; + function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; overload; + function translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; overload; + Function MakeChecker(reqId, uri, version : string; profile : TFHIRTxOperationParams) : TValueSetChecker; function getDisplayForCode(langList : THTTPLanguageList; system, version, code : String): String; function checkCode(op : TFhirOperationOutcomeW; langList : THTTPLanguageList; path : string; code : string; system, version : string; display : string) : boolean; function isValidCode(system, code : String) : boolean; @@ -170,6 +170,7 @@ TTerminologyServer = class (TTerminologyServerStore) procedure defineFeatures(features : TFslList); override; procedure recordStats(rec : TStatusRecord); override; property cacheDwellTime : TDateTime read FCacheDwellTime write FCacheDwellTime; + property OnGetCurrentRequestCount : TGetCurrentRequestCountEvent read FOnGetCurrentRequestCount write FOnGetCurrentRequestCount; end; implementation @@ -238,7 +239,7 @@ procedure TTerminologyServer.defineFeatures(features: TFslList); procedure TTerminologyServer.recordStats(rec: TStatusRecord); begin inherited recordStats(rec); - FLock.Lock; + FLock.Lock('recordStats'); try rec.ServerCacheCount := rec.ServerCacheCount + FExpansions.Count + FDependencies.Count; rec.ServerCacheSize := rec.ServerCacheSize + FExpansions.sizeInBytes(rec.magic) + FDependencies.sizeInBytes(rec.magic); @@ -277,56 +278,15 @@ procedure TTerminologyServer.LoadClosures; end; end; -procedure TTerminologyServer.lookupCode(coding : TFHIRCodingW; langList : THTTPLanguageList; props : TArray; resp : TFHIRLookupOpResponseW); +procedure TTerminologyServer.lookupCode(coding : TFHIRCodingW; reqId : String; profile : TFHIRTxOperationParams; langList : THTTPLanguageList; props : TArray; resp : TFHIRLookupOpResponseW; txResources : TFslMetadataResourceList); var - provider : TCodeSystemProvider; - ctxt : TCodeSystemProviderContext; - s : String; - p : TFHIRLookupOpRespPropertyW; - params : TFHIRExpansionParams; - - function hasProp(name : String; def : boolean) : boolean; - begin - if (props = nil) or (length(props) = 0) then - result := def - else - result := StringArrayExistsInsensitive(props, name); - end; + worker : TFHIRCodeSystemInformationProvider; begin - params := TFHIRExpansionParams.Create; + worker := TFHIRCodeSystemInformationProvider.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, LOOKUP_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetProvider, workerGetVersions, txResources.link, CommonTerminologies.Languages.link, i18n.link); try - params.defaultToLatestVersion := true; - provider := getProvider(coding.systemUri, coding.version, nil); - try - resp.name := provider.name(nil); - s := provider.version(nil); - if (s <> '') then - resp.version := s; - ctxt := provider.locate(coding.code); - try - if ctxt = nil then - raise ETerminologyError.Create('Unable to find code '+coding.code+' in '+coding.systemUri+' version '+s, itInvalid); - - if (hasProp('abstract', true) and provider.IsAbstract(ctxt)) then - begin - p := resp.addProp('abstract'); - p.value := Factory.makeBoolean(true); - end; - if (hasProp('inactive', true)) then - begin - p := resp.addProp('inactive'); - p.value := Factory.makeBoolean(provider.IsInactive(ctxt)); - end; - resp.display := provider.Display(ctxt, langList); - provider.extendLookup(Factory, ctxt, langList, props, resp); - finally - ctxt.free; - end; - finally - provider.free; - end; + worker.lookupCode(coding, profile, props, resp); finally - params.free; + worker.free; end; end; @@ -378,18 +338,18 @@ procedure TTerminologyServer.invalidateVS(id: String); end; end; -function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; begin - result := expandVS(vs, cacheId, profile, nil, textFilter, limit, count, offset, txResources); + result := expandVS(vs, reqId, cacheId, profile, nil, textFilter, limit, count, offset, txResources, noCacheThisOne); end; -function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; var ts : TStringList; begin ts := TStringList.Create; try - result := expandVS(vs, cacheId, profile, opContext, textFilter, ts, limit, count, offset, txResources); + result := expandVS(vs, reqId, cacheId, profile, opContext, textFilter, ts, limit, count, offset, txResources, noCacheThisOne); finally ts.free; end; @@ -400,7 +360,7 @@ function TTerminologyServer.enterIntoClosure(conn: TFDBConnection; name, uri, co exists : boolean; cm : TClosureManager; begin - FLock.Lock; + FLock.Lock('enterIntoClosure'); try exists := FClosures.ContainsKey(name); if exists then @@ -430,14 +390,14 @@ function hashTx(list : TFslMetadataResourceList) : String; result := inttostr(HashStringToCode32(s)); end; -function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; textFilter : String; dependencies : TStringList; - limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; textFilter : String; dependencies : TStringList; + limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; begin - result := expandVS(vs, cacheId, profile, nil, textFilter, dependencies, limit, count, offset, txResources); + result := expandVS(vs, reqId, cacheId, profile, nil, textFilter, dependencies, limit, count, offset, txResources, noCacheThisOne); end; -function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; - limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(vs: TFhirValueSetW; reqId, cacheId : String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies : TStringList; + limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; var s, d, key: String; p : TArray; @@ -445,7 +405,7 @@ function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profi dt : TDateTime; begin result := nil; - if (dependencies.Count > 0) and FCaching then + if (dependencies.Count > 0) and not noCacheThisOne and FCaching then begin key := cacheId+#1+profile.hash+#1+textFilter+#1+inttostr(limit)+#1+inttostr(count)+#1+inttostr(offset)+#1+inttostr(offset)+#1+hashTx(txResources); FLock.Lock('expandVS.1'); @@ -465,12 +425,12 @@ function TTerminologyServer.expandVS(vs: TFhirValueSetW; cacheId : String; profi if result = nil then begin if opContext = nil then - exp := TFHIRValueSetExpander.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, i18n.link) + exp := TFHIRValueSetExpander.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, EXPANSION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, i18n.link) else exp := TFHIRValueSetExpander.Create(Factory.link, opContext.copy, workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, i18n.link); try - result := exp.expand(vs, profile, textFilter, dependencies, limit, count, offset); - if (dependencies.Count > 0) and FCaching and (vs.TagInt = 0) then + result := exp.expand(vs, profile, textFilter, dependencies, limit, count, offset, noCacheThisOne); + if (dependencies.Count > 0) and not noCacheThisOne and FCaching and (vs.TagInt = 0) then begin if FCaching then begin @@ -524,7 +484,7 @@ function TTerminologyServer.findCanonicalResources(bundle: TFHIRBundleBuilder; end; end; -function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpansionParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(reqId, uri, version: String; profile : TFHIRTxOperationParams; textFilter : String; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; var vs : TFhirValueSetW; ts : TStringList; @@ -533,7 +493,7 @@ function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpans try vs := getValueSetByUrl(uri, version, txResources); try - result := expandVS(vs, uri, profile, nil, textFilter, ts, limit, count, offset.MaxValue, txResources); + result := expandVS(vs, reqId, uri, profile, nil, textFilter, ts, limit, count, offset.MaxValue, txResources, noCacheThisOne); finally vs.free; end; @@ -542,12 +502,12 @@ function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpans end; end; -function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpansionParams; textFilter : String; dependencies: TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(reqId, uri, version: String; profile : TFHIRTxOperationParams; textFilter : String; dependencies: TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; begin - result := expandVS(uri, version, profile, nil, textFilter, dependencies, limit, count, offset, txResources); + result := expandVS(reqId, uri, version, profile, nil, textFilter, dependencies, limit, count, offset, txResources, noCacheThisOne); end; -function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpansionParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies: TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList): TFhirValueSetW; +function TTerminologyServer.expandVS(reqId, uri, version: String; profile : TFHIRTxOperationParams; opContext : TTerminologyOperationContext; textFilter : String; dependencies: TStringList; limit, count, offset : integer; txResources : TFslMetadataResourceList; noCacheThisOne : boolean): TFhirValueSetW; var vs : TFhirValueSetW; begin @@ -555,7 +515,7 @@ function TTerminologyServer.expandVS(uri, version: String; profile : TFHIRExpans try if vs = nil then raise ETerminologyError.Create('Unable to find value set "'+uri+'"', itUnknown); - result := expandVS(vs, uri, profile, opContext, textFilter, limit, count, offset, txResources); + result := expandVS(vs, reqId, uri, profile, opContext, textFilter, limit, count, offset, txResources, noCacheThisOne); finally vs.free; end; @@ -574,7 +534,7 @@ function TTerminologyServer.makeAnyValueSet: TFhirValueSetW; result.status := psActive; inc := result.addInclude; try - inc.systemUri := ALL_CODE_CS; + // inc.systemUri := ALL_CODE_CS; finally inc.free; end; @@ -629,15 +589,15 @@ function TTerminologyServer.isKnownValueSet(id: String; out vs: TFhirValueSetW): result := vs <> nil; end; -function TTerminologyServer.MakeChecker(uri, version: string; profile : TFHIRExpansionParams): TValueSetChecker; +function TTerminologyServer.MakeChecker(reqId, uri, version: string; profile : TFHIRTxOperationParams): TValueSetChecker; var vs : TFhirValueSetW; begin - result := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, uri, i18n.link); + result := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, VALIDATION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, uri, i18n.link); try vs := getValueSetByUrl(uri, version); try - result.prepare(vs, profile); + result.prepare(vs, profile, nil); finally vs.free; end; @@ -647,9 +607,48 @@ function TTerminologyServer.MakeChecker(uri, version: string; profile : TFHIRExp end; end; -function TTerminologyServer.validate(vs : TFhirValueSetW; coding : TFHIRCodingW; profile : TFHIRExpansionParams; abstractOk, inferSystem : boolean; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; +function TTerminologyServer.handlePrepareException(e : EFHIROperationException; profile : TFHIRTxOperationParams; unknownValueSets : TStringList; url : String) : TFhirParametersW; +var + op : TFhirOperationOutcomeW; + msg : String; +begin + result := factory.makeParameters; + try + op := Factory.wrapOperationOutcome(Factory.buildOperationOutcome(i18n, profile.HTTPLanguages, e)); + try + if unknownValueSets.Count > 0 then + msg := i18n.translate('UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_VS', profile.HTTPLanguages, [url, unknownValueSets.CommaText]) + else + msg := i18n.translate('UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET', profile.HTTPLanguages, [url]); + op.addIssue(isWarning, itNotFound, '', msg, oicVSProcessing); + result.addParam('issues').resource := op.Resource.link; + result.addParamBool('result', false); + result.addParamStr('message', e.message+'; '+msg); + finally + op.free; + end; + exit(result.link); + finally + result.free; + end; +end; + +procedure TTerminologyServer.processCoding(coding : TFHIRCodingW; params : TFhirParametersW); +begin + if coding.systemUri <> '' then + params.addParamUri('system', coding.systemUri); + if coding.version <> '' then + params.addParamStr('version', coding.version); + if coding.code <> '' then + params.addParamCode('code', coding.code); + if coding.display <> '' then + params.addParamStr('display', coding.display); +end; + +function TTerminologyServer.validate(reqId : String; vs : TFhirValueSetW; coding : TFHIRCodingW; profile : TFHIRTxOperationParams; abstractOk, inferSystem : boolean; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; var check : TValueSetChecker; + unknownValueSets : TStringList; begin if vs = nil then vs := makeAnyValueSet @@ -657,14 +656,32 @@ function TTerminologyServer.validate(vs : TFhirValueSetW; coding : TFHIRCodingW; vs.Link; try - check := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, vs.url, i18n.link); + unknownValueSets := TStringList.create; + check := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, VALIDATION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, vs.url, i18n.link); try - result := check.prepare(vs, profile); - if result = nil then - result := check.check('Coding', coding, abstractOk, inferSystem); + unknownValueSets.Sorted := true; + unknownValueSets.Duplicates := dupIgnore; + try + check.prepare(vs, profile, unknownValueSets); + except + on e : EFHIROperationException do + begin + result := handlePrepareException(e, profile, unknownValueSets, vs.vurl); + try + processCoding(coding, result); + exit(result.link); + finally + result.free; + end; + end; + on e : Exception do + raise; + end; + result := check.check('Coding', coding, abstractOk, inferSystem); summary := check.log; finally check.free; + unknownValueSets.free; end; finally vs.free; @@ -672,9 +689,13 @@ function TTerminologyServer.validate(vs : TFhirValueSetW; coding : TFHIRCodingW; end; -function TTerminologyServer.validate(issuePath : String; vs : TFhirValueSetW; coded : TFhirCodeableConceptW; profile : TFHIRExpansionParams; abstractOk, inferSystem : boolean; mode : TValidationCheckMode; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; +function TTerminologyServer.validate(reqId, issuePath : String; vs : TFhirValueSetW; coded : TFhirCodeableConceptW; profile : TFHIRTxOperationParams; abstractOk, inferSystem : boolean; mode : TValidationCheckMode; txResources : TFslMetadataResourceList; var summary : string) : TFhirParametersW; var check : TValueSetChecker; + coding : TFhirCodingW; + unknownValueSets : TStringList; + op : TFhirOperationOutcomeW; + msg : String; begin if vs = nil then vs := makeAnyValueSet @@ -682,12 +703,35 @@ function TTerminologyServer.validate(issuePath : String; vs : TFhirValueSetW; co vs.Link; try - check := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, vs.url, i18n.link); + unknownValueSets := TStringList.create; + check := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, VALIDATION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, txResources.link, CommonTerminologies.Languages.link, vs.url, i18n.link); try - result := check.prepare(vs, profile); - if result = nil then - result := check.check(issuePath, coded, abstractOk, inferSystem, mode); + unknownValueSets.Sorted := true; + unknownValueSets.Duplicates := dupIgnore; + try + check.prepare(vs, profile, unknownValueSets); + except + on e : EFHIROperationException do + begin + result := handlePrepareException(e, profile, unknownValueSets, vs.vurl); + try + if mode = vcmCodeableConcept then + result.addParam('codeableConcept').value := coded.Element.link + else + for coding in coded.codings.forEnum do // there'll only be one, but this handles freeing the object + processCoding(coding, result); + exit(result.link); + finally + result.free; + end; + end; + on e : Exception do + raise; + end; + result := check.check(issuePath, coded, abstractOk, inferSystem, mode); summary := check.log; + if check.opContext.hasNotes and profile.diagnostics then + result.addParamStr('diagnostics', check.opContext.notes); finally check.free; end; @@ -701,12 +745,12 @@ function TTerminologyServer.workerGetDefinition(sender: TObject; url, version: S result := getValueSetByUrl(url, version); end; -function TTerminologyServer.workerGetExpansion(sender: TObject; opContext : TTerminologyOperationContext; url, version, filter: String; params: TFHIRExpansionParams; dependencies: TStringList; additionalResources : TFslMetadataResourceList; limit: integer): TFHIRValueSetW; +function TTerminologyServer.workerGetExpansion(sender: TObject; opContext : TTerminologyOperationContext; url, version, filter: String; params: TFHIRTxOperationParams; dependencies: TStringList; additionalResources : TFslMetadataResourceList; limit: integer; noCacheThisOne : boolean): TFHIRValueSetW; begin - result := expandVS(url, version, params, opContext, filter, dependencies, limit, -1, -1, additionalResources); + result := expandVS(opContext.reqId, url, version, params, opContext, filter, dependencies, limit, -1, -1, additionalResources, noCacheThisOne); end; -function TTerminologyServer.workerGetProvider(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TTerminologyServer.workerGetProvider(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; begin result := getProvider(url, version, params, nullOk); end; @@ -719,7 +763,7 @@ procedure TTerminologyServer.workerGetVersions(sender: TObject; url: String; lis function TTerminologyServer.cacheSize(magic : integer) : UInt64; begin result := inherited cacheSize(magic); - FLock.Lock; + FLock.Lock('cacheSize'); try result := result + FExpansions.sizeInBytes(magic); result := result + FDependencies.sizeInBytes(magic); @@ -749,7 +793,7 @@ function TTerminologyServer.checkCode(op : TFhirOperationOutcomeW; langList : TH end else if system.StartsWith(URI_LOINC) and (CommonTerminologies.Loinc <> nil) then begin - d := CommonTerminologies.Loinc.GetDisplayByName(code, CommonTerminologies.Loinc.LangsForLang(langList)); + d := CommonTerminologies.Loinc.getDisplay(code, langList); if op.warning('InstanceValidator', itInvalid, path, d <> '', 'The LOINC code "'+code+'" is unknown') then result := op.warning('InstanceValidator', itInvalid, path, (display = '') or (display = d), 'Display for Loinc Code "'+code+'" should be "'+d+'"'); end @@ -797,7 +841,7 @@ function TTerminologyServer.checkCode(op : TFhirOperationOutcomeW; langList : TH procedure TTerminologyServer.clearCache; begin inherited ClearCache; - FLock.Lock; + FLock.Lock('clearCache'); try FExpansions.Clear; FDependencies.Clear; @@ -840,17 +884,17 @@ function TTerminologyServer.codeInValueSet(c : TFHIRCodingW; valueSet: String): var vs : TFHIRValueSetW; p : TFhirParametersW; - profile : TFHIRExpansionParams; + profile : TFHIRTxOperationParams; summary : string; begin vs := getValueSetByUrl(valueSet, '', nil); try if (vs = nil) then exit(false); - profile := TFHIRExpansionParams.Create; + profile := TFHIRTxOperationParams.Create; try profile.membershipOnly := true; - p := validate(vs, c, profile, true, false, nil, summary); + p := validate('', vs, c, profile, true, false, nil, summary); try result := p.bool('result'); finally @@ -1048,7 +1092,7 @@ function TTerminologyServer.InitClosure(name: String) : String; begin conn := FDB.GetConnection('InitClosure'); try - FLock.Lock; + FLock.Lock('InitClosure'); try if FClosures.ContainsKey(name) then closure := FClosures[name] @@ -1072,31 +1116,6 @@ function TTerminologyServer.InitClosure(name: String) : String; result := '0'; end; -function TTerminologyServer.isOkSource(cm: TLoadedConceptMap; coding: TFHIRCodingW; out group : TFhirConceptMapGroupW; out match: TFhirConceptMapGroupElementW): boolean; -var - g : TFhirConceptMapGroupW; - em : TFhirConceptMapGroupElementW; -begin - result := false; - for g in cm.Resource.groups.forEnum do - for em in g.elements.forEnum do - if (g.source = coding.systemUri) and (em.code = coding.code) then - begin - result := true; - match := em.link; - group := g.link; - end; -end; - -function TTerminologyServer.isOkTarget(cm : TLoadedConceptMap; vs : TFhirValueSetW) : boolean; -begin - if cm.Target <> nil then - result := cm.Target.url = vs.url - else - result := false; - // todo: or it might be ok to use this value set if it's a subset of the specified one? -end; - function TTerminologyServer.isValidCode(system, code: String): boolean; var cp : TCodeSystemProvider; @@ -1120,121 +1139,103 @@ function TTerminologyServer.isValidCode(system, code: String): boolean; end end; -function TTerminologyServer.isOkSource(cm : TLoadedConceptMap; vs : TFhirValueSetW; coding : TFHIRCodingW; out group : TFhirConceptMapGroupW; out match : TFhirConceptMapGroupElementW) : boolean; -var - g : TFhirConceptMapGroupW; - em : TFhirConceptMapGroupElementW; -begin - result := false; - if (vs = nil) or ((cm.source <> nil) and (cm.Source.url = vs.url)) then - begin - for g in cm.Resource.groups.forEnum do - for em in g.elements.forEnum do - if (g.source = coding.systemUri) and (em.code = coding.code) then - begin - result := true; - match := em.link; - group := g.link; - end; - end; -end; - -function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW) : TFhirParametersW; -var - op : TFhirOperationOutcomeW; - list : TLoadedConceptMapList; - i : integer; - summary : string; - cm : TLoadedConceptMap; - p : TFhirParametersW; - g : TFhirConceptMapGroupW; - em : TFhirConceptMapGroupElementW; - map : TFhirConceptMapGroupElementTargetW; - outcome : TFHIRCodingW; +function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coding : TFHIRCodingW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; +//var +// op : TFhirOperationOutcomeW; +// list : TLoadedConceptMapList; +// i : integer; +// summary : string; +// cm : TLoadedConceptMap; +// p : TFhirParametersW; +// g : TFhirConceptMapGroupW; +// em : TFhirConceptMapGroupElementW; +// map : TFhirConceptMapGroupElementTargetW; +// outcome : TFHIRCodingW; begin - op := Factory.wrapOperationOutcome(factory.makeResource('OperationOutcome')); - try - try - if not checkCode(op, langList, '', coding.code, coding.systemUri, coding.version, coding.display) then - raise ETerminologyError.Create('Code '+coding.code+' in system '+coding.systemUri+' not recognized', itUnknown); - - // check to see whether the coding is already in the target value set, and if so, just return it - p := validate(target, coding, nil, false, false, nil, summary); - try - if p.bool('result') then - begin - result := Factory.wrapParams(factory.makeResource('Parameters')); - result.addParamBool('result', true); - result.addParam('outcome', coding.Link); - result.addParamCode('equivalence', 'equal'); - exit; - end; - finally - p.free; - end; - - result := Factory.wrapParams(factory.makeResource('Parameters')); - list := GetConceptMapList; - try - for i := 0 to list.Count - 1 do - begin - cm := list[i]; - if isOkTarget(cm, target) and isOkSource(cm, source, coding, g, em) then - try - if em.targetCount = 0 then - raise ETerminologyError.Create('Concept Map has an element with no map for '+'Code '+coding.code+' in system '+coding.systemUri, itInvalid); - for map in em.targets.forEnum do - begin - if (map.equivalence in [cmeEquivalent, cmeEqual, cmeWider, cmeSubsumes, cmeNarrower, cmeSpecializes, cmeInexact]) then - begin - result.addParamBool('result', true); - outcome := factory.wrapCoding(factory.makeByName('Coding')); - result.AddParam('outcome', outcome); - outcome.systemUri := g.target; - outcome.code := map.code; - result.addParamCode('equivalence', CODES_TFHIRConceptEquivalence[map.equivalence]); - if (map.comments <> '') then - result.addParamStr('message', map.comments); - break; - end - end; - exit; - finally - em.free; - g.free; - end; - end; - finally - list.free; - end; - - result.AddParamBool('result', false); - result.AddParamStr('message', 'no match found'); - except - on e : exception do - begin - result := Factory.wrapParams(factory.makeResource('Parameters')); - result.AddParamBool('result', false); - result.AddParamStr('message', e.message); - end; - end; - finally - op.free; - end; + raise ETerminologyTodo.Create('TTerminologyServer.translate'); + //op := Factory.wrapOperationOutcome(factory.makeResource('OperationOutcome')); + //try + // try + // if not checkCode(op, langList, '', coding.code, coding.systemUri, coding.version, coding.display) then + // raise ETerminologyError.Create('Code '+coding.code+' in system '+coding.systemUri+' not recognized', itUnknown); + // + // // check to see whether the coding is already in the target value set, and if so, just return it + // p := validate('', target, coding, nil, false, false, nil, summary); + // try + // if p.bool('result') then + // begin + // result := Factory.wrapParams(factory.makeResource('Parameters')); + // result.addParamBool('result', true); + // result.addParam('outcome', coding.Link); + // result.addParamCode('equivalence', 'equal'); + // exit; + // end; + // finally + // p.free; + // end; + // + // result := Factory.wrapParams(factory.makeResource('Parameters')); + // list := GetConceptMapList; + // try + // for i := 0 to list.Count - 1 do + // begin + // cm := list[i]; + // if isOkTarget(cm, target) and isOkSource(cm, source, coding, g, em) then + // try + // if em.targetCount = 0 then + // raise ETerminologyError.Create('Concept Map has an element with no map for '+'Code '+coding.code+' in system '+coding.systemUri, itInvalid); + // for map in em.targets.forEnum do + // begin + // if (map.equivalence in [cmeEquivalent, cmeEqual, cmeWider, cmeSubsumes, cmeNarrower, cmeSpecializes, cmeInexact]) then + // begin + // result.addParamBool('result', true); + // outcome := factory.wrapCoding(factory.makeByName('Coding')); + // result.AddParam('outcome', outcome); + // outcome.systemUri := g.target; + // outcome.code := map.code; + // result.addParamCode('equivalence', CODES_TFHIRConceptEquivalence[map.equivalence]); + // if (map.comments <> '') then + // result.addParamStr('message', map.comments); + // break; + // end + // end; + // exit; + // finally + // em.free; + // g.free; + // end; + // end; + // finally + // list.free; + // end; + // + // result.AddParamBool('result', false); + // result.AddParamStr('message', 'no match found'); + // except + // on e : exception do + // begin + // result := Factory.wrapParams(factory.makeResource('Parameters')); + // result.AddParamBool('result', false); + // result.AddParamStr('message', e.message); + // end; + // end; + //finally + // op.free; + //end; end; -function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW) : TFhirParametersW; -var - c : TFhirCodingW; +function TTerminologyServer.translate(langList : THTTPLanguageList; source : TFhirValueSetW; coded : TFhirCodeableConceptW; target : TFhirValueSetW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams) : TFhirParametersW; +//var +// c : TFhirCodingW; begin - for c in coded.codings.forEnum do - exit(translate(langList, source, c, target)); + //for c in coded.codings.forEnum do + // exit(translate(langList, source, c, target, params, txResources, profile)); raise ETerminologyTodo.Create('TTerminologyServer.translate'); end; function TTerminologyServer.UseClosure(name: String; out cm: TClosureManager): boolean; begin - FLock.Lock; + FLock.Lock('UseClosure'); try result := FClosures.ContainsKey(name); if result then @@ -1433,7 +1434,7 @@ procedure TTerminologyServer.processConcept(ConceptKey: integer; URL, version, C var vs : TFhirValueSetW; val : TValuesetChecker; - profile : TFHIRExpansionParams; + profile : TFHIRTxOperationParams; begin conn2.SQL := 'select ValueSetKey, URL from ValueSets'; conn2.Prepare; @@ -1445,12 +1446,12 @@ procedure TTerminologyServer.processConcept(ConceptKey: integer; URL, version, C conn3.ExecSQL('Update ValueSets set NeedsIndexing = 0, Error = ''Unable to find definition'' where ValueSetKey = '+conn2.ColStringByName['ValueSetKey']) else try - profile := TFHIRExpansionParams.Create; + profile := TFHIRTxOperationParams.Create; try try - val := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, vs.url, i18n.link); + val := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, '', profile.HTTPLanguages.link, VALIDATION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, vs.url, i18n.link); try - val.prepare(vs, profile); + val.prepare(vs, profile, nil); if val.check('code', URL, version, code, true, false, nil) <> bTrue then conn3.ExecSQL('Delete from ValueSetMembers where ValueSetKey = '+conn2.ColStringByName['ValueSetKey']+' and ConceptKey = '+inttostr(ConceptKey)) else if conn3.CountSQL('select Count(*) from ValueSetMembers where ValueSetKey = '+conn2.ColStringByName['ValueSetKey']+' and ConceptKey = '+inttostr(ConceptKey)) = 0 then @@ -1480,19 +1481,19 @@ procedure TTerminologyServer.processValueSet(ValueSetKey: integer; URL: String; vs : TFhirValueSetW; val : TValuesetChecker; system, version, code : String; - profile : TFHIRExpansionParams; + profile : TFHIRTxOperationParams; begin vs := getValueSetByURL(URL, ''); if vs = nil then conn2.ExecSQL('Update ValueSets set NeedsIndexing = 0, Error = ''Unable to find definition'' where ValueSetKey = '+inttostr(valuesetKey)) else try - profile := TFHIRExpansionParams.defaultProfile; + profile := TFHIRTxOperationParams.defaultProfile; try try - val := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, profile.languages.link), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, vs.url, i18n.link); + val := TValueSetChecker.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, '', profile.HTTPLanguages.link, VALIDATION_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetDefinition, workerGetProvider, workerGetVersions, workerGetExpansion, nil, CommonTerminologies.Languages.link, vs.url, i18n.link); try - val.prepare(vs, profile); + val.prepare(vs, profile, nil); conn2.SQL := 'select ConceptKey, URL, Code from Concepts'; conn2.Prepare; try @@ -1536,9 +1537,9 @@ procedure TTerminologyServer.SetCacheStatus(status: boolean); function TTerminologyServer.Summary: String; var - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try getSummary(b); b.append('
        • Cached Expansions : '+inttostr(FExpansions.Count)+'
        • '); @@ -1554,90 +1555,15 @@ procedure TTerminologyServer.Unload; inherited Unload; end; -function TTerminologyServer.translate(langList : THTTPLanguageList; cm: TLoadedConceptMap; coding: TFHIRCodingW): TFhirParametersW; +function TTerminologyServer.translate(langList : THTTPLanguageList; reqId : String; cml : TFslList; coding: TFHIRCodingW; params : TFhirParametersW; txResources : TFslMetadataResourceList; profile : TFhirTxOperationParams): TFhirParametersW; var - op : TFhirOperationOutcomeW; - g : TFhirConceptMapGroupW; - em : TFhirConceptMapGroupElementW; - map : TFhirConceptMapGroupElementTargetW; - outcome : TFHIRCodingW; - p, pp : TFhirParametersParameterW; - prod : TFhirConceptMapGroupElementDependsOnW; - added : boolean; + worker : TFHIRConceptMapTranslator; begin - op := Factory.wrapOperationOutcome(factory.makeResource('OperationOutcome')); + worker := TFHIRConceptMapTranslator.Create(Factory.link, TTerminologyOperationContext.Create(I18n.link, reqId, profile.HTTPLanguages.link, LOOKUP_DEAD_TIME_SECS, OnGetCurrentRequestCount), workerGetProvider, workerGetVersions, txResources.link, CommonTerminologies.Languages.link, i18n.link); try - try - if not checkCode(op, langList, '', coding.code, coding.systemUri, coding.version, coding.display) then - raise ETerminologyError.Create('Code '+coding.code+' in system '+coding.systemUri+' not recognized', itUnknown); - -// // check to see whether the coding is already in the target value set, and if so, just return it -// p := validate(target, coding, false); -// try -// if TFhirBoolean(p.NamedParameter['result']).value then -// begin -// result := Factory.wrapParams(factory.makeResource('Parameters')); -// result.AddParameter('result', true); -// result.AddParameter('outcome', coding.Link); -// result.AddParameter('equivalence', TFhirCode.Create('equal')); -// exit; -// end; -// finally -// p.free; -// end; - - result := Factory.wrapParams(factory.makeResource('Parameters')); - if isOkSource(cm, coding, g, em) then - try - if em.targetCount = 0 then - raise ETerminologyError.Create('Concept Map has an element with no map for '+'Code '+coding.code+' in system '+coding.systemUri, itUnknown); - added := false; - for map in em.targets.forEnum do - begin - if (map.equivalence in [cmeNull, cmeEquivalent, cmeEqual, cmeWider, cmeSubsumes, cmeNarrower, cmeSpecializes, cmeInexact]) then - begin - result.AddParamBool('result', true); - added := true; - outcome := Factory.wrapCoding(factory.makeByName('Coding')); - try - p := result.AddParam('match'); - outcome.systemUri := g.target; - outcome.code := map.code; - p.AddParam('match', outcome.Element.Link); - p.addParamCode('equivalence', CODES_TFHIRConceptEquivalence[map.equivalence]); - if (map.comments <> '') then - p.addParamStr('message', map.comments); - for prod in map.products.forEnum do - begin - pp := p.addParam('product'); - pp.addParamStr('element', prod.property_); - pp.addParam('concept').value := Factory.makeCoding(prod.system_, prod.value); - end; - finally - outcome.free; - end; - break; - end; - end; - if not added then - begin - result.AddParamBool('result', false); - result.AddParamStr('message', 'no match found'); - end; - finally - em.free; - g.free; - end; - except - on e : exception do - begin - result := Factory.wrapParams(factory.makeResource('Parameters')); - result.AddParamBool('result', false); - result.AddParamStr('message', e.message); - end; - end; + result := worker.translate(langList, reqId, cml, coding, params, profile); finally - op.free; + worker.free; end; end; diff --git a/server/tx_webserver.pas b/server/tx_webserver.pas index 8c1dd31bc..18ed57731 100644 --- a/server/tx_webserver.pas +++ b/server/tx_webserver.pas @@ -38,7 +38,7 @@ interface fsl_base, fsl_utilities, fsl_stream, fsl_lang, IdContext, IdCustomHTTPServer, fhir_xhtml, fhir_objects, fhir_common, fhir_factory, fhir_parser, - fhir_valuesets, + fhir_tx, fhir_valuesets, fsl_htmlgen, ftx_sct_publisher, ftx_sct_services, ftx_loinc_publisher, ftx_loinc_services, ftx_sct_expressions, ftx_sct_analysis, session, tx_server, ftx_service, tx_manager, server_constants, web_event; @@ -86,14 +86,14 @@ TTerminologyWebServer = class (TFslObject) // Procedure BuildCsByURL(html : THtmlPublisher; id : String); // Procedure BuildVsByName(html : THtmlPublisher; id : String); // Procedure BuildVsByURL(html : THtmlPublisher; id : String); - - function sortCmByUrl(pA, pB : Pointer) : Integer; - function sortCmByVer(pA, pB : Pointer) : Integer; - function sortCmByName(pA, pB : Pointer) : Integer; - function sortCmByCtxt(pA, pB : Pointer) : Integer; - function sortCmByPub(pA, pB : Pointer) : Integer; - function sortCmBySrc(pA, pB : Pointer) : Integer; - function sortCmByTgt(pA, pB : Pointer) : Integer; +// +// function sortCmByUrl(pA, pB : Pointer) : Integer; +// function sortCmByVer(pA, pB : Pointer) : Integer; +// function sortCmByName(pA, pB : Pointer) : Integer; +// function sortCmByCtxt(pA, pB : Pointer) : Integer; +// function sortCmByPub(pA, pB : Pointer) : Integer; +// function sortCmBySrc(pA, pB : Pointer) : Integer; +// function sortCmByTgt(pA, pB : Pointer) : Integer; function ProcessValueSetList(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; session : TFhirSession) : string; function ProcessConceptMapList(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; session : TFhirSession) : string; function ProcessCodeSystemList(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; session : TFhirSession) : string; @@ -234,7 +234,7 @@ function TTerminologyWebServer.ProcessHome(AContext: TIdContext; request: TIdHTT function TTerminologyWebServer.ProcessConceptMap(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; session : TFhirSession) : string; var - cm: TLoadedConceptMap; + cm: TFHIRConceptMapW; vars : TFslMap; begin result := 'Concept Map '+request.Document.Substring(9); @@ -242,11 +242,11 @@ function TTerminologyWebServer.ProcessConceptMap(AContext: TIdContext; request: try cm := FServer.getConceptMapById(request.Document.Substring(9)); try - vars.Add('url', FWorker.Factory.makeString(cm.resource.url)); - vars.Add('name', FWorker.Factory.makeString(cm.resource.name)); - vars.Add('html', FWorker.Factory.makeString(ashtml(cm.resource.Resource))); - vars.Add('json', FWorker.Factory.makeString(asJson(cm.resource.Resource))); - vars.Add('xml', FWorker.Factory.makeString(asXml(cm.resource.Resource))); + vars.Add('url', FWorker.Factory.makeString(cm.url)); + vars.Add('name', FWorker.Factory.makeString(cm.name)); + vars.Add('html', FWorker.Factory.makeString(ashtml(cm.Resource))); + vars.Add('json', FWorker.Factory.makeString(asJson(cm.Resource))); + vars.Add('xml', FWorker.Factory.makeString(asXml(cm.Resource))); finally cm.free; end; @@ -414,11 +414,11 @@ function TTerminologyWebServer.ProcessCodeSystemList(AContext: TIdContext; reque function TTerminologyWebServer.ProcessConceptMapList(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; session : TFhirSession) : String; var - mlist: TLoadedConceptMapList; + mlist: TFslList; i: Integer; vars : TFslMap; html : THtmlPublisher; - cm : TLoadedConceptMap; + cm : TFHIRConceptMapW; begin result := 'Concept Map List'; vars := TFslMap.Create('tx.vars'); @@ -426,20 +426,20 @@ function TTerminologyWebServer.ProcessConceptMapList(AContext: TIdContext; reque mlist := FServer.GetConceptMapList; try // determine sort order - if (request.UnparsedParams.EndsWith('=ver')) then - mlist.SortedBy(sortCmByVer) - else if (request.UnparsedParams.EndsWith('=name')) then - mlist.SortedBy(sortCmByName) - else if (request.UnparsedParams.EndsWith('=ctxt')) then - mlist.SortedBy(sortCmByCtxt) - else if (request.UnparsedParams.EndsWith('=pub')) then - mlist.SortedBy(sortCmByPub) - else if (request.UnparsedParams.EndsWith('=src')) then - mlist.SortedBy(sortCmBySrc) - else if (request.UnparsedParams.EndsWith('=tgt')) then - mlist.SortedBy(sortCmByTgt) - else - mlist.SortedBy(sortCmByUrl); + //if (request.UnparsedParams.EndsWith('=ver')) then + // mlist.SortedBy(sortCmByVer) + //else if (request.UnparsedParams.EndsWith('=name')) then + // mlist.SortedBy(sortCmByName) + //else if (request.UnparsedParams.EndsWith('=ctxt')) then + // mlist.SortedBy(sortCmByCtxt) + //else if (request.UnparsedParams.EndsWith('=pub')) then + // mlist.SortedBy(sortCmByPub) + //else if (request.UnparsedParams.EndsWith('=src')) then + // mlist.SortedBy(sortCmBySrc) + //else if (request.UnparsedParams.EndsWith('=tgt')) then + // mlist.SortedBy(sortCmByTgt) + //else + // mlist.SortedBy(sortCmByUrl); // build the table html := THtmlPublisher.Create(); try @@ -458,19 +458,19 @@ function TTerminologyWebServer.ProcessConceptMapList(AContext: TIdContext; reque begin cm := mlist[i]; html.StartTableRow; - html.AddTableCellURL(cm.Resource.url, '/tx/maps/' + cm.Resource.id); - html.AddTableCell(cm.Resource.version); - html.AddTableCell(cm.Resource.name); - html.AddTableCell(cm.Resource.context); - html.AddTableCell(cm.Resource.publisher); - if cm.Source <> nil then - html.AddTableCellURL(cm.Source.url, '/tx/valuesets/' + cm.Source.id) + html.AddTableCellURL(cm.url, '/tx/maps/' + cm.Resource.id); + html.AddTableCell(cm.version); + html.AddTableCell(cm.name); + html.AddTableCell(cm.context); + html.AddTableCell(cm.publisher); + if cm.Source <> '' then + html.AddTableCellURL(cm.Source, '/tx/valuesets/' + cm.Source) else - html.AddTableCell(cm.Resource.sourceDesc); - if cm.Target <> nil then - html.AddTableCellURL(cm.Target.url, '/tx/valuesets/' + cm.Target.id) + html.AddTableCell(cm.sourceDesc); + if cm.Target <> '' then + html.AddTableCellURL(cm.Target, '/tx/valuesets/' + cm.Target) else - html.AddTableCell(cm.Resource.targetDesc); + html.AddTableCell(cm.targetDesc); html.EndTableRow; end; html.EndTable; @@ -492,17 +492,17 @@ function TTerminologyWebServer.processExpand(pm: THTTPParameters; langList : THT var res : TFHIRValueSetW; vs : TFHIRValueSetW; - profile : TFhirExpansionParams; + profile : TFhirTxOperationParams; begin vs := FServer.getValueSetById(pm['valueset']); - profile := TFhirExpansionParams.Create; + profile := TFhirTxOperationParams.Create; try profile.includeDefinition := pm['nodetails'] <> '1'; profile.limitedExpansion := true; - profile.languages := langList.link; + profile.HTTPLanguages := langList.link; try - res := FServer.expandVS(vs, vs.url, profile, pm['filter'], 1000, 0, 0, nil); + res := FServer.expandVS(vs, '', vs.url, profile, pm['filter'], 1000, 0, 0, nil, false); try result := asHtml(res.Resource)+#13#10; // if (not profile.includeDefinition) then @@ -535,7 +535,7 @@ function TTerminologyWebServer.processFind(pm: THTTPParameters): String; resp := FWorker.Factory.makeOpRespLookup; try try - FServer.lookupCode(coding, nil, nil, resp); + FServer.lookupCode(coding, '', nil, nil, nil, resp, nil); p := resp.asParams; try result := '
          '+paramsAsHtml(p)+'
          '#13 + @@ -929,7 +929,7 @@ function TTerminologyWebServer.processTranslate(pm: THTTPParameters): String; coding.version := pm['version']; coding.code := pm['code']; try - res := FServer.translate(nil, nil, coding, vs); + res := FServer.translate(nil, nil, coding, vs, nil, nil, nil); try result := paramsAsHtml(res)+#13#10 + '
          '+asJson(res.Resource)+'
          '#13#10+'
          '+asXml(res.Resource)+'
          '; finally @@ -962,7 +962,7 @@ function TTerminologyWebServer.processValidate(pm: THTTPParameters): String; coding.version := pm['version']; coding.code := pm['code']; coding.display := pm['display']; - res := FServer.validate(vs, coding, nil, pm['abstract'] = '1', (pm['implySystem'] = '1') or (pm['inferSystem'] = '1'), nil, summary); + res := FServer.validate('', vs, coding, nil, pm['abstract'] = '1', (pm['implySystem'] = '1') or (pm['inferSystem'] = '1'), nil, summary); try result := '
          '+paramsAsHtml(res)+'
          '#13 + #10'
          '+asJson(res.Resource)+'
          '#13#10+'
          '+asXml(res.Resource)+'
          ' @@ -1005,68 +1005,68 @@ function TTerminologyWebServer.vsSelect(id: String): String; end; end; -function TTerminologyWebServer.sortCmByCtxt(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.context, vb.Resource.context); -end; - -function TTerminologyWebServer.sortCmByName(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.name, vb.Resource.name); -end; - -function TTerminologyWebServer.sortCmByPub(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.publisher, vb.Resource.publisher); -end; - -function TTerminologyWebServer.sortCmBySrc(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.sourceDesc, vb.Resource.sourceDesc); -end; - -function TTerminologyWebServer.sortCmByTgt(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.TargetDesc, vb.Resource.TargetDesc); -end; - -function TTerminologyWebServer.sortCmByUrl(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.url, vb.Resource.url); -end; - -function TTerminologyWebServer.sortCmByVer(pA, pB: Pointer): Integer; -var - vA, vB : TLoadedConceptMap; -begin - vA := TLoadedConceptMap(pA); - vB := TLoadedConceptMap(pB); - result := CompareStr(vA.Resource.version, vb.Resource.version); -end; +//function TTerminologyWebServer.sortCmByCtxt(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.context, vb.Resource.context); +//end; +// +//function TTerminologyWebServer.sortCmByName(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.name, vb.Resource.name); +//end; +// +//function TTerminologyWebServer.sortCmByPub(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.publisher, vb.Resource.publisher); +//end; +// +//function TTerminologyWebServer.sortCmBySrc(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.sourceDesc, vb.Resource.sourceDesc); +//end; +// +//function TTerminologyWebServer.sortCmByTgt(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.TargetDesc, vb.Resource.TargetDesc); +//end; +// +//function TTerminologyWebServer.sortCmByUrl(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.url, vb.Resource.url); +//end; +// +//function TTerminologyWebServer.sortCmByVer(pA, pB: Pointer): Integer; +//var +// vA, vB : TLoadedConceptMap; +//begin +// vA := TLoadedConceptMap(pA); +// vB := TLoadedConceptMap(pB); +// result := CompareStr(vA.Resource.version, vb.Resource.version); +//end; { TCodeSystemSorter } diff --git a/server/utilities.pas b/server/utilities.pas index 25038a481..af8af99a1 100644 --- a/server/utilities.pas +++ b/server/utilities.pas @@ -158,7 +158,7 @@ TFHIRServerSettings = class (TFslObject) function buildCompartmentsSQL(resconfig : TFslMap; compartment : TFHIRCompartmentId; sessionCompartments : TFslList) : String; function LoadBinaryResource(factory : TFHIRFactory; langList : THTTPLanguageList; b: TBytes): TFhirResourceV; -function connectToDatabase(details : TFHIRServerConfigSection) : TFDBManager; +function connectToDatabase(details : TFHIRServerConfigSection; readOnly : boolean) : TFDBManager; function describeDatabase(details : TFHIRServerConfigSection) : String; function checkDatabaseInstall(cfg : TFHIRServerConfigSection) : String; procedure sendEmail(settings : TFHIRServerSettings; dest, subj, body: String); @@ -319,7 +319,7 @@ function TFHIRServerSettings.nextRequestId: string; result := inttostr(FRunNumber)+'-'+inttostr(v); end; -function connectToDatabase(details : TFHIRServerConfigSection) : TFDBManager; +function connectToDatabase(details : TFHIRServerConfigSection; readOnly : boolean) : TFDBManager; var dbn, ddr : String; begin @@ -340,7 +340,7 @@ function connectToDatabase(details : TFHIRServerConfigSection) : TFDBManager; else if sameText(details['db-type'].value, 'SQLite') then begin Logging.log('Connect to SQLite3 database '+details['db-file'].value); - result := TFDBSQLiteManager.Create(details.name, details['db-file'].value, details['db-auto-create'].value = 'true'); + result := TFDBSQLiteManager.Create(details.name, details['db-file'].value, readOnly, details['db-auto-create'].value = 'true'); end else raise ELibraryException.Create('Unknown database type '+details['db-type'].value); @@ -366,7 +366,7 @@ function checkDatabaseInstall(cfg : TFHIRServerConfigSection) : String; t, m, s : String; begin try - db := connectToDatabase(cfg); + db := connectToDatabase(cfg, true); try conn := db.GetConnection('check'); try diff --git a/server/validator_r2.pas b/server/validator_r2.pas index 1212fc3e1..5a7ac5b51 100644 --- a/server/validator_r2.pas +++ b/server/validator_r2.pas @@ -40,7 +40,7 @@ interface ftx_service, fhir2_types, fhir2_context, fhir2_profiles, fhir2_client, fhir2_utilities, fhir2_resources_base, fhir2_resources_canonical, fhir2_resources_admin, fhir2_resources_clinical, fhir2_resources_other, - fhir_valuesets, + fhir_tx, fhir_valuesets, tx_server; Type @@ -50,7 +50,7 @@ interface TFHIRServerWorkerContextR2 = class (TBaseWorkerContextR2) private FTerminologyServer : TTerminologyServer; - FProfile : TFhirExpansionParams; + FProfile : TFHIRTxOperationParams; FLock : TFslLock; FQuestionnaires : TFslMap; @@ -64,6 +64,7 @@ TFHIRServerWorkerContextR2 = class (TBaseWorkerContextR2) procedure Unload; override; procedure SeeResourceProxy(r : TFhirResourceProxy); override; + procedure LoadCodeSystem(r : TFhirResourceProxy); override; Property TerminologyServer : TTerminologyServer read FTerminologyServer write SetTerminologyServer; @@ -87,7 +88,7 @@ constructor TFHIRServerWorkerContextR2.Create(factory : TFHIRFactory; pc : TFHIR begin inherited; FLock := TFslLock.Create('Validation.questionnaire r2'); - FProfile := TFhirExpansionParams.Create; + FProfile := TFhirTxOperationParams.Create; FProfile.includeDefinition := true; FProfile.limitedExpansion := false; FQuestionnaires := TFslMap.Create('questionnaires'); @@ -126,7 +127,7 @@ procedure TFHIRServerWorkerContextR2.SeeResourceProxy(r : TFhirResourceProxy); FTerminologyServer.SeeSpecificationResource(r) else if r.fhirType = 'Questionnaire' then begin - FLock.lock; + FLock.lock('SeeResourceProxy'); try if FQuestionnaires.ContainsKey(r.id) then FQuestionnaires[r.id] := (r.resource as TFhirQuestionnaire).link @@ -140,6 +141,11 @@ procedure TFHIRServerWorkerContextR2.SeeResourceProxy(r : TFhirResourceProxy); inherited SeeResourceProxy(r); end; +procedure TFHIRServerWorkerContextR2.LoadCodeSystem(r: TFhirResourceProxy); +begin + FTerminologyServer.LoadCodeSystem(r); +end; + function TFHIRServerWorkerContextR2.validateCode(system, version, code: String; vs: TFhirValueSet): TValidationResult; var c : TFHIRCodingW; @@ -154,7 +160,7 @@ function TFHIRServerWorkerContextR2.validateCode(system, version, code: String; c.systemUri := system; c.code := code; c.version := version; - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result := TValidationResult.Create; try @@ -214,7 +220,7 @@ function TFHIRServerWorkerContextR2.getQuestionnaire(url: string): TFhirQuestion begin if url.StartsWith('Questionnaire/') then url := url.Substring(12); - FLock.lock; + FLock.lock('getQuestionnaire'); try if FQuestionnaires.TryGetValue(url, q) then exit(q.Link) @@ -240,7 +246,7 @@ function TFHIRServerWorkerContextR2.expand(vs : TFhirValueSet; options : TExpans limit := 0; if expOptLimited in options then limit := 100; - res := FTerminologyServer.expandVS(vsw, '', FProfile, '', limit, 0, 0, nil); + res := FTerminologyServer.expandVS(vsw, '', '', FProfile, '', limit, 0, 0, nil, false); try result := res.Resource as TFhirValueSet; finally @@ -299,7 +305,7 @@ function TFHIRServerWorkerContextR2.validateCode(code: TFHIRCoding; vs: TFhirVal try c := factory.wrapCoding(code.Link); try - p := FTerminologyServer.validate(vsw, c, nil, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, nil, false, true, nil, summary); try result.Message := p.str('message'); if p.bool('result') then @@ -335,7 +341,7 @@ function TFHIRServerWorkerContextR2.validateCode(code: TFHIRCodeableConcept; vs: try c := factory.wrapCodeableConcept(code.Link); try - p := FTerminologyServer.validate('CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); + p := FTerminologyServer.validate('', 'CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); try result.Message := p.str('message'); if p.bool('result') then diff --git a/server/validator_r3.pas b/server/validator_r3.pas index 021bc515c..8a75e27d5 100644 --- a/server/validator_r3.pas +++ b/server/validator_r3.pas @@ -40,7 +40,7 @@ interface ftx_service, fhir3_types, fhir3_resources_base, fhir3_resources, fhir3_context, fhir3_profiles, fhir3_client, fhir3_utilities, fhir3_pathnode, fhir3_pathengine, - fhir_valuesets, + fhir_tx, fhir_valuesets, tx_server; type @@ -50,7 +50,7 @@ interface TFHIRServerWorkerContextR3 = class (TBaseWorkerContextR3) private FTerminologyServer : TTerminologyServer; - FProfile : TFhirExpansionParams; + FProfile : TFhirTxOperationParams; FLock : TFslLock; FQuestionnaires : TFslMap; FSearchParameters : TFslMap; @@ -68,6 +68,7 @@ TFHIRServerWorkerContextR3 = class (TBaseWorkerContextR3) procedure Unload; override; procedure checkResource(r : TFhirResource); + procedure LoadCodeSystem(r : TFhirResourceProxy); override; procedure SeeResourceProxy(r : TFhirResourceProxy); override; Property TerminologyServer : TTerminologyServer read FTerminologyServer write SetTerminologyServer; @@ -97,11 +98,16 @@ procedure TFHIRServerWorkerContextR3.checkResource(r: TFhirResource); Factory.checkNoModifiers(r, 'Repository.SeeResource', 'Resource'); end; +procedure TFHIRServerWorkerContextR3.LoadCodeSystem(r: TFhirResourceProxy); +begin + FTerminologyServer.LoadCodeSystem(r); +end; + constructor TFHIRServerWorkerContextR3.Create(factory : TFHIRFactory; pc : TFHIRPackageManager); begin inherited; FLock := TFslLock.Create('Validation.questionnaire r3'); - FProfile := TFhirExpansionParams.Create; + FProfile := TFhirTxOperationParams.Create; FProfile.includeDefinition := true; FProfile.limitedExpansion := false; FQuestionnaires := TFslMap.Create('ctxt.questionnaires'); @@ -210,7 +216,7 @@ procedure TFHIRServerWorkerContextR3.SeeResourceProxy(r : TFhirResourceProxy); FCompartments.Add(r.url, TFhirCompartmentDefinition(r.resource).link) else if r.fhirType = 'Questionnaire' then begin - FLock.lock; + FLock.lock('SeeResourceProxy'); try if FQuestionnaires.ContainsKey(r.id) then FQuestionnaires[r.id] := (r.resource as TFhirQuestionnaire).link @@ -238,7 +244,7 @@ function TFHIRServerWorkerContextR3.validateCode(system, version, code: String; c.systemUri := system; c.code := code; c.version := version; - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result := TValidationResult.Create; try @@ -298,7 +304,7 @@ function TFHIRServerWorkerContextR3.getQuestionnaire(url: string): TFhirQuestion begin if url.StartsWith('Questionnaire/') then url := url.Substring(13); - FLock.lock; + FLock.lock('getQuestionnaire'); try if FQuestionnaires.TryGetValue(url, q) then exit(q.Link) @@ -324,7 +330,7 @@ function TFHIRServerWorkerContextR3.expand(vs : TFhirValueSet; options : TExpans limit := 0; if expOptLimited in options then limit := 100; - res := FTerminologyServer.expandVS(vsw, '', FProfile, '', limit, 0, 0, nil); + res := FTerminologyServer.expandVS(vsw, '', '', FProfile, '', limit, 0, 0, nil, false); try result := res.Resource as TFhirValueSet; finally @@ -383,7 +389,7 @@ function TFHIRServerWorkerContextR3.validateCode(code: TFHIRCoding; vs: TFhirVal try c := factory.wrapCoding(code.Link); try - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result.Message := p.str('message'); if p.bool('result') then @@ -419,7 +425,7 @@ function TFHIRServerWorkerContextR3.validateCode(code: TFHIRCodeableConcept; vs: try c := factory.wrapCodeableConcept(code.Link); try - p := FTerminologyServer.validate('CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); + p := FTerminologyServer.validate('', 'CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); try result.Message := p.str('message'); if p.bool('result') then diff --git a/server/validator_r4.pas b/server/validator_r4.pas index 58193588a..eee7ad233 100644 --- a/server/validator_r4.pas +++ b/server/validator_r4.pas @@ -40,7 +40,7 @@ interface ftx_service, fhir4_types, fhir4_resources_base, fhir4_resources, fhir4_context, fhir4_profiles, fhir4_client, fhir4_utilities, fhir4_pathnode, fhir4_pathengine, - fhir_valuesets, + fhir_tx, fhir_valuesets, tx_server; type @@ -50,7 +50,7 @@ interface TFHIRServerWorkerContextR4 = class (TBaseWorkerContextR4) private FTerminologyServer : TTerminologyServer; - FProfile : TFhirExpansionParams; + FProfile : TFhirTxOperationParams; FLock : TFslLock; FQuestionnaires : TFslMap; FSearchParameters : TFslMap; @@ -68,6 +68,7 @@ TFHIRServerWorkerContextR4 = class (TBaseWorkerContextR4) procedure Unload; override; procedure SeeResourceProxy(r : TFhirResourceProxy); override; + procedure LoadCodeSystem(r : TFhirResourceProxy); override; procedure checkResource(r : TFhirResource); Property TerminologyServer : TTerminologyServer read FTerminologyServer write SetTerminologyServer; @@ -100,7 +101,7 @@ constructor TFHIRServerWorkerContextR4.Create(factory : TFHIRFactory; pc : TFHIR begin inherited; FLock := TFslLock.Create('Validation.questionnaire r4'); - FProfile := TFhirExpansionParams.Create; + FProfile := TFhirTxOperationParams.Create; FProfile.includeDefinition := true; FProfile.limitedExpansion := false; FQuestionnaires := TFslMap.Create('ctxt.q'); @@ -209,7 +210,7 @@ procedure TFHIRServerWorkerContextR4.SeeResourceProxy(r : TFhirResourceProxy); FCompartments.Add(r.url, TFhirCompartmentDefinition(r.resource).link) else if r.fhirType = 'Questionnaire' then begin - FLock.lock; + FLock.lock('SeeResourceProxy'); try if FQuestionnaires.ContainsKey(r.id) then FQuestionnaires[r.id] := (r.resource as TFhirQuestionnaire).link @@ -223,6 +224,11 @@ procedure TFHIRServerWorkerContextR4.SeeResourceProxy(r : TFhirResourceProxy); inherited SeeResourceProxy(r); end; +procedure TFHIRServerWorkerContextR4.LoadCodeSystem(r: TFhirResourceProxy); +begin + FTerminologyServer.LoadCodeSystem(r); +end; + function TFHIRServerWorkerContextR4.validateCode(system, version, code: String; vs: TFhirValueSet): TValidationResult; var c : TFHIRCodingW; @@ -237,7 +243,7 @@ function TFHIRServerWorkerContextR4.validateCode(system, version, code: String; c.systemUri := system; c.code := code; c.version := version; - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result := TValidationResult.Create; try @@ -297,7 +303,7 @@ function TFHIRServerWorkerContextR4.getQuestionnaire(url: string): TFhirQuestion begin if url.StartsWith('Questionnaire/') then url := url.Substring(14); - FLock.lock; + FLock.lock('getQuestionnaire'); try if FQuestionnaires.TryGetValue(url, q) then exit(q.Link) @@ -323,7 +329,7 @@ function TFHIRServerWorkerContextR4.expand(vs : TFhirValueSet; options : TExpans limit := 0; if expOptLimited in options then limit := 100; - res := FTerminologyServer.expandVS(vsw, '', FProfile, '', limit, 0, 0, nil); + res := FTerminologyServer.expandVS(vsw, '', '', FProfile, '', limit, 0, 0, nil, false); try result := res.Resource as TFhirValueSet; finally @@ -382,7 +388,7 @@ function TFHIRServerWorkerContextR4.validateCode(code: TFHIRCoding; vs: TFhirVal try c := factory.wrapCoding(code.Link); try - p := FTerminologyServer.validate(vsw, c, nil, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, nil, false, true, nil, summary); try result.Message := p.str('message'); if p.bool('result') then @@ -418,7 +424,7 @@ function TFHIRServerWorkerContextR4.validateCode(code: TFHIRCodeableConcept; vs: try c := factory.wrapCodeableConcept(code.Link); try - p := FTerminologyServer.validate('CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); + p := FTerminologyServer.validate('', 'CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); try result.Message := p.str('message'); if p.bool('result') then diff --git a/server/validator_r4b.pas b/server/validator_r4b.pas index 3cbf354e9..9f9f7fafc 100644 --- a/server/validator_r4b.pas +++ b/server/validator_r4b.pas @@ -40,7 +40,7 @@ interface ftx_service, fhir4B_enums, fhir4B_types, fhir4B_resources_base, fhir4B_resources, fhir4B_context, fhir4B_profiles, fhir4B_client, fhir4B_utilities, fhir4B_pathnode, fhir4B_pathengine, - fhir_valuesets, + fhir_tx, fhir_valuesets, tx_server; type @@ -50,7 +50,7 @@ interface TFHIRServerWorkerContextR4B = class (TBaseWorkerContextR4B) private FTerminologyServer : TTerminologyServer; - FProfile : TFhirExpansionParams; + FProfile : TFhirTxOperationParams; FLock : TFslLock; FQuestionnaires : TFslMap; FSearchParameters : TFslMap; @@ -68,6 +68,7 @@ TFHIRServerWorkerContextR4B = class (TBaseWorkerContextR4B) procedure Unload; override; procedure SeeResourceProxy(r : TFhirResourceProxy); override; + procedure LoadCodeSystem(r : TFhirResourceProxy); override; procedure checkResource(r : TFhirResource); Property TerminologyServer : TTerminologyServer read FTerminologyServer write SetTerminologyServer; @@ -100,7 +101,7 @@ constructor TFHIRServerWorkerContextR4B.Create(factory : TFHIRFactory; pc : TFHI begin inherited; FLock := TFslLock.Create('Validation.questionnaire r4B'); - FProfile := TFhirExpansionParams.Create; + FProfile := TFhirTxOperationParams.Create; FProfile.includeDefinition := true; FProfile.limitedExpansion := false; FQuestionnaires := TFslMap.Create('ctxt.q'); @@ -209,7 +210,7 @@ procedure TFHIRServerWorkerContextR4B.SeeResourceProxy(r : TFhirResourceProxy); FCompartments.Add(r.url, TFhirCompartmentDefinition(r.resource).link) else if r.fhirType = 'Questionnaire' then begin - FLock.lock; + FLock.lock('SeeResourceProxy'); try if FQuestionnaires.ContainsKey(r.id) then FQuestionnaires[r.id] := (r.resource as TFhirQuestionnaire).link @@ -223,6 +224,11 @@ procedure TFHIRServerWorkerContextR4B.SeeResourceProxy(r : TFhirResourceProxy); inherited SeeResourceProxy(r); end; +procedure TFHIRServerWorkerContextR4B.LoadCodeSystem(r: TFhirResourceProxy); +begin + FTerminologyServer.LoadCodeSystem(r); +end; + function TFHIRServerWorkerContextR4B.validateCode(system, version, code: String; vs: TFhirValueSet): TValidationResult; var c : TFHIRCodingW; @@ -237,7 +243,7 @@ function TFHIRServerWorkerContextR4B.validateCode(system, version, code: String; c.systemUri := system; c.code := code; c.version := version; - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result := TValidationResult.Create; try @@ -297,7 +303,7 @@ function TFHIRServerWorkerContextR4B.getQuestionnaire(url: string): TFhirQuestio begin if url.StartsWith('Questionnaire/') then url := url.Substring(14); - FLock.lock; + FLock.lock('getQuestionnaire'); try if FQuestionnaires.TryGetValue(url, q) then exit(q.Link) @@ -323,7 +329,7 @@ function TFHIRServerWorkerContextR4B.expand(vs : TFhirValueSet; options : TExpan limit := 0; if expOptLimited in options then limit := 100; - res := FTerminologyServer.expandVS(vsw, '', FProfile, '', limit, 0, 0, nil); + res := FTerminologyServer.expandVS(vsw, '', '', FProfile, '', limit, 0, 0, nil, false); try result := res.Resource as TFhirValueSet; finally @@ -382,7 +388,7 @@ function TFHIRServerWorkerContextR4B.validateCode(code: TFHIRCoding; vs: TFhirVa try c := factory.wrapCoding(code.Link); try - p := FTerminologyServer.validate(vsw, c, nil, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, nil, false, true, nil, summary); try result.Message := p.str('message'); if p.bool('result') then @@ -418,7 +424,7 @@ function TFHIRServerWorkerContextR4B.validateCode(code: TFHIRCodeableConcept; vs try c := factory.wrapCodeableConcept(code.Link); try - p := FTerminologyServer.validate('CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); + p := FTerminologyServer.validate('', 'CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); try result.Message := p.str('message'); if p.bool('result') then diff --git a/server/validator_r5.pas b/server/validator_r5.pas index 02a193279..a8aa1ceff 100644 --- a/server/validator_r5.pas +++ b/server/validator_r5.pas @@ -40,7 +40,7 @@ interface ftx_service, fhir5_enums, fhir5_types, fhir5_resources_base, fhir5_resources, fhir5_context, fhir5_profiles, fhir5_client, fhir5_utilities, fhir5_pathnode, fhir5_pathengine, - fhir_valuesets, + fhir_tx, fhir_valuesets, tx_server; type @@ -50,7 +50,7 @@ interface TFHIRServerWorkerContextR5 = class (TBaseWorkerContextR5) private FTerminologyServer : TTerminologyServer; - FProfile : TFhirExpansionParams; + FProfile : TFhirTxOperationParams; FLock : TFslLock; FQuestionnaires : TFslMap; FSearchParameters : TFslMap; @@ -68,6 +68,7 @@ TFHIRServerWorkerContextR5 = class (TBaseWorkerContextR5) procedure Unload; override; procedure SeeResourceProxy(r : TFhirResourceProxy); override; + procedure LoadCodeSystem(r : TFhirResourceProxy); override; procedure checkResource(r : TFhirResource); Property TerminologyServer : TTerminologyServer read FTerminologyServer write SetTerminologyServer; @@ -100,7 +101,7 @@ constructor TFHIRServerWorkerContextR5.Create(factory : TFHIRFactory; pc : TFHIR begin inherited; FLock := TFslLock.Create('Validation.questionnaire r5'); - FProfile := TFhirExpansionParams.Create; + FProfile := TFhirTxOperationParams.Create; FProfile.includeDefinition := false; FProfile.limitedExpansion := false; FQuestionnaires := TFslMap.Create('ctxt.q'); @@ -209,7 +210,7 @@ procedure TFHIRServerWorkerContextR5.SeeResourceProxy(r : TFhirResourceProxy); FCompartments.Add(r.url, TFhirCompartmentDefinition(r.resource).link) else if r.fhirType = 'Questionnaire' then begin - FLock.lock; + FLock.lock('SeeResourceProxy'); try if FQuestionnaires.ContainsKey(r.id) then FQuestionnaires[r.id] := (r.resource as TFhirQuestionnaire).link @@ -223,6 +224,11 @@ procedure TFHIRServerWorkerContextR5.SeeResourceProxy(r : TFhirResourceProxy); inherited SeeResourceProxy(r); end; +procedure TFHIRServerWorkerContextR5.LoadCodeSystem(r: TFhirResourceProxy); +begin + FTerminologyServer.LoadCodeSystem(r); +end; + function TFHIRServerWorkerContextR5.validateCode(system, version, code: String; vs: TFhirValueSet): TValidationResult; var c : TFHIRCodingW; @@ -237,7 +243,7 @@ function TFHIRServerWorkerContextR5.validateCode(system, version, code: String; c.systemUri := system; c.code := code; c.version := version; - p := FTerminologyServer.validate(vsw, c, FProfile, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, FProfile, false, true, nil, summary); try result := TValidationResult.Create; try @@ -297,7 +303,7 @@ function TFHIRServerWorkerContextR5.getQuestionnaire(url: string): TFhirQuestion begin if url.StartsWith('Questionnaire/') then url := url.Substring(14); - FLock.lock; + FLock.lock('getQuestionnaire'); try if FQuestionnaires.TryGetValue(url, q) then exit(q.Link) @@ -323,7 +329,7 @@ function TFHIRServerWorkerContextR5.expand(vs : TFhirValueSet; options : TExpans limit := 0; if expOptLimited in options then limit := 100; - res := FTerminologyServer.expandVS(vsw, '', FProfile, '', limit, 0, 0, nil); + res := FTerminologyServer.expandVS(vsw, '', '', FProfile, '', limit, 0, 0, nil, false); try result := res.Resource as TFhirValueSet; finally @@ -382,7 +388,7 @@ function TFHIRServerWorkerContextR5.validateCode(code: TFHIRCoding; vs: TFhirVal try c := factory.wrapCoding(code.Link); try - p := FTerminologyServer.validate(vsw, c, nil, false, true, nil, summary); + p := FTerminologyServer.validate('', vsw, c, nil, false, true, nil, summary); try result.Message := p.str('message'); if p.bool('result') then @@ -418,7 +424,7 @@ function TFHIRServerWorkerContextR5.validateCode(code: TFHIRCodeableConcept; vs: try c := factory.wrapCodeableConcept(code.Link); try - p := FTerminologyServer.validate('CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); + p := FTerminologyServer.validate('', 'CodeableConcept', vsw, c, FProfile, false, true, vcmCodeableConcept, nil, summary); try result.Message := p.str('message'); if p.bool('result') then diff --git a/server/web/assets/images/tx-registry-root.gif b/server/web/assets/images/tx-registry-root.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6cadf3bb4444130c5adb11ca45b69a09fa67007 GIT binary patch literal 365 zcmZ?wbhEHb6krfwxT?c2d(ZW+mnS!_z4_+CtXIbxdp6%pTX1vw_S1GvJOBUxu)5Rv z?b(SxKR^8c|Lf(A1+Yie->-yB-1+;#@=up0{&>3c+P30{yDDtUcdl4kP8%lvM@3*=l~%Qfc(V3)^%WNfrredzSaCpfmv3wS1V_;21Kq8cNF3DsN8@5 zP+3)gPq0Z&RT2fe9UdbZSUZ*WBQmLZC zBI?Az%EY9>sU#^gU6E1DRa=8sRzaMPg_}_*IaotjTS`Egkx@l$OR$<6kKD9F2RyV7 O9X}Bi>=xw6U=0A7Cz#{_ literal 0 HcmV?d00001 diff --git a/server/web/assets/images/tx-registry.png b/server/web/assets/images/tx-registry.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/server/web/assets/images/tx-server.png b/server/web/assets/images/tx-server.png new file mode 100644 index 0000000000000000000000000000000000000000..720a237c73a9809be48ffa5ad1c1b90205b7f025 GIT binary patch literal 530 zcmV+t0`2{YP)8!PM!jse+otDvXRhleu>w{(hr=P& zTV2;rBMofZo=3rrs;YWAJqHeofOC+HNSe*6&}=qN@aeaKWm$(L&gF8enM?+{FRwu9 zoD1NBqmclHW{%@Tw}6Wqg+f989t^&~Me(EkfChX#56VZfjYtFPF_lU|uh;XF8H4TO zj!YM$blUKV1mw(6M2qNP2;H{su`-!X|7n%u=>+~>3AvaIiltqd9#DvgJ&1=10t0D6 z$;|KlP3c1Y-2fh17umvCJQ4=!_2+B&{P5)SL<2$#ZY7EM2$|!%^Ti9`3q;4qtws{i zDI^jJKbdhUAOoMo-`t-B@esjXtJQ*jzYmI{z|3qKZ(vLsG2zn?;Y5OJwYqN@My1o~ zTxy!Ox4y9nOZhb^2wGcN&dWOz9rx?szq&Dw38OK zY!^{rCAFy_2z8TV&4=Ube7+y|oYO*02OOyb5BD7I^ZdAQt`ZS+tMaFrb6^=AxbXHx zH;=|4CCm%L{PZwSS3v3G^sH+#W3JcR_xs(&`Tqt8^J9}d0vU#im5^f#04JL4qMaI^seoYDXwB>7;oyw=|M z1!ayym?6XvqV3ae_f95{py8ukt2TxB^!VIzRRh4#rNu~y^X+P>L{SXo3_|Qqm>9wY zz(9!5s#OBElpmj4DRyjO`0`RiEIkUg%7D)8y}}Ye3}prow;JG>UQOIs{kfZSJ9bYz zskMPbH9)1H6FDf)1=ZKVfe+;jf`a(O{!9meiN~~d0iA$0qX=t0D6Ydx4#RO76h@#R z9_k7Z;$fv6G>QeZ{Yu0n&xL4%!?l}UPj4!j&Vs@?dl=y8#_IQ`5I-5a_T$dJtJ_~5 z4&186>klZh{hfba

          - Server Home. | FHIR © HL7.org 2011+.  |  This server based on version [%ver%] + Server Home. | FHIR © HL7.org 2011+.  |  Server v[%server-ver%] on [%os%]  |  This server based on version [%ver%]

          diff --git a/server/web/coverage.html b/server/web/coverage.html index e71b141e0..6f42bbb4d 100644 --- a/server/web/coverage.html +++ b/server/web/coverage.html @@ -2,78 +2,12 @@ - Coverage Entry: FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Coverage (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Coverage Entry

          @@ -213,49 +147,7 @@

          Coverage Entry

          -
          - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + COVID (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Page for Patient

          @@ -97,50 +31,7 @@

          Page for Patient

          [%covid.newpatient covid-patient-form.liquid%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + COVID (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - - - - - - - - - - - - + COVID (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          +[%include top.html%] - - - - - - - - - - - - - - + COVID (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          COVID-19 Maintenance System

          @@ -97,50 +31,7 @@

          COVID-19 Maintenance System

          [%covid.newpatient covid-patient-form.liquid%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Coverage Entry (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Coverage Entry Created

          @@ -81,49 +15,7 @@

          Coverage Entry Created

          See the coverage resource at [%path%]/Coverage/[%rid%].

          -
          - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Diagnostics (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Server Internal Diagnostics

          Current Activity

          • Background Thread: [%status.thread%]
          • CDS client instances: [%status.cds.client%]
          • -
          • [%status.web-total-count%] total requests for [%status.web-total-time%]ms. [%status.web-rest-count%] REST requests for [%status.web-rest-time%]ms. [%status.run-time%] since starting ({%status.run-time.ms%]ms)
          • +
          • [%status.web-total-count%] total requests for [%status.web-total-time%]ms. [%status.web-rest-count%] REST requests for [%status.web-rest-time%]ms. [%status.run-time%] since starting ([%status.run-time.ms%] ms)
          [%status.web%] @@ -106,50 +38,8 @@

          Locks

          [%status.locks%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Patient Page (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Page for Patient

          @@ -108,50 +42,7 @@

          CDS Hooks:

        • Load FitBit Data: this app loads summary data from FitBit into this patient's record. You will have to provide you own fitbit data
        • --> -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + FitBit (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          FitBit Application Starter

          @@ -85,50 +17,8 @@

          FitBit Application Starter

          [%fitbit-redirect%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + HOME (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Welcome to the FHIR Server

          @@ -91,50 +23,9 @@

          Welcome to the FHIR Server

          (and logged in user, if one exists). Also, your IP address is logged with Google Analytics for building geomaps of server usage. Your continued use of the API constitutes agreement to these terms. See [link] for erasure requests.

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Extensions (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Extensions to the FHIR API Supported by this server

          @@ -200,50 +133,8 @@

          Step 3: Getting information about the token

          The last 3 are only provided if the user approved this. Email address may not be known at all.

          --> -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Authorization (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -   -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Server Authorization

          @@ -208,50 +140,8 @@

          FHIR Server Authorization

          --> -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Login (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Server Login

          @@ -94,50 +26,10 @@

          FHIR Server Login

            [%client-notes%]
          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Login (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Server Login

          @@ -85,50 +17,10 @@

          FHIR Server Login

            [%client-notes%]
          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Skype Login (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          FHIR Server Skype based Login handler

          @@ -89,50 +20,8 @@

          FHIR Server Skype based Login handler

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + User Details (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -   -
          -
          -
          - - - -
          -
          -
          -
          -

          [%username%] Account Details

          @@ -90,50 +22,8 @@

          [%username%] Account Details

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Client (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Package Client

          Packages for FHIR Version [%ver%]: @@ -85,78 +16,8 @@

          Package Client

          [%package-list%] - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-broken.html b/server/web/packages-broken.html new file mode 100644 index 000000000..6e4b1ff14 --- /dev/null +++ b/server/web/packages-broken.html @@ -0,0 +1,23 @@ + + + + + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] + + + +[%include top.html%] +

          FHIR Package Server - Broken Dependencies

          + +
          + Filter: + + +[%table%] + +[%include bottom.html%] + + + + diff --git a/server/web/packages-home.html b/server/web/packages-home.html index 6e9533d1b..5c19eeb8b 100644 --- a/server/web/packages-home.html +++ b/server/web/packages-home.html @@ -1,83 +1,14 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Package Server

          Search the Packages: @@ -102,6 +33,9 @@

          FHIR Package Server

          [%count%] Packages available. [%downloads%] Packages Downloaded. Status = [%status%]. Package History last 30 days

          +

          +Last Package Crawler Log | Broken Dependencies +

          How to add packages to this package server: @@ -112,78 +46,8 @@

          FHIR Package Server

          - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-log.html b/server/web/packages-log.html new file mode 100644 index 000000000..388fb5bec --- /dev/null +++ b/server/web/packages-log.html @@ -0,0 +1,19 @@ + + + + + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] + + + +[%include top.html%] +

          FHIR Package Server - Crawler Log

          + +[%log%] + +[%include bottom.html%] + + + + diff --git a/server/web/packages-protect.html b/server/web/packages-protect.html index 26a1a6c60..f2f4c6b99 100644 --- a/server/web/packages-protect.html +++ b/server/web/packages-protect.html @@ -1,83 +1,13 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          FHIR Package Server - Protect #current for Package [%pid%]

          Provide the System password, and the server will return a new token that must @@ -94,77 +24,8 @@

          FHIR Package Server - Protect #current for Package [%pid%]

          can get the password from the FHIR product director.

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-protected.html b/server/web/packages-protected.html index f98b897b4..db7317ac3 100644 --- a/server/web/packages-protected.html +++ b/server/web/packages-protected.html @@ -1,83 +1,14 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Package Server - #current for Package [%pid%] Protected

          The token [%pword%] has been assigned to the package, and must now be @@ -88,77 +19,8 @@

          FHIR Package Server - #current for Package [%pid%] Protected

          See [doco] for information about how to use the token.

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-search.html b/server/web/packages-search.html index d0a789bc9..7e5bdcef2 100644 --- a/server/web/packages-search.html +++ b/server/web/packages-search.html @@ -1,84 +1,19 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] +

          FHIR Package Server

          -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - +

          + Last Package Crawler Log | Broken Dependencies +

          -
          -
          -
          -
          -
          -

          FHIR Package Server

          Search the Catalog:

          @@ -110,79 +45,8 @@

          FHIR Package Server

          - - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-upload-api.html b/server/web/packages-upload-api.html index 5530bab97..013f6f221 100644 --- a/server/web/packages-upload-api.html +++ b/server/web/packages-upload-api.html @@ -1,83 +1,14 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Package Server - Upload API

          This API allow FHIR users to upload their package directly to the Package server. @@ -97,77 +28,8 @@

          FHIR Package Server - Upload API

          server, and then creates the package.

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/packages-versions.html b/server/web/packages-versions.html index 44b9fb929..ad9534011 100644 --- a/server/web/packages-versions.html +++ b/server/web/packages-versions.html @@ -1,83 +1,14 @@ - - + - Package Server - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Package Server (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Package Server

          Versions for [%name%] @@ -96,77 +27,8 @@

          FHIR Package Server

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/patient.html b/server/web/patient.html index fac081061..0f465d1b1 100644 --- a/server/web/patient.html +++ b/server/web/patient.html @@ -2,79 +2,12 @@ - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Patient (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          - +[%include top.html%]

          Page for Patient

          @@ -102,56 +35,10 @@

          CDS Hooks:

            [%patient-app-list%] -
          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Register (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          - +[%include top.html%] +

          Register a Client

          @@ -104,50 +37,7 @@

          Register a Client

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + User (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Edit User: [%user.fname%]

          @@ -103,50 +35,10 @@

          Edit User: [%user.fname%]

          Or go Back to the user list.

          -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Users (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Registered Users

          @@ -87,50 +18,9 @@

          Registered Users

          Add a new user

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + SCT (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          SNOMED CT Edition Choice

          [%choice%] - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Sessions (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Current Sessions

          @@ -84,50 +16,8 @@

          Current Sessions

          [%sessions-table%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/server/web/task-redirect.html b/server/web/task-redirect.html index a1857c1b3..25a91efa1 100644 --- a/server/web/task-redirect.html +++ b/server/web/task-redirect.html @@ -1,119 +1,21 @@ - - + - ${title} - ${redirect} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Task (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%] ${body} + [%include bottom.html%] - - - -
          - - -
          -
          -
          -
          - - - - - - - - - + + + + \ No newline at end of file diff --git a/server/web/template-fhir.html b/server/web/template-fhir.html index 8fe37dd1b..93a159ef1 100644 --- a/server/web/template-fhir.html +++ b/server/web/template-fhir.html @@ -1,157 +1,20 @@ - - + - [%title%] - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [%title%] (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%] [%content%] -
          - - -
          -
          -
          -
          - - - +[%include bottom.html%] - - - - - - - - - - - - - +[%include tabs.html%] + diff --git a/server/web/template-nfhir.html b/server/web/template-nfhir.html index ff8e491b4..b40d798de 100644 --- a/server/web/template-nfhir.html +++ b/server/web/template-nfhir.html @@ -1,156 +1,21 @@ - - + - [%title%] - FHIR Server [%id%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [%title%] (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%] [%content%] -
          - - -
          -
          -
          -
          - - - +[%include bottom.html%] - - - - - - - - - - - - - +[%include tabs.html%] + + diff --git a/server/web/token.html b/server/web/token.html index 563dc3214..2af51d955 100644 --- a/server/web/token.html +++ b/server/web/token.html @@ -1,83 +1,13 @@ - - - Session JWT: FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Session (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          - - +[%include top.html%]

          Session Token

          @@ -88,48 +18,7 @@

          Session Token

          - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Concept Map (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Concept Map [%name%] ([%url%])

          [%html%] @@ -92,51 +23,8 @@

          Concept Map [%name%] ([%url%])

          [%xml%] - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Code System (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] - -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -
          +[%include top.html%]

          Code System [%name%] ([%url%])

          [%html%] @@ -92,51 +23,8 @@

          Code System [%name%] ([%url%])

          [%xml%] - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Tx Server Registry (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          FHIR Tx Server Registry

          Filter the Tx Servers: @@ -86,7 +19,7 @@

          FHIR Tx Server Registry

          - +
          Registry (by code)
          Server (by code)
          Version (by code)
          Version (by code)
          Code System (url or url|version)
          @@ -97,60 +30,20 @@

          FHIR Tx Server Registry


          -[%count%] Servers found. Status = [%status%]. Package History last 30 days +[%count%] matching Servers found. Status = [%status%]. Package History last 30 days

          -How to add tx servers to this registry: to do +Registry View: +

          +[%tx-reg-view%] +

          +How to add tx servers to this registry: [%tx-reg-doco%]

          - - - - - - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/tx-vs-id.html b/server/web/tx-vs-id.html index ee7ff41bc..4da08cd5a 100644 --- a/server/web/tx-vs-id.html +++ b/server/web/tx-vs-id.html @@ -1,82 +1,14 @@ - - - + - Value Set [%name%] - FHIR Server [%id%] Version [%ver%] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ValueSet (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Value Set [%name%] ([%url%])

          [%html%] @@ -92,51 +24,8 @@

          Value Set [%name%] ([%url%])

          [%xml%] - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [%kind%] List (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          [%kind%] List

          [%table%] -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Terminology service (FHIR Server [%id%] Version [%ver%]) + [%include head.html%] +[%include top.html%] -
          -
          -
          -
          - FHIR - - © HL7.org -  |  - Server Home  |  - [%id%] FHIR Server -  |  - FHIR Version [%ver%] -  [%logout%] -
          -
          -
          - - - -
          -
          -
          -
          -

          Terminology service Resources

          Explore the resources available to this server: @@ -170,80 +101,8 @@

          Terminology service operations

          - - - -
          - - -
          -
          -
          -
          - - - - - - - - - - - - - - - - - +[%include bottom.html%] + diff --git a/server/web/xig.html b/server/web/xig.html index 0244ae1fc..4a45cfad6 100644 --- a/server/web/xig.html +++ b/server/web/xig.html @@ -2,7 +2,7 @@ - FHIR Server [%id%] Version [%ver%] + XIG (FHIR Server [%id%] Version [%ver%]) [%include head.html%] @@ -23,6 +23,7 @@

          FHIR IG Statistics ([%ms%] ms)

          XIG built as of [%metadata-date%]. Found [%metadata-resources%] resources in [%metadata-packages%] packages.

          + [%include bottom.html%] diff --git a/server/web_base.pas b/server/web_base.pas index 943e56dae..731006114 100644 --- a/server/web_base.pas +++ b/server/web_base.pas @@ -203,7 +203,7 @@ destructor TFHIRWebServerStats.Destroy; function TFHIRWebServerStats.GetRestCount: integer; begin - FLock.Lock; + FLock.Lock('GetRestCount'); try result := FRestCount; finally @@ -213,7 +213,7 @@ function TFHIRWebServerStats.GetRestCount: integer; function TFHIRWebServerStats.GetRestTime: integer; begin - FLock.Lock; + FLock.Lock('GetRestTime'); try result := FRestTime; finally @@ -223,7 +223,7 @@ function TFHIRWebServerStats.GetRestTime: integer; function TFHIRWebServerStats.GetTotalCount: integer; begin - FLock.Lock; + FLock.Lock('GetTotalCount'); try result := FTotalCount; finally @@ -233,7 +233,7 @@ function TFHIRWebServerStats.GetTotalCount: integer; function TFHIRWebServerStats.GetTotalTime: integer; begin - FLock.Lock; + FLock.Lock('GetTotalTime'); try result := FTotalTime; finally @@ -250,7 +250,7 @@ function TFHIRWebServerStats.Present: string; var rt, rc : integer; begin - FLock.Lock; + FLock.Lock('Present'); try rt := FRestTime; rc := FRestCount; @@ -266,7 +266,7 @@ function TFHIRWebServerStats.Present: string; procedure TFHIRWebServerStats.restStart; begin - FLock.Lock; + FLock.Lock('restStart'); try inc(FRestCount, 1); finally @@ -281,7 +281,7 @@ procedure TFHIRWebServerStats.start; procedure TFHIRWebServerStats.totalStart; begin - FLock.Lock; + FLock.Lock('totalStart'); try inc(FTotalCount, 1); finally @@ -291,7 +291,7 @@ procedure TFHIRWebServerStats.totalStart; procedure TFHIRWebServerStats.restFinish(ms: integer); begin - FLock.Lock; + FLock.Lock('restFinish'); try inc(FRestTime, ms); finally @@ -301,7 +301,7 @@ procedure TFHIRWebServerStats.restFinish(ms: integer); procedure TFHIRWebServerStats.totalFinish(ms: integer); begin - FLock.Lock; + FLock.Lock('totalFinish'); try inc(FTotalTime, ms); finally diff --git a/server/web_cache.pas b/server/web_cache.pas index fc1322e52..5e9aeff1e 100644 --- a/server/web_cache.pas +++ b/server/web_cache.pas @@ -138,7 +138,7 @@ procedure THTTPCacheManager.recordResponse(ep : String; request: TIdHTTPRequestI co.LoadFromStream(response.ContentStream); co.Summary := summary; co.FLastTouched := now; - FLock.Lock; + FLock.Lock('recordResponse'); try FCache.AddOrSetValue(key, co.Link); inc(FSize, co.Size); @@ -155,13 +155,15 @@ procedure THTTPCacheManager.recordResponse(ep : String; request: TIdHTTPRequestI function THTTPCacheManager.respond(ep : String; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; var summary : String): boolean; var co : TCachedHTTPResponse; + key : string; begin - if not FCaching or UnderDebugger then + if not FCaching or UnderDebugger or request.QueryParams.contains('no-cache=please') then exit(false); - FLock.Lock; + key := generateKey(ep, request); + FLock.Lock('respond'); try - result := FCache.TryGetValue(generateKey(ep, request), co); + result := FCache.TryGetValue(key, co); if result then begin co.Link; @@ -198,42 +200,27 @@ procedure THTTPCacheManager.Trim(callback : TFhirServerMaintenanceThreadTaskCall list : TStringList; v : TCachedHTTPResponse; dt : TDateTime; + st : QWord; begin callback(self, 'Trimming Cache', -1); list := TStringList.Create; try - FLock.Lock; + FLock.Lock('trim'); try dt := now - FCacheDwellTime; + FSize := 0; for s in FCache.Keys do begin v := FCache[s]; if (v.FLastTouched < dt) then - begin - list.add(s); - FSize := FSize - v.Size; - end; + list.add(s) + else + inc(FSize, v.size); end; FCache.RemoveKeys(list); - i := 1; - while FSize > FMaxSize do - begin - for s in FCache.Keys do - begin - v := FCache[s]; - if v.HitCount <= i then - begin - list.Add(s); - FSize := FSize - v.Size; - end; - if (FSize < FMaxSize) then - break; - end; - FCache.RemoveKeys(list); - list.clear; - inc(i); - end; + if FSize > FMaxSize then + FCache.clear; finally FLock.Unlock; end; @@ -250,7 +237,7 @@ procedure THTTPCacheManager.recordStats(rec: TStatusRecord); procedure THTTPCacheManager.Clear; begin - FLock.Lock; + FLock.Lock('Clear'); try FCache.Clear; FSize := 0; diff --git a/server/web_server.pas b/server/web_server.pas index 8681428ff..294ad838a 100644 --- a/server/web_server.pas +++ b/server/web_server.pas @@ -96,17 +96,35 @@ scim_server, auth_manager, reverse_client, cds_hooks_server, web_source, analytics, bundlebuilder, server_factory, user_manager, server_context, server_constants, utilities, jwt, usage_stats, - subscriptions, twilio, telnet_server, time_tracker, + subscriptions, twilio, time_tracker, web_base, endpoint, endpoint_storage; Type + + { TFHIRHTTPConnectionInfo } + + TFHIRHTTPConnectionInfo = class (TFslObject) + private + FRequest : TIdHTTPRequestInfo; + FThreadId : TThreadID; + FContext: TIdContext; + FClientIP : string; + public + constructor create(request : TIdHTTPRequestInfo; context: TIdContext); + destructor Destroy; override; + function link : TFHIRHTTPConnectionInfo; + function log : String; + end; + + TFhirWebServer = class; + TFHIRHTTPServer = class(TIdHTTPServer) + private + FServer : TFhirWebServer; protected procedure DoMaxConnectionsExceeded(AIOHandler: TIdIOHandler); override; end; - TFhirWebServer = class; - TFHIRPathServerObject = class (TFHIRObject) protected FContext : TFHIRServerContext; @@ -159,6 +177,7 @@ TFHIRWebServerExtension = class abstract (TFHIRPathEngineExtension) FInLog : TLogger; FOutLog : TLogger; FLogFolder : String; + FRobotsText : String; // operational fields FUsageServer : TUsageStatsServer; @@ -169,11 +188,13 @@ TFHIRWebServerExtension = class abstract (TFHIRPathEngineExtension) FEndPoints : TFslList; FSecureCount, FPlainCount : Integer; FStats : TStatusRecords; - + FLock : TFslLock; + FLiveConnections : TFslList; function insertValue(n: String; secure: boolean; variables: TFslMap): String; function isLogging : boolean; procedure logRequest(secure : boolean; id, clientIP : String; request : TIdHTTPRequestInfo); procedure logResponse(id : String; resp : TIdHTTPResponseInfo); + procedure logCrash(secure : boolean; id, clientIP : String; request : TIdHTTPRequestInfo; resp : TIdHTTPResponseInfo); function WebDump: String; Procedure CreatePostStream(AContext: TIdContext; AHeaders: TIdHeaderList; var VPostStream: TStream); procedure MarkEntry(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo); @@ -212,6 +233,7 @@ TFHIRWebServerExtension = class abstract (TFHIRPathEngineExtension) procedure loadConfiguration(ini : TFHIRServerConfigFile); property settings : TFHIRServerSettings read FSettings; property stats : TStatusRecords read FStats; + property RobotsText : String read FRobotsText write FRobotsText; procedure DoVerifyPeer(Sender: TObject; const x509: TIdOpenSSLX509; const VerifyResult: Integer; const Depth: Integer; var Accepted: Boolean); // private (hint busting) @@ -226,10 +248,12 @@ TFHIRWebServerExtension = class abstract (TFHIRPathEngineExtension) property EndPoints : TFslList read FEndPoints; function EndPoint(name : String) : TFhirWebServerEndpoint; + function GetCurrentRequestReport : String; + function GetCurrentRequestCount : integer; + procedure registerEndPoint(endPoint : TFHIRServerEndPoint); End; - Implementation Uses @@ -238,6 +262,39 @@ TFHIRWebServerExtension = class abstract (TFHIRPathEngineExtension) {$ENDIF} fsl_oauth{$IFDEF COVID}, FHIR.Server.Covid{$ENDIF}; +{ TFHIRHTTPConnectionInfo } + +constructor TFHIRHTTPConnectionInfo.create(request: TIdHTTPRequestInfo; context: TIdContext); +begin + inherited Create; + FRequest := request; + FContext := context; + FThreadId := GetCurrentThreadId; +end; + +destructor TFHIRHTTPConnectionInfo.Destroy; +begin + // nothing + inherited Destroy; +end; + +function TFHIRHTTPConnectionInfo.link: TFHIRHTTPConnectionInfo; +begin + result := TFHIRHTTPConnectionInfo(inherited Link); + +end; + +function TFHIRHTTPConnectionInfo.log: String; +var + s : String; +begin + s := NameLockedToThread(FThreadId); + if s <> '' then + result := '-->! '+FClientIP+'/'+FRequest.RawHTTPCommand+': '+GetThreadInfoForThread(FThreadId)+', locks = '+s + else + result := FClientIP+'/'+FRequest.RawHTTPCommand+': '+GetThreadInfoForThread(FThreadId); +end; + { TFhirWebServer } @@ -269,10 +326,14 @@ constructor TFhirWebServer.Create(settings: TFHIRServerSettings; name: String); FSettings := settings; FClients := TFslList.Create; FStats := TStatusRecords.Create; + FLock := TFslLock.create('web.connnections'); + FLiveConnections := TFslList.create; End; destructor TFhirWebServer.Destroy; Begin + FLiveConnections.free; + FLock.free; FStats.free; FUsageServer.free; FEndPoints.free; @@ -345,6 +406,9 @@ procedure TFhirWebServer.loadConfiguration(ini : TFHIRServerConfigFile); if Common.AdminEmail = '' then raise EFHIRException.Create('An admin email is required'); + if (ini.web['robots.txt'].value <> '') then + FRobotsText := FileToString(ini.web['robots.txt'].value, TEncoding.UTF8); + if Common.StatedPort = 80 then txu := 'http://' + Common.Host else @@ -359,9 +423,10 @@ procedure TFhirWebServer.DoConnect(AContext: TIdContext); ci: TFHIRWebServerClientInfo; begin SetThreadStatus('Connecting'); - Common.Lock.Lock; + ci := TFHIRWebServerClientInfo.Create; + + Common.Lock.Lock('DoConnect'); try - ci := TFHIRWebServerClientInfo.Create; FClients.Add(ci); AContext.Data := ci; ci.Context := AContext; @@ -395,7 +460,7 @@ procedure TFhirWebServer.DoDisconnect(AContext: TIdContext); SetThreadStatus('Disconnecting'); if AContext.Data <> nil then begin - Common.Lock.Lock; + Common.Lock.Lock('DoDisconnect'); try FClients.Remove(TFHIRWebServerClientInfo(AContext.Data)); AContext.Data := nil; @@ -454,6 +519,32 @@ function TFhirWebServer.EndPoint(name: String): TFhirWebServerEndpoint; exit(t); end; +function TFhirWebServer.GetCurrentRequestReport: String; +var + conn : TFHIRHTTPConnectionInfo; +begin + FLock.lock('GetCurrentRequestReport'); + try + result := 'Current Web Requests: '+inttostr(FLiveConnections.count); + for conn in FLiveConnections do + result := result + '|' + conn.log; + finally + FLock.Unlock; + end; +end; + +function TFhirWebServer.GetCurrentRequestCount: integer; +var + conn : TFHIRHTTPConnectionInfo; +begin + FLock.lock('GetCurrentRequestCount'); + try + result := FLiveConnections.count; + finally + FLock.Unlock; + end; +end; + procedure TFhirWebServer.Start; // (active, threads: boolean); var s : String; @@ -501,6 +592,8 @@ procedure TFhirWebServer.StartServer; if Common.WorkingPort > 0 then begin FPlainServer := TFHIRHTTPServer.Create(Nil); + (FPlainServer as TFHIRHTTPServer).FServer := self; + FPlainServer.Name := 'http'; // FPlainServer.Scheduler := TIdSchedulerOfThreadPool.Create(nil); // TIdSchedulerOfThreadPool(FPlainServer.Scheduler).PoolSize := 20; // TIdSchedulerOfThreadPool(FPlainServer.Scheduler).RetainThreads := false; @@ -531,6 +624,8 @@ procedure TFhirWebServer.StartServer; If (FRootCertFile <> '') and (Not FileExists(FRootCertFile)) Then raise EIOException.Create('SSL Certificate "' + FRootCertFile + ' could not be found'); FSSLServer := TFHIRHTTPServer.Create(Nil); + (FSSLServer as TFHIRHTTPServer).FServer := self; + FSSLServer.Name := 'https'; // FSSLServer.Scheduler := TIdSchedulerOfThreadPool.Create(nil); // TIdSchedulerOfThreadPool(FSSLServer.Scheduler).PoolSize := 20; FSSLServer.ServerSoftware := 'Health Intersections FHIR Server'; @@ -583,14 +678,14 @@ procedure TFhirWebServer.StopServer; function TFhirWebServer.WebDump: String; var - b: TStringBuilder; + b: TFslStringBuilder; ci: TFHIRWebServerClientInfo; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.Append(''#13#10); b.Append(''#13#10); - Common.Lock.Lock; + Common.Lock.Lock('WebDump'); try for ci in FClients do begin @@ -675,7 +770,7 @@ procedure TFhirWebServer.logOutput(AContext: TIdContext; begin s := id + ' ' + StringPadLeft(inttostr(tt.total), ' ', 4) + ' ' + - Logging.MemoryStatus(false) + ' '; + Logging.MemoryStatus(false) +' '+Logging.CPU.usage+ ' #'+inttostr(GetCurrentRequestCount)+' '; if (FPlainServer <> nil) and (FSSLServer <> nil) then s := s + StringPadLeft(inttostr(FPlainServer.Contexts.count)+':'+inttostr(FSSLServer.Contexts.count), ' ', 5) + ' ' else if (FPlainServer <> nil) then @@ -707,146 +802,168 @@ procedure TFhirWebServer.PlainRequest(AContext: TIdContext; ok : boolean; epn, cid, ip : String; tt : TTimeTracker; + ci : TFHIRHTTPConnectionInfo; begin - // when running with a reverse proxy, it's easier to let the reverse proxy just use non-ssl upstream, and pass through the certificate details se we know SSL is being used - if (Common.SSLHeaderValue <> '') and (request.RawHeaders.Values['X-Client-SSL'] = Common.SSLHeaderValue) then - SecureRequest(aContext, request, response) - else - begin - ip := getClientIP(AContext, request); - tt := TTimeTracker.Create; + ci := TFHIRHTTPConnectionInfo.create(request, AContext); + try + FLock.lock('PlainRequest'); try - InterlockedIncrement(GCounterWebRequests); - SetThreadStatus('Processing '+request.Document); - epn := '??preq'; - summ := request.document; - MarkEntry(AContext, request, response); - try - id := FSettings.nextRequestId; - logRequest(false, id, ip, request); - response.CustomHeaders.Add('X-Request-Id: '+id); - if (request.CommandType = hcOption) then - begin - response.ResponseNo := 200; - response.ContentText := 'ok'; - response.CustomHeaders.Add('Access-Control-Allow-Credentials: true'); - response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); - response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); - response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); - if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then - response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); - epn := '--'; - summ := 'options?'; - end - else if FUsageServer.enabled and request.Document.StartsWith(FUsageServer.path) then - begin - response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); - // response.CustomHeaders.add('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); - response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); - response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); - // response.CustomHeaders.add('Access-Control-Expose-Headers: *'); - if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then - response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); - FUsageServer.HandleRequest(AContext, request, response); - epn := '--'; - summ := 'options?'; - end - else - begin - ok := false; - for ep in FEndPoints do - if request.Document.StartsWith(ep.PathWithSlash) then - begin - ok := true; - epn := ep.logId; - summ := ep.PlainRequest(AContext, ip, request, response, id, tt); - break; - end else if (request.Document = ep.PathNoSlash) then - begin - ok := true; - epn := ep.logId; - response.Redirect(request.Document+'/'); - summ := '--> redirect to '+request.Document+'/'; - break; - end; + FLiveConnections.add(ci.link); + finally + FLock.Unlock; + end; - if not ok then + // when running with a reverse proxy, it's easier to let the reverse proxy just use non-ssl upstream, and pass through the certificate details se we know SSL is being used + if (Common.SSLHeaderValue <> '') and (request.RawHeaders.Values['X-Client-SSL'] = Common.SSLHeaderValue) then + SecureRequest(aContext, request, response) + else + begin + ip := getClientIP(AContext, request); + ci.FClientIP := ip; + tt := TTimeTracker.Create; + try + InterlockedIncrement(GCounterWebRequests); + SetThreadStatus('Processing '+request.Document); + epn := '??preq'; + summ := request.document; + MarkEntry(AContext, request, response); + try + id := FSettings.nextRequestId; + logRequest(false, id, ip, request); + response.CustomHeaders.Add('X-Request-Id: '+id); + if (request.CommandType = hcOption) then begin - if request.Document = '/diagnostics' then - begin - epn := 'WS'; - summ := 'diagnostics'; - summ := ReturnDiagnostics(AContext, request, response, false, false) - end - else if request.Document = '/statistics' then - begin - epn := 'WS'; - summ := ReturnStatistics(AContext, request, response, false, false, true) - end - else if request.Document = '/stats' then - begin - epn := 'WS'; - summ := ReturnStatistics(AContext, request, response, false, false, false) - end - else if Common.SourceProvider.exists(SourceProvider.AltFile(request.Document, '/')) then - begin - summ := 'Static File '+request.Document; - epn := 'WS'; - ReturnSpecFile(response, request.Document, SourceProvider.AltFile(request.Document, '/'), false) - end - else if request.Document = '/' then - begin - epn := 'WS'; - summ := 'processed File '+request.Document; - ReturnProcessedFile(self, request, response, '/' + FHomePage, SourceProvider.AltFile('/' + FHomePage, ''), false); - end - else + response.ResponseNo := 200; + response.ContentText := 'ok'; + response.CustomHeaders.Add('Access-Control-Allow-Credentials: true'); + response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); + response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); + response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); + if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then + response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); + epn := '--'; + summ := 'options?'; + end + else if (request.Document = '/robots.txt') and (RobotsText <> '') then + begin + response.ResponseNo := 200; + response.ResponseText := 'OK'; + response.ContentText := RobotsText; + end + else if FUsageServer.enabled and request.Document.StartsWith(FUsageServer.path) then + begin + response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); + // response.CustomHeaders.add('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); + response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); + response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); + // response.CustomHeaders.add('Access-Control-Expose-Headers: *'); + if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then + response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); + FUsageServer.HandleRequest(AContext, request, response); + epn := '--'; + summ := 'options?'; + end + else + begin + ok := false; + for ep in FEndPoints do + if request.Document.StartsWith(ep.PathWithSlash) then + begin + ok := true; + epn := ep.logId; + summ := ep.PlainRequest(AContext, ip, request, response, id, tt); + break; + end else if (request.Document = ep.PathNoSlash) then + begin + ok := true; + epn := ep.logId; + response.Redirect(request.Document+'/'); + summ := '--> redirect to '+request.Document+'/'; + break; + end; + + if not ok then begin - response.ResponseNo := 404; - response.ContentText := 'Document ' + request.Document + ' not found'; - summ := 'Not Found: '+request.Document; - epn := 'XX'; + if request.Document = '/diagnostics' then + begin + epn := 'WS'; + summ := 'diagnostics'; + summ := ReturnDiagnostics(AContext, request, response, false, false) + end + else if request.Document = '/statistics' then + begin + epn := 'WS'; + summ := ReturnStatistics(AContext, request, response, false, false, true) + end + else if request.Document = '/stats' then + begin + epn := 'WS'; + summ := ReturnStatistics(AContext, request, response, false, false, false) + end + else if Common.SourceProvider.exists(SourceProvider.AltFile(request.Document, '/')) then + begin + summ := 'Static File '+request.Document; + epn := 'WS'; + ReturnSpecFile(response, request.Document, SourceProvider.AltFile(request.Document, '/'), false) + end + else if request.Document = '/' then + begin + epn := 'WS'; + summ := 'processed File '+request.Document; + ReturnProcessedFile(self, request, response, '/' + FHomePage, SourceProvider.AltFile('/' + FHomePage, ''), false); + end + else + begin + response.ResponseNo := 404; + response.ContentText := 'Document ' + request.Document + ' not found'; + summ := 'Not Found: '+request.Document; + epn := 'XX'; + end; end; end; + if (summ.contains('err:') and (not summ.contains('msg:') or UnderDebugger)) then + logCrash(false, id, ip, request, response); + + logResponse(id, response); + logOutput(AContext, request, response, id, tt, false, epn, summ); + response.CloseConnection := not PLAIN_KEEP_ALIVE; + finally + InterlockedDecrement(GCounterWebRequests); + MarkExit(AContext); + SetThreadStatus('Done'); end; - logResponse(id, response); - logOutput(AContext, request, response, id, tt, false, epn, summ); - response.CloseConnection := not PLAIN_KEEP_ALIVE; finally - InterlockedDecrement(GCounterWebRequests); - MarkExit(AContext); - SetThreadStatus('Done'); + tt.free; end; + end; + finally + FLock.lock('PlainRequest2'); + try + FLiveConnections.remove(ci); finally - tt.free; + FLock.Unlock; end; + ci.free; end; end; procedure TFhirWebServer.ProcessFile(sender: TObject; session: TFhirSession; named, path: String; secure: boolean; variables: TFslMap; var result: String); var - s, n: String; + s, n, h, t: String; + i : integer; begin s := SourceProvider.getSource(named); - s := s.Replace('[%id%]', Common.Name, [rfReplaceAll]); - s := s.Replace('[%specurl%]', 'http://hl7.org/fhir', [rfReplaceAll]); - s := s.Replace('[%web%]', WebDesc(secure), [rfReplaceAll]); - s := s.Replace('[%admin%]', Common.AdminEmail, [rfReplaceAll]); - s := s.Replace('[%logout%]', 'User: [n/a]', [rfReplaceAll]); - s := s.Replace('[%endpoints%]', endpointList, [rfReplaceAll]); - if Common.StatedPort = 80 then - s := s.Replace('[%host%]', Common.Host, [rfReplaceAll]) - else - s := s.Replace('[%host%]', Common.Host + ':' + inttostr(Common.StatedPort), [rfReplaceAll]); - - if Common.StatedSSLPort = 443 then - s := s.Replace('[%securehost%]', Common.Host, [rfReplaceAll]) - else - s := s.Replace('[%securehost%]', Common.Host + ':' + inttostr(Common.StatedSSLPort), [rfReplaceAll]); - if variables <> nil then - for n in variables.Keys do - s := s.Replace('[%' + n + '%]', variables[n].primitiveValue, [rfReplaceAll]); - s := s.Replace('[%ver%]', 'n/a', [rfReplaceAll]); + i := s.IndexOf('[%'); + while (i > -1) do + begin + h := s.subString(0, i); + s := s.subString(i); + i := s.indexOf('%]'); + t := s.subString(i+2); + n := s.Substring(2, i-2); + s := h + insertValue(n, secure, variables) + t; + i := s.IndexOf('[%'); + end; result := s; end; @@ -859,6 +976,8 @@ procedure TFhirWebServer.registerEndPoint(endPoint: TFHIRServerEndPoint); wep.OnReturnFile := ReturnProcessedFile; wep.OnReturnFileSource := ReturnFileSource; wep.OnProcessFile := ProcessFile; + if (endPoint is TStorageEndPoint) then + (endPoint as TStorageEndPoint).ServerContext.TerminologyServer.OnGetCurrentRequestCount := GetCurrentRequestCount; FStats.EndPointNames.add(endPoint.WebEndPoint.code); end; @@ -871,98 +990,126 @@ procedure TFhirWebServer.SecureRequest(AContext: TIdContext; ok : boolean; ep: TFhirWebServerEndpoint; epn, ip: String; + ci : TFHIRHTTPConnectionInfo; begin - if NoUserAuthentication then // we treat this as if it's a plain request - PlainRequest(AContext, request, response) - else - begin - ip := getClientIP(AContext, request); - tt := TTimeTracker.Create; + ci := TFHIRHTTPConnectionInfo.create(request, AContext); + try + FLock.lock('SecureRequest'); try - InterlockedIncrement(GCounterWebRequests); - cert := nil; // (AContext.Connection.IOHandler as TIdSSLIOHandlerSocketOpenSSL).SSLSocket.PeerCert; - epn := '??sreq'; - - SetThreadStatus('Processing '+request.Document); - MarkEntry(AContext, request, response); + FLiveConnections.add(ci.link); + finally + FLock.Unlock; + end; + if NoUserAuthentication then // we treat this as if it's a plain request + PlainRequest(AContext, request, response) + else + begin + ip := getClientIP(AContext, request); + ci.FClientIP := ip; + tt := TTimeTracker.Create; try - id := FSettings.nextRequestId; - logRequest(true, id, ip, request); - response.CustomHeaders.Add('X-Request-Id: '+id); - if isLogging then - response.CustomHeaders.Add('X-GDPR-Disclosure: All access to this server is logged internally for debugging purposes; your continued use of the API constitutes agreement to this use'); - - if (request.CommandType = hcOption) then - begin - response.ResponseNo := 200; - response.ContentText := 'ok'; - response.CustomHeaders.Add('Access-Control-Allow-Credentials: true'); - response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); - response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); - response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); - if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then - response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); - summ := 'options?'; - epn := '--'; - end - else - begin - ok := false; - for ep in FEndPoints do - if request.Document.StartsWith(ep.PathWithSlash) then - begin - ok := true; - epn := ep.logId; - summ := ep.SecureRequest(AContext, ip, request, response, cert, id, tt); - end - else if request.Document = ep.PathNoSlash then - begin - ok := true; - epn := ep.logid; - response.Redirect(ep.PathWithSlash); - summ := '--> redirect to '+request.Document+'/'; - end; - if not ok then + InterlockedIncrement(GCounterWebRequests); + cert := nil; // (AContext.Connection.IOHandler as TIdSSLIOHandlerSocketOpenSSL).SSLSocket.PeerCert; + epn := '??sreq'; + + SetThreadStatus('Processing '+request.Document); + MarkEntry(AContext, request, response); + try + id := FSettings.nextRequestId; + logRequest(true, id, ip, request); + response.CustomHeaders.Add('X-Request-Id: '+id); + if isLogging then + response.CustomHeaders.Add('X-GDPR-Disclosure: All access to this server is logged internally for debugging purposes; your continued use of the API constitutes agreement to this use'); + + if (request.CommandType = hcOption) then begin - if request.Document = '/diagnostics' then - begin - summ := ReturnDiagnostics(AContext, request, response, false, false); - epn := 'WS'; - end - else if SourceProvider.exists(SourceProvider.AltFile(request.Document, '/')) then - begin - summ := 'Static File '+request.Document; - epn := 'WS'; - ReturnSpecFile(response, request.Document, SourceProvider.AltFile(request.Document, '/'), false) - end - else if request.Document = '/' then - begin - summ := 'Processed File '+request.Document; - epn := 'WS'; - ReturnProcessedFile(self, request, response, '/' + FHomePage, SourceProvider.AltFile('/' + FHomePage, ''), true) - end - else + response.ResponseNo := 200; + response.ContentText := 'ok'; + response.CustomHeaders.Add('Access-Control-Allow-Credentials: true'); + response.CustomHeaders.Add('Access-Control-Allow-Origin: *'); + response.CustomHeaders.Add('Access-Control-Expose-Headers: Content-Location, Location'); + response.CustomHeaders.Add('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE'); + if request.RawHeaders.Values['Access-Control-Request-Headers'] <> '' then + response.CustomHeaders.Add('Access-Control-Allow-Headers: ' + request.RawHeaders.Values['Access-Control-Request-Headers']); + summ := 'options?'; + epn := '--'; + end + else if (request.Document = 'robots.txt') and (RobotsText <> '') then + begin + response.ResponseNo := 200; + response.ResponseText := 'OK'; + response.ContentText := RobotsText; + end + else + begin + ok := false; + for ep in FEndPoints do + if request.Document.StartsWith(ep.PathWithSlash) then + begin + ok := true; + epn := ep.logId; + summ := ep.SecureRequest(AContext, ip, request, response, cert, id, tt); + end + else if request.Document = ep.PathNoSlash then + begin + ok := true; + epn := ep.logid; + response.Redirect(ep.PathWithSlash); + summ := '--> redirect to '+request.Document+'/'; + end; + if not ok then begin - epn := 'XX'; - response.ResponseNo := 404; - response.ContentText := 'Document ' + request.Document + ' not found'; - summ := 'Not Found: '+request.Document; + if request.Document = '/diagnostics' then + begin + summ := ReturnDiagnostics(AContext, request, response, false, false); + epn := 'WS'; + end + else if SourceProvider.exists(SourceProvider.AltFile(request.Document, '/')) then + begin + summ := 'Static File '+request.Document; + epn := 'WS'; + ReturnSpecFile(response, request.Document, SourceProvider.AltFile(request.Document, '/'), false) + end + else if request.Document = '/' then + begin + summ := 'Processed File '+request.Document; + epn := 'WS'; + ReturnProcessedFile(self, request, response, '/' + FHomePage, SourceProvider.AltFile('/' + FHomePage, ''), true) + end + else + begin + epn := 'XX'; + response.ResponseNo := 404; + response.ContentText := 'Document ' + request.Document + ' not found'; + summ := 'Not Found: '+request.Document; + end; end; end; - end; - logResponse(id, response); - logOutput(AContext, request, response, id, tt, true, epn, summ); + logResponse(id, response); + logOutput(AContext, request, response, id, tt, true, epn, summ); + + if (summ.contains('err:') and not summ.contains('msg:') ) then + logCrash(false, id, ip, request, response); - response.CloseConnection := not SECURE_KEEP_ALIVE; + response.CloseConnection := not SECURE_KEEP_ALIVE; + finally + InterlockedDecrement(GCounterWebRequests); + MarkExit(AContext); + SetThreadStatus('Done'); + end; finally - InterlockedDecrement(GCounterWebRequests); - MarkExit(AContext); - SetThreadStatus('Done'); + tt.free; end; + end; + finally + FLock.lock('SecureRequest2'); + try + FLiveConnections.remove(ci); finally - tt.free; + FLock.Unlock; end; + ci.free; end; end; @@ -1113,13 +1260,100 @@ procedure TFhirWebServer.logResponse(id: String; resp: TIdHTTPResponseInfo); end; end; + +procedure TFhirWebServer.logCrash(secure : boolean; id, clientIP: String; request: TIdHTTPRequestInfo; resp: TIdHTTPResponseInfo); +var + package : TFslBytesBuilder; + b : TBytes; + folder : String; +begin + try + folder := FLogFolder; + if folder = '' then + folder := FilePath(['[tmp]', 'fhir-server-crash']); + if not FolderExists(folder) then + ForceFolder(folder); + Logging.log('Save crash request to '+FilePath([folder, 'crash-'+id+'.log'])); + + package := TFslBytesBuilder.Create; + try + package.addStringUtf8('-- Request '); + package.addStringUtf8(id); + package.addStringUtf8(' @ '); + package.addStringUtf8(TFslDateTime.makeUTC.toXML); + package.addStringUtf8(' from '); + package.addStringUtf8(clientIP); + if secure then + package.addStringUtf8(' (https)'); + package.addStringUtf8('------------------------------------------'#13#10); + package.addStringUtf8(request.RawHTTPCommand); + package.addStringUtf8(#13#10); + package.addStringUtf8(request.RawHeaders.Text); + if request.PostStream <> nil then + begin + package.addStringUtf8(#13#10); + request.PostStream.Position := 0; // it's almost certainly been read; + SetLength(b, request.PostStream.Size); + request.PostStream.Read(b[0], length(b)); + request.PostStream.Position := 0; + if isText(request.ContentType) and (request.ContentEncoding = '') then + package.Append(b) + else + package.addBase64(b); + package.addStringUtf8(#13#10); + end + else if request.ContentType = 'application/x-www-form-urlencoded' then + begin + package.addStringUtf8(#13#10); + package.addStringUtf8(request.UnparsedParams); + package.addStringUtf8(#13#10); + end; + + package.addStringUtf8('-- Response --------------------------------------------------'#13#10); + package.addStringUtf8(inttostr(resp.ResponseNo)+' '+resp.ResponseText); + package.addStringUtf8(#13#10); + package.addStringUtf8(resp.RawHeaders.Text); + if resp.ContentStream <> nil then + begin + package.addStringUtf8(#13#10); + SetLength(b, resp.ContentStream.Size); + if (length(b) > 0) then + resp.ContentStream.Read(b[0], length(b)); + resp.ContentStream.Position := 0; + if isText(resp.ContentType) and (resp.ContentEncoding = '') then + package.Append(b) + else + package.addBase64(b); + package.addStringUtf8(#13#10); + end + else if resp.ContentText <> '' then + begin + package.addStringUtf8(#13#10); + package.addStringUtf8(resp.ContentText); + package.addStringUtf8(#13#10); + end; + + BytesToFile(package.AsBytes, FilePath([folder, 'crash-'+id+'.log'])); + finally + package.free; + end; + except + on e : exception do + begin + Logging.log('Error writing crash log: '+e.Message); + raise; + end; + end; +end; + + procedure TFhirWebServer.MarkEntry(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo); var ci: TFHIRWebServerClientInfo; begin ci := TFHIRWebServerClientInfo(AContext.Data); - Common.Lock.Lock; + Common.Lock.Lock('MarkEntry'); try ci.Activity := request.Command + ' ' + request.Document + '?' + request.UnparsedParams; ci.Count := ci.Count + 1; @@ -1136,7 +1370,7 @@ procedure TFhirWebServer.MarkExit(AContext: TIdContext); begin ci := TFHIRWebServerClientInfo(AContext.Data); - Common.Lock.Lock; + Common.Lock.Lock('MarkExit'); try ci.Activity := ''; Common.Stats.totalFinish(GetTickCount64 - ci.Start); @@ -1183,7 +1417,9 @@ function TFhirWebServer.ReturnDiagnostics(AContext: TIdContext; request: TIdHTTP result := 'Diagnostics'; end; -function TFhirWebServer.ReturnStatistics(AContext: TIdContext; request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; ssl, secure, ashtml: boolean): String; +function TFhirWebServer.ReturnStatistics(AContext: TIdContext; + request: TIdHTTPRequestInfo; response: TIdHTTPResponseInfo; ssl, secure, + asHtml: boolean): String; begin response.Expires := Now + 1; if (asHtml) then @@ -1216,10 +1452,10 @@ procedure TFhirWebServer.ReturnFileSource(sender: TObject; request: TIdHTTPReque function TFhirWebServer.endpointList : String; var - b : TStringBuilder; + b : TFslStringBuilder; ep : TFhirWebServerEndpoint; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try b.append('
            '); if FEndPoints.Count = 0 then @@ -1274,6 +1510,10 @@ function TFhirWebServer.insertValue(n : String; secure: boolean; variables: TFs result := WebDesc(secure) else if n = 'admin' then result := Common.AdminEmail + else if n = 'server-ver' then + result := FHIR_CODE_FULL_VERSION + else if n = 'os' then + result := SERVER_OS else if n = 'logout' then result := 'User: [n/a]' else if n = 'endpoints' then @@ -1440,8 +1680,17 @@ function TFHIRPathServerObject.ToString: String; { TFHIRHTTPServer } procedure TFHIRHTTPServer.DoMaxConnectionsExceeded(AIOHandler: TIdIOHandler); +var + conn : TFHIRHTTPConnectionInfo; begin - logging.log('Max Connections Exceeded'); + logging.log('Max Web Connections Exceeded ('+inttostr(MaxConnections)+')'); + FServer.FLock.lock('DoMaxConnectionsExceeded'); + try + for conn in FServer.FLiveConnections do + logging.log(conn.log); + finally + FServer.FLock.Unlock; + end; end; End. diff --git a/server/web_source.pas b/server/web_source.pas index d4f2e347d..12af9d8e2 100644 --- a/server/web_source.pas +++ b/server/web_source.pas @@ -166,7 +166,7 @@ constructor TFHIRWebServerSourceZipProvider.Create(path: String); FZip := TFslMap.Create('web.source'); zip := TFslZipReader.Create; try - zip.Stream := TFslFile.Create(path, fmOpenRead); + zip.Stream := TFslFile.Create(path, fmOpenRead + fmShareDenyWrite); zip.ReadZip; Logging.log(inttostr(zip.Parts.Count)+' files loaded'); for i := 0 to zip.Parts.Count - 1 do diff --git a/server/xig_provider.pas b/server/xig_provider.pas index bf213dd51..367640b95 100644 --- a/server/xig_provider.pas +++ b/server/xig_provider.pas @@ -1,12 +1,41 @@ unit xig_provider; +{ +Copyright (c) 2011+, HL7 and Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + {$i fhir.inc} interface uses - Classes, SysUtils, ZStream, - fsl_base, fsl_lang, fsl_utilities, fsl_logging, + Classes, SysUtils, + {$IFDEF FPC} ZStream, {ELSE} Zlib, {$ENDIF} + fsl_base, fsl_lang, fsl_utilities, fsl_logging, fsl_i18n, fdb_manager, fhir_objects, fhir_factory, fhir_common, fhir_parser, fhir5_context; @@ -51,7 +80,7 @@ TXIGProvider = class (TFslObject) FLanguages : TIETFLanguageDefinitions; FDb : TFDBManager; public - constructor Create(languages : TIETFLanguageDefinitions; db : TFDBManager); + constructor Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); destructor Destroy; override; function link : TXIGProvider; overload; @@ -68,6 +97,7 @@ destructor TXIGResourceProxy.Destroy; inherited Destroy; end; +{$IFDEF FPC} procedure DecompressStream(src, dst: TStream); var ds: TDecompressionStream; @@ -111,6 +141,7 @@ function inflate(source:TBytes):TBytes; ss1.Free; end; end; +{$ENDIF} procedure TXIGResourceProxy.loadResource; var @@ -125,7 +156,7 @@ procedure TXIGResourceProxy.loadResource; conn.Prepare; conn.Execute; if not conn.FetchNext then - raise Exception.create('Unable to find resource key '+inttostr(FKey)); + raise EFslException.create('Unable to find resource key '+inttostr(FKey)); cnt := conn.ColBlob[1]; conn.terminate; conn.Release; @@ -137,9 +168,14 @@ procedure TXIGResourceProxy.loadResource; end; end; if (length(cnt) = 0) then - raise Exception.create('Unable to load content for resource key '+inttostr(FKey)); + raise EFslException.create('Unable to load content for resource key '+inttostr(FKey)); + {$IFDEF FPC} cnt := inflate(cnt); + {$ELSE} + raise EFslException.Create('Not Implemented Yet'); + {$ENDIF} + p := Factory.makeParser(Worker, ffJson, nil); try FResourceV := p.parseResource(cnt); @@ -170,7 +206,7 @@ function TXigLoader.makeResource: TFHIRResourceProxyV; var p : TXIGResourceProxy; begin - p := TXIGResourceProxy.create(factory.version, FConn.ColStringByName['ResourceTypeR5'], + p := TXIGResourceProxy.create('', factory.version, FConn.ColStringByName['ResourceTypeR5'], FConn.ColStringByName['id'], FConn.ColStringByName['Url'], FConn.ColStringByName['Version'], FConn.ColStringByName['Supplements'], FConn.ColStringByName['Content'], FConn.ColStringByName['ValueSet']); try @@ -191,7 +227,7 @@ procedure TXigLoader.SetFactory(AValue: TFHIRFactory); { TXIGProvider } -constructor TXIGProvider.Create(languages : TIETFLanguageDefinitions; db : TFDBManager); +constructor TXIGProvider.Create(languages : TIETFLanguageDefinitions; i18n : TI18nSupport; db : TFDBManager); begin inherited Create; FLanguages := languages; @@ -230,4 +266,5 @@ function TXIGProvider.startLoad(types: TStringArray): TXigLoader; end; end; -end. \ No newline at end of file +end. + diff --git a/server/remote_config.pas b/server/zero_config.pas similarity index 92% rename from server/remote_config.pas rename to server/zero_config.pas index ae0c2f037..d17f67cb0 100644 --- a/server/remote_config.pas +++ b/server/zero_config.pas @@ -1,576 +1,586 @@ -unit remote_config; - -{ -Copyright (c) 2001-2021, Health Intersections Pty Ltd (http://www.healthintersections.com.au) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of HL7 nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -} - -{$i fhir.inc} - -interface - -uses - SysUtils, Classes, IniFiles, - fsl_base, fsl_utilities, fsl_fetcher, fsl_logging, fsl_json, - fdb_manager, fdb_sqlite3, - fhir_objects, - server_config, database_installer, server_factory, server_constants, - endpoint_txsvr; - -function loadRemoteConfig(params : TCommandLineParameters; src : String; local : TIniFile) : String; - -implementation - -type - - { TEndPointInfo } - - TEndPointInfo = class (TFslObject) - private - FActive: boolean; - FVersion: TFHIRVersion; - FFilename: String; - FPackages: TStringList; - FKind: String; - public - constructor Create(version : TFHIRVersion); overload; - destructor Destroy; override; - - property active : boolean read FActive write FActive; - property kind : String read FKind write FKind; - property filename : String read FFilename write FFilename; - property version : TFHIRVersion read FVersion write FVersion; - property Packages : TStringList read FPackages; - - end; - - { TConfigurationBuilder } - - TConfigurationBuilder = class (TFslObject) - private - FParams : TCommandLineParameters; - FLastPct : Integer; - FJson : TJsonObject; - FFolder : String; - FUrl : String; - FFiles : TFslStringDictionary; - FEndPoints : TFslMap; - procedure DownloadProgress(sender : TObject; progress : integer); - procedure downloadFile(fn : String); overload; - procedure downloadFile(src, tgt : String); overload; - procedure DownloadFiles; - function fixDBPath(fn: String): String; - procedure readConfig; - procedure buildEndPoint(ep : TEndPointInfo); - procedure setupEndPoints; - procedure CreateDatabase(v : TFHIRVersion; fn : String); - function doUpgrade(v : TFHIRVersion; fn : String) : boolean; - procedure buildConfig(fn : String; local : TCustomIniFile); - procedure DownloadFileList(files: TJsonObject); - procedure seePackages(realm : TJsonObject); - public - constructor Create(params : TCommandLineParameters); - destructor Destroy; override; - end; - -constructor TConfigurationBuilder.Create(params : TCommandLineParameters); -begin - inherited Create; - FParams := params; - FFiles := TFslStringDictionary.Create; - FEndPoints := TFslMap.Create; - FEndPoints.Add('r2', TEndPointInfo.Create(fhirVersionRelease2)); - FEndPoints.Add('r3', TEndPointInfo.Create(fhirVersionRelease3)); - FEndPoints.Add('r4', TEndPointInfo.Create(fhirVersionRelease4)); - FEndPoints.Add('r5', TEndPointInfo.Create(fhirVersionRelease5)); - FEndPoints.defaultValue := nil; -end; - -destructor TConfigurationBuilder.Destroy; -begin - FParams.free; - FEndPoints.free; - FFiles.free; - FJson.free; - inherited; -end; - -function TConfigurationBuilder.doUpgrade(v : TFHIRVersion; fn : String) : boolean; -var - sql : TFDBSQLiteManager; - conn : TFDBConnection; - installer : TFHIRDatabaseInstaller; -begin - result := false; - sql := TFDBSQLiteManager.Create('cfg', fn, true); - try - conn := sql.GetConnection('install'); - try - installer := TFHIRDatabaseInstaller.Create(conn, makeTxFactory(v), makeTxServerFactory(v)); - try - try - installer.Upgrade; - result := true; - except - on e : Exception do - Logging.log('Unable to upgrade existing database '+fn+': '+e.message); - end; - finally - installer.free; - end; - conn.Release; - except - on e : exception do - begin - conn.Error(e); - end; - end; - finally - sql.free; - end; -end; - -procedure TConfigurationBuilder.CreateDatabase(v : TFHIRVersion; fn : String); -var - sql : TFDBSQLiteManager; - conn : TFDBConnection; - installer : TFHIRDatabaseInstaller; -begin - sql := TFDBSQLiteManager.Create('cfg', fn, true); - try - conn := sql.GetConnection('install'); - try - installer := TFHIRDatabaseInstaller.Create(conn, makeTxFactory(v), makeTxServerFactory(v)); - try - installer.InstallTerminologyServer; - finally - installer.free; - end; - conn.Release; - except - on e : exception do - begin - conn.Error(e); - end; - end; - finally - sql.free; - end; -end; - -function TConfigurationBuilder.fixDBPath(fn : String) : String; -begin - if (fn.StartsWith('http:') or fn.StartsWith('https:')) then - begin - result := FilePath([FFolder, fn.Substring(fn.LastIndexOf('/')+1)]); - downloadFile(fn, result); - end - else if (ExtractFilePath(fn) = '') then - result := FilePath([FFolder, fn]) - else - result := fn; -end; - -function def(s1, s2, s3 : String) : String; -begin - if (s1 <> '') then - result := s1 - else if (s2 <> '') then - result := s2 - else - result := s3; -end; - -procedure TConfigurationBuilder.buildConfig(fn: String; local : TCustomIniFile); -var - cfg : TFHIRServerConfigFile; - n, v : String; - rn : integer; - sct : TFHIRServerConfigSection; - ep, o : TJsonObject; - lwi : String; -begin - rn := 1; - if FileExists(fn) then - begin - cfg := TFHIRServerConfigFile.Create(fn); - try - rn := StrToIntDef(cfg.section['service']['runNumber'].value, 1); - finally - cfg.free; - end; - DeleteFile(fn); - end; - - cfg := TFHIRServerConfigFile.Create(fn); - try - cfg.section['service']['runNumber'].value := inttostr(rn); - - cfg.web['host'].value := def(local.ReadString('web', 'host', ''), cfg.web['host'].value, 'localhost'); - cfg.web['http'].value := def(local.ReadString('web', 'http', ''), cfg.web['http'].value, '80'); - cfg.web['https'].value := def(local.ReadString('web', 'https', ''), cfg.web['https'].value, ''); - cfg.web['rproxy-http'].value := def(local.ReadString('web', 'rproxy-http', ''), cfg.web['rproxy-http'].value, ''); - cfg.web['rproxy-https'].value := def(local.ReadString('web', 'rproxy-https', ''), cfg.web['rproxy-https'].value, ''); - cfg.web['rproxy-cert-header'].value := def(local.ReadString('web', 'rproxy-cert-header', ''), cfg.web['rproxy-cert-header'].value, ''); - cfg.web['rproxy-ssl-value'].value := def(local.ReadString('web', 'rproxy-ssl-value', ''), cfg.web['rproxy-ssl-value'].value, ''); - cfg.web['certname'].value := def(local.ReadString('web', 'certname', ''), cfg.web['certname'].value, ''); - cfg.web['cacertname'].value := def(local.ReadString('web', 'cacertname', ''), cfg.web['cacertname'].value, ''); - cfg.web['certkey'].value := def(local.ReadString('web', 'certkey', ''), cfg.web['certkey'].value, ''); - cfg.web['password'].value := def(local.ReadString('web', 'password', ''), cfg.web['password'].value, ''); - cfg.web['telnet-password'].value := def(local.ReadString('config', 'telnet-pword', NewGuidId), cfg.web['telnet-password'].value, ''); - cfg.admin['log-folder'].value := def(local.ReadString('web', 'logFolder', ''), cfg.admin['log-folder'].value, ''); - cfg.admin['email'].value := def(local.ReadString('config', 'email', ''), cfg.admin['email'].value, 'noone@fhir.org'); - cfg.admin['ownername'].value := def(local.ReadString('config', 'user', ''), cfg.admin['ownername'].value, 'Local User'); - cfg.service['max-memory'].value := def(local.ReadString('config', 'max-memory', ''), cfg.service['max-memory'].value, '0'); - cfg.service['cache-time'].value := def(local.ReadString('config', 'cache-time', ''), cfg.service['cache-time'].value, inttostr(DEFAULT_DWELL_TIME_MIN)); - - cfg.web['http-max-conn'].value := '50'; - cfg.web['http-cache-time'].value := '1000'; - cfg.web['plain-mode'].value := 'false'; - cfg.web['caching'].value := 'true'; - cfg.service['langfile'].value := partnerFile('lang.dat'); - cfg.service['package-cache'].value := ExtractFilePath(fn); - cfg.admin['scim-salt'].value := NewGuidId; - - for n in FFiles.Keys do - begin - sct := cfg.section['terminologies'].section[PathTitle(n)]; - sct['type'].value := FFiles[n]; - sct['active'].value := 'true'; - if StringArrayExists(['rxnorm', 'ndc', 'unii', 'cpt', 'omop', 'xig'], FFiles[n]) then - begin - sct['db-type'].value := 'sqlite'; - if (FFiles[n] = 'cpt') and (local.ValueExists('cpt', 'local-source')) then - sct['db-file'].value := local.ReadString('cpt', 'local-source', '') - else if (n.startsWith('file:')) then - sct['db-file'].value := FilePath([FFolder, extractFileName(n.subString(5))]) - else - sct['db-file'].value := FilePath([FFolder, n]); - sct['db-auto-create'].value := 'false'; - end - else - begin - sct['source'].value := FilePath([FFolder, n]); - if (FFiles[n] = 'snomed!') then - begin - sct['type'].value := 'snomed'; - sct['default'].value := 'true'; - end; - end; - end; - - for n in FEndPoints.Keys do - begin - if (FEndPoints[n].active) and (FEndPoints[n].Packages.Count > 0) then - begin - buildEndPoint(FEndPoints[n]); - sct := cfg.section['endpoints'].section[n]; - sct['type'].value := 'terminology'; - sct['path'].value := '/'+n; - sct['version'].value := n; - sct['active'].value := 'true'; - sct['security'].value := 'open'; - sct['db-type'].value := 'sqlite'; - sct['db-file'].value := FEndPoints[n].filename; - sct['db-auto-create'].value := 'false'; - sct['packages'].values.Assign(FEndPoints[n].Packages); - end; - end; - - ep := FJson.forceObj['endpoints']; - for n in ep.properties.keys do - begin - o := ep.obj[n]; - sct := cfg.section['endpoints'].section[n]; - sct['type'].value := o.str['type']; - sct['path'].value := o.str['path']; - sct['active'].value := 'true'; - sct['db-type'].value := o.str['db-type']; - sct['db-source'].value := o.str['db-file']; - sct['db-file'].value := fixDbPath(o.str['db-file']); - sct['db-auto-create'].value := o.str['db-auto-create']; - if o.has('folder') then - sct['folder'].value := o.str['folder'].Replace('{local}', FFolder); - end; - - cfg.Save; - finally - cfg.free; - end; -end; - -procedure TConfigurationBuilder.buildEndPoint(ep : TEndPointInfo); -var - fn : String; -begin - fn := FilePath([FFolder, 'endpoint-r'+CODES_FHIR_GENERATED_PUBLICATION[ep.version]+'.db']); - ep.filename := fn; - if not FileExists(fn) then - CreateDatabase(ep.version, fn) - else if not doUpgrade(ep.version, fn) then - begin - Logging.log('Rebuilding database. Closure tables will be lost'); - CreateDatabase(ep.version, fn); - end; -end; - -procedure TConfigurationBuilder.setupEndPoints; -var - v, vl : String; - ep : TEndPointInfo; -begin - if not FParams.get('version', vl) then - vl := '*'; - if (vl = '*') then - vl := '2,3,4,5'; - - for v in vl.Split([';', ',']) do - begin - ep := FEndPoints['r'+v]; - if (ep = nil) then - raise EFslException.Create('Version "'+v+'" is unknown') - else - ep.active := true; - end; -end; - -procedure TConfigurationBuilder.DownloadFileList(files : TJsonObject); -var - fn : String; -begin - for fn in files.properties.Keys do - begin - FFiles.Add(fn, (files.node[fn] as TJsonString).value); - downloadFile(fn); - end; -end; - -procedure TConfigurationBuilder.DownloadFiles; -var - content, realm, files : TJsonObject; - r, i : String; -begin -// Logging.log('Realm: uv'); - content := FJson.forceObj['content']; - realm := content.forceObj['uv']; - SeePackages(realm); - files := realm.forceObj['files']; - DownloadFileList(files); - - if not FParams.get('realm', r) then - r := '*'; - - if (r = '*') then - begin - for i in content.properties.Keys do - if i <> 'uv' then - begin -// Logging.log('Realm: '+i); - realm := content.forceObj[i]; - SeePackages(realm); - files := realm.forceObj['files']; - DownloadFileList(files); - end; - end - else - begin - for i in r.split([';', ',']) do - begin -// Logging.log('Realm: '+i); - realm := content.forceObj[i]; - SeePackages(realm); - files := realm.forceObj['files']; - DownloadFileList(files); - end; - end; -end; - -procedure TConfigurationBuilder.DownloadProgress(sender: TObject; progress: integer); -begin - if progress >= FLastPct + 2 then - begin - FLastPct := progress; - Logging.continue('.'); - end; -end; - -procedure TConfigurationBuilder.readConfig; -var - f : TFileStream; - src : String; -begin - src := URLPath([FUrl, 'config.json']); - Logging.log('Read Zero Config from '+src); - if (src.StartsWith('file:')) then - FJson := TJSONParser.ParseFile(src.Substring(5)) - else - FJson := TInternetFetcher.fetchJson(src+'?timestamp='+TFslDateTime.makeUTC.toHL7); - f := TFileStream.Create(FilePath([FFolder, 'config.json']), fmCreate); - try - TJSONWriter.writeObject(f, FJson, true); - finally - f.free; - end; -end; - -procedure TConfigurationBuilder.seePackages(realm: TJsonObject); -var - i : integer; - pck : TJsonObject; -begin - pck := realm.forceObj['packages']; - - for i := 0 to pck.forceArr['r5'].Count - 1 do - FEndPoints['r5'].Packages.Add(pck.arr['r5'].Value[i]); - - for i := 0 to pck.forceArr['r4'].Count - 1 do - FEndPoints['r4'].Packages.Add(pck.arr['r4'].Value[i]); - - for i := 0 to pck.forceArr['r3'].Count - 1 do - FEndPoints['r3'].Packages.Add(pck.arr['r3'].Value[i]); - - for i := 0 to pck.forceArr['r2'].Count - 1 do - FEndPoints['r2'].Packages.Add(pck.arr['r2'].Value[i]); -end; - -procedure TConfigurationBuilder.downloadFile(fn : String); -var - src, tgt : String; -begin - if (fn.StartsWith('file:')) then - begin - src := fn; - tgt := FilePath([FFolder, extractFileName(fn)]); - end - else - begin - src := UrlPath([FUrl, fn]); - tgt := FilePath([FFolder, fn]); - end; - downloadFile(src, tgt); -end; - -procedure TConfigurationBuilder.downloadFile(src, tgt : String); -var - fetcher : TInternetFetcher; - start : TDateTime; -begin - if (src.StartsWith('file:')) then - begin - if not (FileExists(tgt)) then - begin - Logging.start('Copy '+src); - BytesToFile(FileToBytes(src.Substring(5)), tgt); - Logging.finish(' Done'); - end; -// else -// Logging.log(fn+' already copied') - end - else - begin - FLastPct := 0; - if not FileExists(tgt) then - begin - Logging.start('Download '+src); - try - start := now; - fetcher := TInternetFetcher.Create; - try - fetcher.OnProgress := DownloadProgress; - fetcher.URL := src; - fetcher.Fetch; - fetcher.Buffer.SaveToFileName(tgt); - Logging.finish(' Done ('+DescribeBytes(fetcher.buffer.size)+', '+DescribePeriod(now - start)+')'); - finally - fetcher.free; - end; - except - on e : Exception do - begin - Logging.finish(' '+e.Message); - raise; - end; - end; - //else - // Logging.log(fn+' already downloaded') - end; - end; -end; - -function loadRemoteConfig(params : TCommandLineParameters; src : String; local : TIniFile) : String; -var - cb : TConfigurationBuilder; - dir : String; -begin - dir := local.ReadString('config', 'local', UserFolder); - - result := FilePath([dir, 'fhir-server', 'fhir-server-config.cfg']); - try - cb := TConfigurationBuilder.Create(params.link); - try - cb.FUrl := src; - cb.FFolder := ExtractFilePath(result); - if not FolderExists(cb.FFolder) then - ForceDirectories(cb.FFolder); - cb.readConfig; - Logging.log('Local Config in '+cb.FFolder); - cb.DownloadFiles; - cb.setupEndPoints; - cb.buildConfig(result, local); - finally - cb.free; - end; - except - on e : Exception do - begin - Logging.log('Zero Configuration Process failed: '+e.message); - if FileExists(result) then - Logging.log('Continuing on last successful configuration') - else - begin - Logging.log('First time, so can''t continue.'); - raise; - end; - end; - end; -end; - -{ TEndPointInfo } - -constructor TEndPointInfo.Create(version : TFHIRVersion); -begin - inherited Create; - FPackages := TStringList.Create; - FVersion := version; -end; - -destructor TEndPointInfo.Destroy; -begin - FPackages.free; - inherited; -end; - -end. +unit zero_config; + +{ +Copyright (c) 2001-2021, Health Intersections Pty Ltd (http://www.healthintersections.com.au) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +} + +{$i fhir.inc} + +interface + +uses + SysUtils, Classes, IniFiles, + fsl_base, fsl_utilities, fsl_fetcher, fsl_logging, fsl_json, fsl_threads, + fdb_manager, fdb_sqlite3, + fhir_objects, + server_config, database_installer, server_factory, server_constants, + endpoint_txsvr; + +function loadRemoteConfig(params : TCommandLineParameters; src : String; local : TIniFile) : String; + +implementation + +type + + { TEndPointInfo } + + TEndPointInfo = class (TFslObject) + private + FActive: boolean; + FMode: String; + FVersion: TFHIRVersion; + FFilename: String; + FPackages: TStringList; + FKind: String; + public + constructor Create(version : TFHIRVersion); overload; + destructor Destroy; override; + + property active : boolean read FActive write FActive; + property kind : String read FKind write FKind; + property mode : String read FMode write FMode; + property filename : String read FFilename write FFilename; + property version : TFHIRVersion read FVersion write FVersion; + property Packages : TStringList read FPackages; + + end; + + { TConfigurationBuilder } + + TConfigurationBuilder = class (TFslObject) + private + FParams : TCommandLineParameters; + FLastPct : Integer; + FJson : TJsonObject; + FFolder : String; + FUrl : String; + FFiles : TFslStringDictionary; + FEndPoints : TFslMap; + FMode : String; + procedure DownloadProgress(sender : TObject; progress : integer); + procedure downloadFile(fn : String); overload; + procedure downloadFile(src, tgt : String); overload; + procedure DownloadFiles; + function fixDBPath(fn: String): String; + procedure readConfig; + procedure buildEndPoint(ep : TEndPointInfo); + procedure setupEndPoints; + procedure CreateDatabase(v : TFHIRVersion; fn : String); + function doUpgrade(v : TFHIRVersion; fn : String) : boolean; + procedure buildConfig(fn : String; local : TCustomIniFile); + procedure DownloadFileList(files: TJsonObject); + procedure seePackages(realm : TJsonObject); + public + constructor Create(params : TCommandLineParameters); + destructor Destroy; override; + end; + +constructor TConfigurationBuilder.Create(params : TCommandLineParameters); +begin + inherited Create; + FParams := params; + FFiles := TFslStringDictionary.Create; + FEndPoints := TFslMap.Create; + FEndPoints.Add('r2', TEndPointInfo.Create(fhirVersionRelease2)); + FEndPoints.Add('r3', TEndPointInfo.Create(fhirVersionRelease3)); + FEndPoints.Add('r4', TEndPointInfo.Create(fhirVersionRelease4)); + FEndPoints.Add('r5', TEndPointInfo.Create(fhirVersionRelease5)); + FEndPoints.defaultValue := nil; +end; + +destructor TConfigurationBuilder.Destroy; +begin + FParams.free; + FEndPoints.free; + FFiles.free; + FJson.free; + inherited; +end; + +function TConfigurationBuilder.doUpgrade(v : TFHIRVersion; fn : String) : boolean; +var + sql : TFDBSQLiteManager; + conn : TFDBConnection; + installer : TFHIRDatabaseInstaller; +begin + result := false; + sql := TFDBSQLiteManager.Create('cfg', fn, false, true); + try + conn := sql.GetConnection('install'); + try + installer := TFHIRDatabaseInstaller.Create(conn, makeTxFactory(v), makeTxServerFactory(v)); + try + try + installer.Upgrade; + result := true; + except + on e : Exception do + Logging.log('Unable to upgrade existing database '+fn+': '+e.message); + end; + finally + installer.free; + end; + conn.Release; + except + on e : exception do + begin + conn.Error(e); + end; + end; + finally + sql.free; + end; +end; + +procedure TConfigurationBuilder.CreateDatabase(v : TFHIRVersion; fn : String); +var + sql : TFDBSQLiteManager; + conn : TFDBConnection; + installer : TFHIRDatabaseInstaller; +begin + sql := TFDBSQLiteManager.Create('cfg', fn, false, true); + try + conn := sql.GetConnection('install'); + try + installer := TFHIRDatabaseInstaller.Create(conn, makeTxFactory(v), makeTxServerFactory(v)); + try + installer.InstallTerminologyServer; + finally + installer.free; + end; + conn.Release; + except + on e : exception do + begin + conn.Error(e); + end; + end; + finally + sql.free; + end; +end; + +function TConfigurationBuilder.fixDBPath(fn : String) : String; +begin + if (fn.StartsWith('http:') or fn.StartsWith('https:')) then + begin + result := FilePath([FFolder, fn.Substring(fn.LastIndexOf('/')+1)]); + downloadFile(fn, result); + end + else if (ExtractFilePath(fn) = '') then + result := FilePath([FFolder, fn]) + else + result := fn; +end; + +function def(s1, s2, s3 : String) : String; +begin + if (s1 <> '') then + result := s1 + else if (s2 <> '') then + result := s2 + else + result := s3; +end; + +procedure TConfigurationBuilder.buildConfig(fn: String; local : TCustomIniFile); +var + cfg : TFHIRServerConfigFile; + n, v : String; + rn : integer; + sct : TFHIRServerConfigSection; + ep, o : TJsonObject; + lwi, mode : String; +begin + rn := 1; + if FileExists(fn) then + begin + cfg := TFHIRServerConfigFile.Create(fn); + try + rn := StrToIntDef(cfg.section['service']['runNumber'].value, 1); + finally + cfg.free; + end; + DeleteFile(fn); + end; + + cfg := TFHIRServerConfigFile.Create(fn); + try + cfg.section['service']['runNumber'].value := inttostr(rn); + + cfg.web['host'].value := def(local.ReadString('web', 'host', ''), cfg.web['host'].value, 'localhost'); + cfg.web['http'].value := def(local.ReadString('web', 'http', ''), cfg.web['http'].value, '80'); + cfg.web['https'].value := def(local.ReadString('web', 'https', ''), cfg.web['https'].value, ''); + cfg.web['rproxy-http'].value := def(local.ReadString('web', 'rproxy-http', ''), cfg.web['rproxy-http'].value, ''); + cfg.web['rproxy-https'].value := def(local.ReadString('web', 'rproxy-https', ''), cfg.web['rproxy-https'].value, ''); + cfg.web['rproxy-cert-header'].value := def(local.ReadString('web', 'rproxy-cert-header', ''), cfg.web['rproxy-cert-header'].value, ''); + cfg.web['rproxy-ssl-value'].value := def(local.ReadString('web', 'rproxy-ssl-value', ''), cfg.web['rproxy-ssl-value'].value, ''); + cfg.web['certname'].value := def(local.ReadString('web', 'certname', ''), cfg.web['certname'].value, ''); + cfg.web['cacertname'].value := def(local.ReadString('web', 'cacertname', ''), cfg.web['cacertname'].value, ''); + cfg.web['certkey'].value := def(local.ReadString('web', 'certkey', ''), cfg.web['certkey'].value, ''); + cfg.web['password'].value := def(local.ReadString('web', 'password', ''), cfg.web['password'].value, ''); + cfg.web['telnet-password'].value := def(local.ReadString('config', 'telnet-pword', NewGuidId), cfg.web['telnet-password'].value, ''); + cfg.web['robots.txt'].value := def(local.ReadString('web', 'robots.txt', ''), cfg.web['robots.txt'].value, ''); + cfg.admin['log-folder'].value := def(local.ReadString('web', 'logFolder', ''), cfg.admin['log-folder'].value, ''); + cfg.admin['email'].value := def(local.ReadString('config', 'email', ''), cfg.admin['email'].value, 'noone@fhir.org'); + cfg.admin['ownername'].value := def(local.ReadString('config', 'user', ''), cfg.admin['ownername'].value, 'Local User'); + cfg.service['max-memory'].value := def(local.ReadString('config', 'max-memory', ''), cfg.service['max-memory'].value, '0'); + cfg.service['cache-time'].value := def(local.ReadString('config', 'cache-time', ''), cfg.service['cache-time'].value, inttostr(DEFAULT_DWELL_TIME_MIN)); + + cfg.web['http-max-conn'].value := '50'; + cfg.web['http-cache-time'].value := '1000'; + cfg.web['plain-mode'].value := 'false'; + cfg.web['caching'].value := 'true'; + cfg.service['langfile'].value := partnerFile('lang.dat'); + cfg.service['package-cache'].value := ExtractFilePath(fn); + cfg.admin['scim-salt'].value := NewGuidId; + + for n in FFiles.Keys do + begin + sct := cfg.section['terminologies'].section[PathTitle(n)]; + sct['type'].value := FFiles[n]; + sct['active'].value := 'true'; + if StringArrayExists(['rxnorm', 'ndc', 'unii', 'cpt', 'omop', 'xig'], FFiles[n]) then + begin + sct['db-type'].value := 'sqlite'; + if (FFiles[n] = 'cpt') and (local.ValueExists('cpt', 'local-source')) then + sct['db-file'].value := local.ReadString('cpt', 'local-source', '') + else if (n.startsWith('file:')) then + sct['db-file'].value := FilePath([FFolder, extractFileName(n.subString(5))]) + else + sct['db-file'].value := FilePath([FFolder, n]); + sct['db-auto-create'].value := 'false'; + end + else + begin + sct['source'].value := FilePath([FFolder, n]); + if (FFiles[n] = 'snomed!') then + begin + sct['type'].value := 'snomed'; + sct['default'].value := 'true'; + end; + end; + end; + + for n in FEndPoints.Keys do + begin + if (FEndPoints[n].active) and (FEndPoints[n].Packages.Count > 0) then + begin + buildEndPoint(FEndPoints[n]); + sct := cfg.section['endpoints'].section[n]; + sct['type'].value := 'terminology'; + sct['path'].value := '/'+n; + sct['version'].value := n; + sct['active'].value := 'true'; + sct['security'].value := 'open'; + sct['db-type'].value := 'sqlite'; + sct['db-file'].value := FEndPoints[n].filename; + sct['db-auto-create'].value := 'false'; + sct['packages'].values.Assign(FEndPoints[n].Packages); + end; + end; + + ep := FJson.forceObj['endpoints']; + for n in ep.properties.keys do + begin + o := ep.obj[n]; + mode := o.str['mode']; + if (mode = '') or (mode = FMode) then + begin + sct := cfg.section['endpoints'].section[n]; + sct['type'].value := o.str['type']; + sct['path'].value := o.str['path']; + sct['active'].value := 'true'; + sct['db-type'].value := o.str['db-type']; + sct['db-source'].value := o.str['db-file']; + sct['db-file'].value := fixDbPath(o.str['db-file']); + sct['db-auto-create'].value := o.str['db-auto-create']; + if o.has('folder') then + sct['folder'].value := o.str['folder'].Replace('{local}', FFolder); + end; + end; + + cfg.Save; + finally + cfg.free; + end; +end; + +procedure TConfigurationBuilder.buildEndPoint(ep : TEndPointInfo); +var + fn : String; +begin + fn := FilePath([FFolder, 'endpoint-r'+CODES_FHIR_GENERATED_PUBLICATION[ep.version]+'.db']); + ep.filename := fn; + if not FileExists(fn) then + CreateDatabase(ep.version, fn) + else if not doUpgrade(ep.version, fn) then + begin + Logging.log('Rebuilding database. Closure tables will be lost'); + CreateDatabase(ep.version, fn); + end; +end; + +procedure TConfigurationBuilder.setupEndPoints; +var + v, vl : String; + ep : TEndPointInfo; +begin + if not FParams.get('version', vl) then + vl := '*'; + if (vl = '*') then + vl := '2,3,4,5'; + + for v in vl.Split([';', ',']) do + begin + ep := FEndPoints['r'+v]; + if (ep = nil) then + raise EFslException.Create('Version "'+v+'" is unknown') + else + ep.active := true; + end; +end; + +procedure TConfigurationBuilder.DownloadFileList(files : TJsonObject); +var + fn : String; +begin + for fn in files.properties.Keys do + begin + FFiles.Add(fn, (files.node[fn] as TJsonString).value); + downloadFile(fn); + end; +end; + +procedure TConfigurationBuilder.DownloadFiles; +var + content, realm, files : TJsonObject; + r, i : String; +begin +// Logging.log('Realm: uv'); + content := FJson.forceObj['content']; + realm := content.forceObj['uv']; + SeePackages(realm); + files := realm.forceObj['files']; + DownloadFileList(files); + + if not FParams.get('realm', r) then + r := '*'; + + if (r = '*') then + begin + for i in content.properties.Keys do + if i <> 'uv' then + begin +// Logging.log('Realm: '+i); + realm := content.forceObj[i]; + SeePackages(realm); + files := realm.forceObj['files']; + DownloadFileList(files); + end; + end + else + begin + for i in r.split([';', ',']) do + begin +// Logging.log('Realm: '+i); + realm := content.forceObj[i]; + SeePackages(realm); + files := realm.forceObj['files']; + DownloadFileList(files); + end; + end; +end; + +procedure TConfigurationBuilder.DownloadProgress(sender: TObject; progress: integer); +begin + if progress >= FLastPct + 2 then + begin + FLastPct := progress; + Logging.continue('.'); + end; +end; + +procedure TConfigurationBuilder.readConfig; +var + f : TFileStream; + src : String; +begin + src := URLPath([FUrl, 'config.json']); + Logging.log('Read Zero Config from '+src); + if (src.StartsWith('file:')) then + FJson := TJSONParser.ParseFile(src.Substring(5)) + else + FJson := TInternetFetcher.fetchJson(src+'?timestamp='+TFslDateTime.makeUTC.toHL7); + f := TFileStream.Create(FilePath([FFolder, 'config.json']), fmCreate); + try + TJSONWriter.writeObject(f, FJson, true); + finally + f.free; + end; +end; + +procedure TConfigurationBuilder.seePackages(realm: TJsonObject); +var + i : integer; + pck : TJsonObject; +begin + pck := realm.forceObj['packages']; + + for i := 0 to pck.forceArr['r5'].Count - 1 do + FEndPoints['r5'].Packages.Add(pck.arr['r5'].Value[i]); + + for i := 0 to pck.forceArr['r4'].Count - 1 do + FEndPoints['r4'].Packages.Add(pck.arr['r4'].Value[i]); + + for i := 0 to pck.forceArr['r3'].Count - 1 do + FEndPoints['r3'].Packages.Add(pck.arr['r3'].Value[i]); + + for i := 0 to pck.forceArr['r2'].Count - 1 do + FEndPoints['r2'].Packages.Add(pck.arr['r2'].Value[i]); +end; + +procedure TConfigurationBuilder.downloadFile(fn : String); +var + src, tgt : String; +begin + if (fn.StartsWith('file:')) then + begin + src := fn; + tgt := FilePath([FFolder, extractFileName(fn)]); + end + else + begin + src := UrlPath([FUrl, fn]); + tgt := FilePath([FFolder, fn]); + end; + downloadFile(src, tgt); +end; + +procedure TConfigurationBuilder.downloadFile(src, tgt : String); +var + fetcher : TInternetFetcher; + start : TDateTime; +begin + if (src.StartsWith('file:')) then + begin + if not (FileExists(tgt)) then + begin + Logging.start('Copy '+src); + BytesToFile(FileToBytes(src.Substring(5)), tgt); + Logging.finish(' Done'); + end; +// else +// Logging.log(fn+' already copied') + end + else + begin + FLastPct := 0; + if not FileExists(tgt) then + begin + Logging.start('Download '+src); + try + start := now; + fetcher := TInternetFetcher.Create; + try + fetcher.OnProgress := DownloadProgress; + fetcher.URL := src; + fetcher.Fetch; + fetcher.Buffer.SaveToFileName(tgt); + Logging.finish(' Done ('+DescribeBytes(fetcher.buffer.size)+', '+DescribePeriod(now - start)+')'); + finally + fetcher.free; + end; + except + on e : Exception do + begin + Logging.finish(' '+e.Message); + raise; + end; + end; + //else + // Logging.log(fn+' already downloaded') + end; + end; +end; + +function loadRemoteConfig(params : TCommandLineParameters; src : String; local : TIniFile) : String; +var + cb : TConfigurationBuilder; + dir : String; +begin + SetThreadStatus('loadRemoteConfig'); + dir := local.ReadString('config', 'local', UserFolder); + + result := FilePath([dir, 'fhir-server', 'fhir-server-config.cfg']); + try + cb := TConfigurationBuilder.Create(params.link); + try + cb.FMode := local.ReadString('config', 'mode', ''); + cb.FUrl := src; + cb.FFolder := ExtractFilePath(result); + if not FolderExists(cb.FFolder) then + ForceDirectories(cb.FFolder); + cb.readConfig; + Logging.log('Local Config in '+cb.FFolder); + cb.DownloadFiles; + cb.setupEndPoints; + cb.buildConfig(result, local); + finally + cb.free; + end; + except + on e : Exception do + begin + Logging.log('Zero Configuration Process failed: '+e.message); + if FileExists(result) then + Logging.log('Continuing on last successful configuration') + else + begin + Logging.log('First time, so can''t continue.'); + raise; + end; + end; + end; +end; + +{ TEndPointInfo } + +constructor TEndPointInfo.Create(version : TFHIRVersion); +begin + inherited Create; + FPackages := TStringList.Create; + FVersion := version; +end; + +destructor TEndPointInfo.Destroy; +begin + FPackages.free; + inherited; +end; + +end. diff --git a/testcases/cpt/cpt-fragment.db b/testcases/cpt/cpt-fragment.db index 1359a722a13fbfd62aae25807260e5dc3a83a149..dbbc2113da01e379defa251a033830d078414020 100644 GIT binary patch literal 49152 zcmeHQZEPDydL||DOD4Jgh{IfbPR8drwi4=#ikd3v-G!l6HWP`YNlH22;p(ipD`^vQ z$#9pF6`%;@1UR55(Dd4${m~-mp+J8WMSF)9O$!|EfTCYOdPRZu$NlO3DbNqJI5fSY zXwm1L*W=I-q5%)HOM^Kf@|=Xo2KS53!Yo85j#bJ#-UXe1hqyuer_ z5?R4t8h_qr0vq(_eWKpRExuPGGp~J+QGOChrY}a6DdoFaEBlkomF!~rV&;ikoF@-S z1SA3y0f~S_Kq4R!kO)WwBmxgE0{dT0BywlYL~p$1XxG|Ct>5h#eaAHH;a0L#SBp)R zHH$BsYI~Tn%;D{_6wz*|#j@h;B;C4KOO7O@baB=o}2b(vv;2>Na z<9Z0M(SYzu!hk#*kLO-KcMu>!Bd*Q|_Y(Vw@kH+Q>FB=3K`C|7Z9T{Kz9&Lpc&Uc~ zqSMvQP1EQL7g$zTitDSs`;0JaYHD^Oo-3U`$ONzItMlGgZ2x35kvn@fy8i}mdf5`U z%;?X+=2*ypzyWSU*o}YYnXr@Juf%2Eie<}Z}{7CtZ^8Nd1psZUWAQ6xVNCYGT5&?;TL_i`S5s(N- z1SA3yfk*_m`q7p76n)LtlJr%ZPte!WVw}DTip?`r-^qHUyi>S`=g0}9{={({@BXcBhg=v z{O*11f&JGWj^`eazWppWsMR(tvt?>ltZen5tzkg_qXmJDLEGU<8zgJU44VWSOnckV znVTuk`p^t9`=+(UI)-kxw03)sX}um~OZuh;Jw)TW)-i=#2h%K_*-l?Gx3(P=xU2Pb z?<}SpEt8f~u#WaRN}FNjO*XKpT*vGfc?M0zwxQWjR$OE#aNrm=bGnY!=EoUMgmOuD zU^zyg=~QuNfXvtMZ8$S;o{Z<9m2pMbN_KUO{=}uO-7~3#kfpn(vwhfB=9&4it;|0Z z%jKdfuiD=3_MP!^ZMOPigO#e4#%l8=R#9J>RU1v#Sb=RzCt|r1(H74QK*tWqTjSZ+ zme&Z5wQ^;>sWxuRACKp9sduXUQw6+*soT2-4ON=J1aO? zq-Ibqv;?v;<;Ep-nYkzD*(;aIrAw@?US2QP)dn)JsmtY3adq_yE7ofDDuh8ukmgdk z(X2uTrdU~?rJ}x4MAJkaNMemj3yg z6;*O5)UT9Oby;1Wxv_98o;#IvG1E=E*VguiLjX?Sy=EKz9We+(enKNcW0tYY4jLM} z+h%Lq9U$;l&GYq}M##2lJKa7;jit|0QFl6EUfDJ*Z^(oOhO=#mA<^Arv^^XsWCIBX zG23VxEt1sXsCnZnFod{~*IS068~V)t%SVYjZtTI+<`#VJNK^-oM;<#E%#L6Ul4BA0 z(fIFZmbPVdh+xnhg3qTC(`vN``oUD<0+s&=MD6Y_$YIB5Q;{wW-ApL?AX_ZVO+WLD zMfISp&2Wky7dChlT^afZ`gYT7 z8RUpvcrpIJ$=l$%!EVi`J>H#L5WHJmSt*ym9kVq~cB|D_+%v#ZOGiB3om(K@6?tc? z>rIbAi67|{PP)7zk9VJ)@idY0Q`_yu8sQ54*j$f|;5988>xA!9?8}w9St-z&>X*0XW`O)HZ z&97!|rtX>j3bfR~!Ece*74AO=AM&~`M8oro(}g9UhKmVqkP$ZM)1=|Mw?T!T8#<*E zw&Bxe;=8t^8XJ;vfnW8|_44hJaj0{jo**(Vaacx@F)n_^2_V&<9Vaf;OC&>hD%^^?t@OncXT~`5F3YZxHC5XxhQ920p5ep#)tIs!x3`GTW^DqaR-0o zJpP+}n4bUV)9*#nKhC5wmosyj$1*RZe?R@B^xrD)DsL*f@-5}xl)qN~SovZ0$Jrld z|4d0Kmz6o?G3ABqM)rm5Q`v_y|Cjlv%nvf}XTFtrH}hsj&$hFFkp0!{e)hfed+G1p z$GHMowM0N7AQ6xVNCYGT5&?;TL_i|&*+W2y9Xpl8<4*V9E-&`yYwrHjV!!4ce@g5x zExO02#D2lszi={!$qw;s)SrNgoyYU8(_X4KkNe~?y8jnh#r^*|g>Ldi3f<&CaTGaH zVxQl*pFJMKlNpiVHsA}QLQD)S4rjcMo*9*@uu-Ym$48}R9vhXKK0PY+$md6;PM#W- zntF6pYVvcVQWKAiN{#16rN$l>5DOeUh))WLd7^;$AptQ@A&5^1i1|K;__% zlA}`NiBYMs_^@%qd9B#6aRq_g#ISJ%LT-H6xB_q77*08r6c7I0#?ku!boPHESpEM2 zR{j5m@=MCD(!xFd7nL)Lf&=m+5s(N-1SA3y0f~S_Kq4R!kO)WwBmxqF&pHA})3IYG zlev|7yt}P$w|Xu6=nP4@mLNu^B45}s*cAf@g$$v;E8z0^-;WnaxO(_ za|;e$cg1}@-gvhRr#~=`?QqSTakaPR+` z@*mIw_;cm=l;2cJ%GW>ZT`b!#5s(N-1SA3y0f~S_Kq4R!kO)WwBmxqFdxQX=M8Nwg zbW5EUJ7WIeh}aQR2a{q)%oU_)CxvDDbWTzn5jzPy!$0Z1KSBrNV&9(=h~?=1p4Rh+ z=L6{3KhERnbl&(dUuYg+EKB*sD*%*_p8r3LCH>j&X5PuXlsPTe|I79Nq*5T)|I^Zb zx&B|S|L05H<@$eD7$qS4zz(ypIJ9y$w9s3Az6NFd{5+{r{ayu^eWY9&Wj5 zX#C#Ba#LTrMXvw9x1uuqx9N~8ibG5sS~$Ef*Z(_=OaJ8Eh54?OkX-+Nuk^6w`hOCM zyDcTT!w9m3hVdN{GTr|li(ZZ>iR@#UrSzpETa(vQzmWW9;&8hL|y>_YGuR(3#g&|qIH zRX57Z)ALJTpJF>&i{2W^vrfHIoL;Te@=)tBUpE*e4;{mVfLafA3dy(~i2w8rtr0$L4)<@*{0ctav?Gq``VMF!}9idfq=J| z=3@bXgj$<4-EI>H&&sJl`k0OZz67YVqvRW{#fe(4EX zHP+#|X<<%zZH*y+W%LQlg9Eu4U-Y zK*g{wc3-^0$`$NDKCraDTC8L5C7~`z3M&oBXw_9#EJ1n(^)zZ_oJRVGjVqPqdKI!+ zrE0xeDQ=YO>y4qKRfVGkk1dxQYO$e)9BrdmDwQj0o~`+gh8kX08T1yLYPpifhUzLh zZa|@{t|BiS&BcoWFjx#Zu{;9~>mKV>KXZf_T&p}74w^D@+i5h;KK5B3p z;E>m!_f{KqzsIcz;aRALk}N9X2_8?@WF$%-nvAo4F7+GjmHb z??~kL{yXvY)7;cX*wpkVYwCm1%k9r|)1MEUe&pVp{$QB<^QXAEkB7~j9E$exMaMzi z>dzP-TaR)BzZ^C&^+_1`VD#v<&vAp#hYe2ND}x^lBR3!6M$U$fOx(iA&nOe`ygRt$3KYwcI=zjlpl$JL_i`S5xBPqoXeAt(eu8L(WIL4c0@8m9IJm?u=PBkBN;JhIl+ z%}tZyhYSn|aw7*1Xu|5qiMcobTf`|ao@14+gJ}@Tgo!(LLBpf~m5dpXZhuR&X4_`x z8X}jp`-Z0P(KMf7?il(kLu3wWhJp5SDf=l_>e6gVpe!$r0^+F{{VlV_{NM*YOfy=J ziLfP_jtM?YPwM@_7EQ-s(VQE@!7a7Qb@KT_H)KaE$c!hSBJjTGt2`B%MUb@FwxPA1 z?L99Z!#CcTBJ_UwvakQt*t1&Om^tlY+O!#1LB|@H?j&jcx?$;Qr5N3*rN+g*lw+g;J?h)biv-LQ-i$M6;cP5E{^T)6#?YMWtAgy`UM@TRlJ zpG06k1P~>f7I$RA3*j(YaQ-cr;8{xY_;*x0x0RpmTB{FuY#&NObRF_GR8D)CO!u8( zWZ!tfLy#YMYaNQs!;42SAR2ehHlW+>4%*agW)DdAp974M*D(x-*YditN4EF67NAED zix4SdPK^fDVqRypnZP#r2c1CqsC^}b>!An$Hjf41Hj=WC^AHq! zJvVZa&kQWs+&sHBaCpm-9_jx@@O9Wire7>A%K;#LZ3o`~oE1)V3@B delta 423 zcmZo@U~YK8G(nnGfq{X6d!m9pqr%37CHg!p{P!66zwy7}f69Mvv!K8^em+(fW9o7+}Z(qCjf=C3qP5e*;Zs;O76$ zD?3>rKw@L#VV2FWrwDNK14X$6xPYV(-*N`N?USVv6d9KTjj867;Aa(-<^UR$l384k zlUOMP;TxH5-k;~n$j8b*jREMg8~jK3H}Ovc>S*B)m11QT6y?wkFwD-(ODV{xEY3_$ z%+W0_Nh~QX7GMF&af%z6g5;7DOLPr|m_e$gAtLFid8tK-IYLaV;-Va)mX<~a#$bi{ zDU)B; s: String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try parts := helpContext.Split([',']); for s in parts do diff --git a/toolkit/ImplementationGuideEditor.pas b/toolkit/ImplementationGuideEditor.pas index fbee6e794..897ef8b00 100644 --- a/toolkit/ImplementationGuideEditor.pas +++ b/toolkit/ImplementationGuideEditor.pas @@ -1512,7 +1512,7 @@ procedure TImplementationGuideEditorFrame.ConcatenateFiles(const InFileNames: ar try for i := 0 to high(InFileNames) do begin - InStream := TFileStream.Create(InFileNames[i], fmOpenRead); + InStream := TFileStream.Create(InFileNames[i], fmOpenRead + fmShareDenyWrite); try OutStream.CopyFrom(InStream, InStream.Size); finally diff --git a/toolkit2/dialogs/dlg_igpub_github.pas b/toolkit2/dialogs/dlg_igpub_github.pas index 14a40c679..096460e55 100644 --- a/toolkit2/dialogs/dlg_igpub_github.pas +++ b/toolkit2/dialogs/dlg_igpub_github.pas @@ -132,10 +132,10 @@ procedure TIgGitHubDialog.btnCancelClick(Sender: TObject); function makeFileName(s : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for ch in s do if (ch in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '#', '$', '.']) then @@ -239,7 +239,7 @@ function TIgGitHubDialog.cloneIg: boolean; procedure TIgGitHubDialog.doLine(sender: TFslExternalProcessThread; line: String; repl : boolean); begin - FLock.Lock; + FLock.Lock('git.line'); try if (repl) then FLines.add('t'+line) @@ -262,7 +262,7 @@ procedure TIgGitHubDialog.Timer1Timer(Sender: TObject); s : String; ok : boolean; begin - FLock.Lock; + FLock.Lock('git.timer'); try ok := false; for s in FLines do diff --git a/toolkit2/editors/ftk_editor_base.pas b/toolkit2/editors/ftk_editor_base.pas index b65c9de83..a6777f4c2 100644 --- a/toolkit2/editors/ftk_editor_base.pas +++ b/toolkit2/editors/ftk_editor_base.pas @@ -34,7 +34,7 @@ interface uses Classes, SysUtils, Math, - Graphics, Controls, ExtCtrls, ComCtrls, Menus, Forms, + Graphics, Controls, ExtCtrls, ComCtrls, Menus, Forms, Dialogs, SynEdit, SynEditHighlighter, SynEditTypes, fsl_base, fsl_utilities, fsl_stream, fsl_fpc, fsl_logging, ftk_context, ftk_store; @@ -141,6 +141,10 @@ TBaseEditor = class (TToolkitEditor) actBOM : TContentAction; actBOMNo : TContentSubAction; actBOMYes : TContentSubAction; + + actRun : TContentAction; + actDebug : TContentAction; + FTextPanelBase : TPanel; FDesignerPanelBase : TPanel; @@ -167,6 +171,8 @@ TBaseEditor = class (TToolkitEditor) procedure DoMnuFormat(sender : TObject); procedure DoEditorMouseDown(sender : TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure DoEditorMouseUp(sender : TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure DoRun(sender : TObject); + procedure DoDebug(sender : TObject); protected // if hasText FContent : TStringList; @@ -233,6 +239,7 @@ TBaseEditor = class (TToolkitEditor) function location : String; override; procedure redo; override; procedure updateToolbarButtons; virtual; + function canExecute : boolean; virtual; procedure getFocus(content : TMenuItem); override; procedure loseFocus(); override; procedure EditPause; override; @@ -620,13 +627,13 @@ procedure TBaseEditor.updateFromContent; function TBaseEditor.GetBytes: TBytes; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; first : boolean; encoding : TSourceEncoding; begin updateToContent; - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try first := true; for s in FContent do @@ -894,6 +901,13 @@ procedure TBaseEditor.updateToolbarButtons; actBOM.ImageIndex := 61; end; end; + actRun.enabled := canExecute; + actDebug.enabled := actRun.enabled; +end; + +function TBaseEditor.canExecute: boolean; +begin + result := false; end; procedure TBaseEditor.getFocus(content: TMenuItem); @@ -1222,6 +1236,10 @@ procedure TBaseEditor.makeTextTab; actLineMarkersWindows := makeSubAction(actLineMarkers, 'Windows (CR/LF)', 51, 0, DoMnuLineMarkers); actLineMarkersUnix := makeSubAction(actLineMarkers, 'Unix (LF)', 53, 1, DoMnuLineMarkers); actLineMarkersMac := makeSubAction(actLineMarkers, 'Macintosh (CR)', 52, 2, DoMnuLineMarkers); + + makeDivider(TextToolbar); + actRun := makeAction(TextToolbar, 'Run', 93, 0, DoRun); + actDebug := makeAction(TextToolbar, 'Debug', 94, 0, DoDebug); // 2. the Synedit Highlighter := makeHighlighter; @@ -1358,6 +1376,16 @@ procedure TBaseEditor.DoEditorMouseUp(sender: TObject; Button: TMouseButton; Shi FMouseDownInTextEditor := false; end; +procedure TBaseEditor.DoRun(sender: TObject); +begin + ShowMessage('not done yet'); +end; + +procedure TBaseEditor.DoDebug(sender: TObject); +begin + ShowMessage('not done yet'); +end; + procedure TBaseEditor.MakeNavigationItems(sender: TObject); var ts : TStringList; diff --git a/toolkit2/editors/ftk_editor_json.pas b/toolkit2/editors/ftk_editor_json.pas index 6dd9a38eb..2abd097a0 100644 --- a/toolkit2/editors/ftk_editor_json.pas +++ b/toolkit2/editors/ftk_editor_json.pas @@ -65,6 +65,7 @@ TJsonEditor = class (TBaseEditor) procedure newContent(); override; function FileExtension : String; override; procedure validate(validate : boolean; inspect : boolean; cursor : TSourceLocation; inspection : TStringList); override; + function canExecute : boolean; override; end; @@ -212,6 +213,22 @@ procedure TJsonEditor.validate(validate : boolean; inspect : boolean; cursor : T end; end; +function TJsonEditor.canExecute: boolean; +var + j : TJsonObject; +begin + try + j := TJSONParser.Parse(TextEditor.text); + try + result := j.str['type'] = 'web.runner'; + finally + j.free; + end; + except + result := false; + end; +end; + procedure TJsonEditor.ContentChanged; begin FJson.free; @@ -238,6 +255,7 @@ procedure TJsonEditor.makeTextTab; inherited makeTextTab; makeSubAction(actFormat, 'Pretty', 88, 0, DoMnuPretty); makeSubAction(actFormat, 'Condensed', 87, 0, DoMnuCondense); + makeSubAction(actFormat, 'Condensed', 87, 0, DoMnuCondense); end; end. diff --git a/toolkit2/fhirtoolkit.lpi b/toolkit2/fhirtoolkit.lpi index 9c782a18d..277052f44 100644 --- a/toolkit2/fhirtoolkit.lpi +++ b/toolkit2/fhirtoolkit.lpi @@ -1,4 +1,3 @@ - @@ -16,8 +15,10 @@ - - + + + + @@ -82,11 +83,11 @@ - + - + @@ -114,7 +115,7 @@ - + @@ -124,6 +125,7 @@ + @@ -230,10 +232,7 @@ - + @@ -392,7 +391,7 @@ - + @@ -409,7 +408,7 @@ - + @@ -419,14 +418,16 @@ + - + + @@ -834,12 +835,10 @@ - - @@ -887,7 +886,7 @@ - + diff --git a/toolkit2/frames/ftk_frame_codesystem.pas b/toolkit2/frames/ftk_frame_codesystem.pas index 6c12cf644..8983604e9 100644 --- a/toolkit2/frames/ftk_frame_codesystem.pas +++ b/toolkit2/frames/ftk_frame_codesystem.pas @@ -135,7 +135,7 @@ procedure TCodeSystemFrame.initialize; //FManager.registerControl('valueSet', edtValueSet); //FManager.registerControl('count', edtConceptCount); //FManager.registerControl('supplements', edtSupplements); - //FManager.registerControl('heirarchy', cbxHeirarchy); + //FManager.registerControl('hierarchy', cbxHierarchy); //FManager.registerControl('content', cbxContent); // //FManager.registerControl('caseSensitive', chkCase); diff --git a/toolkit2/frames/ftk_frame_igpub.pas b/toolkit2/frames/ftk_frame_igpub.pas index 2b8ef0bd2..e4368532c 100644 --- a/toolkit2/frames/ftk_frame_igpub.pas +++ b/toolkit2/frames/ftk_frame_igpub.pas @@ -327,7 +327,7 @@ procedure TIGPublicationManager.updateMemo; begin ts := TStringlist.Create; try - FLock.Lock; + FLock.Lock('updmemo'); try for i := FCurrentLine to FCurrent.lines.count - 1 do ts.add(FCurrent.lines[i]); @@ -831,7 +831,7 @@ procedure TIGPublicationFolder.SetEngine(AValue: TIgPublisherBuildBaseEngine); procedure TIGPublicationFolder.emitLine(line: String; repl : boolean); begin - FManager.FLock.Lock; + FManager.FLock.Lock('emit'); try if repl then FLines.add('t'+line) @@ -844,12 +844,12 @@ procedure TIGPublicationFolder.emitLine(line: String; repl : boolean); function TIGPublicationFolder.log: String; var - b : TStringBuilder; + b : TFslStringBuilder; s : String; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try - FManager.FLock.Lock; + FManager.FLock.Lock('log'); try for s in FLines do begin diff --git a/toolkit2/frm_main.pas b/toolkit2/frm_main.pas index e098ceec4..701c03977 100644 --- a/toolkit2/frm_main.pas +++ b/toolkit2/frm_main.pas @@ -3117,15 +3117,15 @@ procedure TMainToolkitForm.mnuLVCopyAllClick(Sender: TObject); var i : integer; msg : TToolkitMessage; - b : TStringBuilder; + b : TFslStringBuilder; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try for i := 0 to lvMessages.items.count - 1 do begin msg := TToolkitMessage(lvMessages.items[i].Data); b.append(msg.Summary); - b.append(EOLN); + b.append(#13#10); end; finally b.free; diff --git a/toolkit2/ftk_fhir_context_2.pas b/toolkit2/ftk_fhir_context_2.pas index 745ef5dc6..105b845dd 100644 --- a/toolkit2/ftk_fhir_context_2.pas +++ b/toolkit2/ftk_fhir_context_2.pas @@ -39,7 +39,7 @@ interface fhir_objects, fhir_factory, fhir_client, fhir_common, ftx_service, fhir2_types, fhir2_resources, fhir2_resources_base, fhir2_context, fhir2_profiles, fhir2_client, - fhir_valuesets; + fhir_tx, fhir_valuesets; Type @@ -57,7 +57,7 @@ TToolkitValidatorContextR2 = class (TBaseWorkerContextR2) function findCode(list : TFhirValueSetCodeSystemConceptList; code : String; caseSensitive : boolean) : TFhirValueSetCodeSystemConcept; function validateInternally(system, version, code: String; vs: TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url, version : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; procedure doGetList(sender : TObject; url : String; list : TStringList); protected procedure SeeResourceProxy(r : TFhirResourceProxy); override; @@ -118,14 +118,14 @@ destructor TToolkitValidatorContextR2.Destroy; inherited; end; -function TToolkitValidatorContextR2.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TToolkitValidatorContextR2.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : TFHIRValueSet; begin cs := FCodeSystems[url]; if cs = nil then raise ETerminologyError.Create('Unable to resolve code system '+url); - result := TFhirCodeSystemProvider.Create(FLanguages.link, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); + result := TFhirCodeSystemProvider.Create(FLanguages.link, nil, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); end; procedure TToolkitValidatorContextR2.doGetList(sender: TObject; url: String; list: TStringList); @@ -326,16 +326,16 @@ function TToolkitValidatorContextR2.validateInternally(system, version, code: St vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, nil, doGetVs, doGetCs, doGetList, nil, nil, FLanguages.link, '', nil); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try - validator.prepare(vsw, params); + validator.prepare(vsw, params, nil); p := validator.check('code', system, version, code, false); try res := TValidationResult.Create; diff --git a/toolkit2/ftk_fhir_context_3.pas b/toolkit2/ftk_fhir_context_3.pas index 3af649b8c..0adcbd932 100644 --- a/toolkit2/ftk_fhir_context_3.pas +++ b/toolkit2/ftk_fhir_context_3.pas @@ -38,7 +38,7 @@ interface fhir_objects, fhir_factory, fhir_client, fhir_common, ftx_service, fhir3_types, fhir3_resources, fhir3_resources_base, fhir3_context, fhir3_profiles, fhir3_client, - fhir_valuesets; + fhir_tx, fhir_valuesets; Type @@ -56,7 +56,7 @@ TToolkitValidatorContextR3 = class (TBaseWorkerContextR3) function findCode(list : TFhirCodeSystemConceptList; code : String; caseSensitive : boolean) : TFhirCodeSystemConcept; function validateInternally(system, version, code: String; vs: TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url, version : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; procedure doGetList(sender : TObject; url : String; list : TStringList); protected procedure SeeResourceProxy(r : TFhirResourceProxy); override; @@ -117,14 +117,14 @@ destructor TToolkitValidatorContextR3.Destroy; inherited; end; -function TToolkitValidatorContextR3.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TToolkitValidatorContextR3.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : TFHIRCodeSystem; begin cs := FCodeSystems.get(url); if cs = nil then raise ETerminologyError.Create('Unable to resolve code system '+url); - result := TFhirCodeSystemProvider.Create(FLanguages.link, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); + result := TFhirCodeSystemProvider.Create(FLanguages.link, nil, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); end; procedure TToolkitValidatorContextR3.doGetList(sender: TObject; url: String; @@ -322,16 +322,16 @@ function TToolkitValidatorContextR3.validateInternally(system, version, code: St vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, nil, doGetVs, doGetCs, doGetList, nil, nil, FLanguages.link, '', nil); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try - validator.prepare(vsw, params); + validator.prepare(vsw, params, nil); p := validator.check('code', system, version, code, false); try res := TValidationResult.Create; diff --git a/toolkit2/ftk_fhir_context_4.pas b/toolkit2/ftk_fhir_context_4.pas index 772f1c7eb..b5619bc31 100644 --- a/toolkit2/ftk_fhir_context_4.pas +++ b/toolkit2/ftk_fhir_context_4.pas @@ -39,7 +39,7 @@ interface fhir_objects, fhir_factory, fhir_client, fhir_common, fhir_utilities, ftx_service, fhir4_types, fhir4_resources, fhir4_resources_base, fhir4_context, fhir4_profiles, fhir4_client, - fhir_valuesets; + fhir_tx, fhir_valuesets; Type @@ -57,7 +57,7 @@ TToolkitValidatorContextR4 = class (TBaseWorkerContextR4) function findCode(list : TFhirCodeSystemConceptList; code : String; caseSensitive : boolean) : TFhirCodeSystemConcept; function validateInternally(system, version, code: String; vs: TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url, version : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; procedure doGetList(sender : TObject; url : String; list : TStringList); protected procedure SeeResourceProxy(r : TFhirResourceProxy); override; @@ -119,14 +119,14 @@ destructor TToolkitValidatorContextR4.Destroy; inherited; end; -function TToolkitValidatorContextR4.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TToolkitValidatorContextR4.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : TFHIRCodeSystem; begin cs := FCodeSystems.get(url); if cs = nil then raise ETerminologyError.Create('Unable to resolve code system '+url); - result := TFhirCodeSystemProvider.Create(FLanguages.link, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); + result := TFhirCodeSystemProvider.Create(FLanguages.link, nil, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); end; procedure TToolkitValidatorContextR4.doGetList(sender: TObject; url: String; list: TStringList); @@ -328,16 +328,16 @@ function TToolkitValidatorContextR4.validateInternally(system, version, code: St vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, nil, doGetVs, doGetCs, doGetList, nil, nil, FLanguages.link, '', nil); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try - validator.prepare(vsw, params); + validator.prepare(vsw, params, nil); p := validator.check('code', system, version, code, false); try res := TValidationResult.Create; diff --git a/toolkit2/ftk_fhir_context_5.pas b/toolkit2/ftk_fhir_context_5.pas index ad267f08e..6d43f5ebd 100644 --- a/toolkit2/ftk_fhir_context_5.pas +++ b/toolkit2/ftk_fhir_context_5.pas @@ -39,7 +39,7 @@ interface fhir_objects, fhir_factory, fhir_client, fhir_common, ftx_service, fhir5_enums, fhir5_types, fhir5_resources, fhir5_resources_base, fhir5_context, fhir5_profiles, fhir5_client, - fhir_valuesets; + fhir_tx, fhir_valuesets; Type @@ -57,7 +57,7 @@ TToolkitValidatorContextR5 = class (TBaseWorkerContextR5) function findCode(list : TFhirCodeSystemConceptList; code : String; caseSensitive : boolean) : TFhirCodeSystemConcept; function validateInternally(system, version, code: String; vs: TFHIRValueSet; var res : TValidationResult) : boolean; function doGetVs(sender : TObject; url, version : String) : TFHIRValueSetW; - function doGetCs(sender : TObject; url, version : String; params : TFHIRExpansionParams; nullOk : boolean) : TCodeSystemProvider; + function doGetCs(sender : TObject; url, version : String; params : TFHIRTxOperationParams; nullOk : boolean) : TCodeSystemProvider; procedure doGetList(sender : TObject; url : String; list : TStringList); protected procedure SeeResourceProxy(r : TFhirResourceProxy); override; @@ -119,14 +119,14 @@ destructor TToolkitValidatorContextR5.Destroy; inherited; end; -function TToolkitValidatorContextR5.doGetCs(sender: TObject; url, version: String; params: TFHIRExpansionParams; nullOk : boolean): TCodeSystemProvider; +function TToolkitValidatorContextR5.doGetCs(sender: TObject; url, version: String; params: TFHIRTxOperationParams; nullOk : boolean): TCodeSystemProvider; var cs : TFHIRCodeSystem; begin cs := FCodeSystems.get(url); if cs = nil then raise ETerminologyError.Create('Unable to resolve code system '+url); - result := TFhirCodeSystemProvider.Create(FLanguages.link, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); + result := TFhirCodeSystemProvider.Create(FLanguages.link, nil, Factory.link, TFHIRCodeSystemEntry.Create(Factory.wrapCodeSystem(cs.link))); end; procedure TToolkitValidatorContextR5.doGetList(sender: TObject; url: String; @@ -330,16 +330,16 @@ function TToolkitValidatorContextR5.validateInternally(system, version, code: St vsw : TFhirValueSetW; validator : TValueSetChecker; p : TFHIRParametersW; - params : TFHIRExpansionParams; + params : TFHIRTxOperationParams; begin try vsw := Factory.wrapValueSet(vs.Link); try validator := TValueSetChecker.Create(Factory.link, nil, doGetVs, doGetCs, doGetList, nil, nil, FLanguages.link, '', nil); try - params := TFHIRExpansionParams.Create; + params := TFHIRTxOperationParams.Create; try - validator.prepare(vsw, params); + validator.prepare(vsw, params, nil); p := validator.check('code', system, version, code, false); try res := TValidationResult.Create; diff --git a/toolkit2/views/ftk_console.pas b/toolkit2/views/ftk_console.pas index 940b208ed..92494c03c 100644 --- a/toolkit2/views/ftk_console.pas +++ b/toolkit2/views/ftk_console.pas @@ -72,7 +72,7 @@ procedure TToolkitConsole.newDay(const s: String); procedure TToolkitConsole.log(const s: String); begin - FLock.Lock; + FLock.Lock('console.log'); try FLines.add(s); finally @@ -120,7 +120,7 @@ destructor TToolkitConsole.Destroy; procedure TToolkitConsole.GetIncoming(list: TStringList); begin - FLock.Lock; + FLock.Lock('console.incoming'); try list.assign(FLines); FLines.Clear; diff --git a/utilities/codescan/codescan.lpi b/utilities/codescan/codescan.lpi index 6576e515e..bd1254e8f 100644 --- a/utilities/codescan/codescan.lpi +++ b/utilities/codescan/codescan.lpi @@ -53,9 +53,6 @@ - - -O2 -Xs - @@ -119,7 +116,6 @@ - @@ -144,8 +140,7 @@ - diff --git a/utilities/codescan/codescan.lpr b/utilities/codescan/codescan.lpr index 1ebaf5fa9..d9a603acd 100644 --- a/utilities/codescan/codescan.lpr +++ b/utilities/codescan/codescan.lpr @@ -87,7 +87,7 @@ TIncludeHandler = class(TInterfacedObject, IIncludeHandler) end; { TCodeScanner } - TSourceScanCheck = (sscUnicode, sscLicense, sscExceptionRaise, sscExceptionDefine, sscLineEndings, sscParse); + TSourceScanCheck = (sscUnicode, sscLicense, sscExceptionRaise, sscExceptionDefine, sscLineEndings, sscParse, sscConstructors); TSourceScanCheckSet = set of TSourceScanCheck; TCodeScanner = class(TObject) @@ -110,6 +110,7 @@ TCodeScanner = class(TObject) procedure checkFileForLicense(filename, src : String); procedure checkFileForExceptionRaise(filename, src : String; ts : TStringList); procedure checkFileForExceptionDefine(filename, src : String; ts : TStringList); + function checkConstructors(filename, src : String; ts : TStringList) : boolean; function checkFileForLineEndings(filename, src : String) : String; procedure scanFolder(folder: String; checks: TSourceScanCheckSet; incFolder : String); @@ -216,7 +217,7 @@ procedure TCodeScanner.checkFileForExceptionRaise(filename, src : String; ts : T begin srcns := ts[i].Replace(#9, '').Replace(' ', ' ').ToLower; if srcns.contains('raise exception.') then - reportError(filename, i, 'raises a unspecialised exception'); + reportError(filename, i, 'raises an unspecialised exception'); end; end; @@ -233,14 +234,44 @@ if srcns.contains('=class(exception)') and not srcns.contains('efslexception end; end; +function TCodeScanner.checkConstructors(filename, src: String; ts: TStringList) : boolean; +var + i : integer; + inConstructor : boolean; + srcns, s : String; +begin + inConstructor := false; + result := false; + for i := 0 to ts.count - 1 do + begin + srcns := ts[i].Replace(#9, ' ').Replace(' ', '').ToLower; + if inConstructor then + begin + if srcns.trim = 'begin' then + begin + inConstructor := false; + s := ts[i+1].toLower; + if not s.contains('create') and not s.contains('inherited') then + begin + reportError(filename, i, 'constructor does not call (inherited?) create'); + //ts[i+1] := '!'+ts[i+1]; + //result := true; + end; + end + end + else if srcns.startsWith('constructor T') then + inConstructor := true; + end; +end; + function TCodeScanner.checkFileForLineEndings(filename, src : String) : String; var - b : TStringBuilder; + b : TFslStringBuilder; changed : boolean; i, l, fl : integer; ch : char; begin - b := TStringBuilder.Create; + b := TFslStringBuilder.Create; try i := 1; l := 0; @@ -373,7 +404,10 @@ procedure TCodeScanner.checkFile(filename: String; checks: TSourceScanCheckSet; var src : String; ts : TStringList; + save : boolean; begin + save := false; + if (sscUnicode in checks) and StringArrayExists(['.pas', '.inc', '.html', '.css', '.dpr', '.lpr', '.xml', '.json'], ExtractFileExt(filename)) then checkFileForUnicode(filename); @@ -413,6 +447,18 @@ procedure TCodeScanner.checkFile(filename: String; checks: TSourceScanCheckSet; end; checkFileForExceptionDefine(filename, src, ts); end; + + if (sscConstructors in checks) and StringArrayExists(['.pas'], ExtractFileExt(filename)) then + begin + if src = '' then + begin + src := FileToString(filename, nil); + ts.Text := src; + end; + save := checkConstructors(filename, src, ts); + end; + if save then + ts.SaveToFile(filename, TEncoding.UTF8); finally ts.free; end; @@ -599,7 +645,7 @@ procedure TCodeScanner.Run; cmd := TCommandLineParameters.create; try - //output(commandLineAsString); +// output(cmd.asString); try FProjectDir := paramstr(0); FProjectDir := FProjectDir.Substring(0, FProjectDir.IndexOf('utilities')-1); @@ -630,7 +676,7 @@ procedure TCodeScanner.Run; scanFolder(FilePath([FSourceDir, 'lazarus-ide-tester']), [sscLicense, sscLineEndings, sscExceptionRaise, sscParse], FilePath([FSourceDir, 'lazarus-ide-tester'])); output(''); output(FProjectDir+' [license, eoln, exceptions, full-parse]'); - scanFolder(FProjectDir, [sscUnicode, sscLicense, sscExceptionRaise, sscExceptionDefine, sscLineEndings, sscParse], FilePath([FProjectDir, 'library'])); + scanFolder(FProjectDir, [sscUnicode, sscLicense, sscExceptionRaise, sscExceptionDefine, sscLineEndings, sscConstructors, sscParse], FilePath([FProjectDir, 'library'])); output(''); end; except @@ -653,7 +699,7 @@ procedure TCodeScanner.Run; end else begin - output('All OK', true); + output('All OK', false); end; finally cmd.free; diff --git a/utilities/generator/project/templates/TFhirElement.implementation.pas b/utilities/generator/project/templates/TFhirElement.implementation.pas index c11a6553c..782e63aae 100644 --- a/utilities/generator/project/templates/TFhirElement.implementation.pas +++ b/utilities/generator/project/templates/TFhirElement.implementation.pas @@ -51,7 +51,7 @@ function TFhirElement.hasExtension(url: string): boolean; function TFhirElement.hasExtensions: boolean; begin - result := FextensionList.Count > 0; + result := (FExtensionList <> nil) and (FextensionList.Count > 0); end; function TFhirElement.getExtensionString(url: String): String;
          IP addressCountSessionActivityLength