From 8bedc7ca6242318c305f21fe9a7c87f81a11086b Mon Sep 17 00:00:00 2001 From: Dan Gottlieb Date: Fri, 20 Jun 2025 10:01:52 -0400 Subject: [PATCH 1/3] Address QA warnings --- _build.bat | 386 ++++++++++++++++++ _build.sh | 176 ++++++++ _updatePublisher.bat | 15 +- _updatePublisher.sh | 14 +- .../fsh/extensions/OperationNotSupported.fsh | 14 +- input/ignoreWarnings.txt | 22 +- ...mplementationGuide-hl7.fhir.uv.bulkdata.md | 25 ++ input/pagecontent/changes.md | 9 + input/pagecontent/group.md | 4 + input/pagecontent/index.md | 3 + package-list.json => package-list.json.old | 0 publication-request.json | 10 + sushi-config.yaml | 10 +- 13 files changed, 681 insertions(+), 7 deletions(-) create mode 100644 _build.bat create mode 100755 _build.sh create mode 100644 input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md rename package-list.json => package-list.json.old (100%) create mode 100644 publication-request.json diff --git a/_build.bat b/_build.bat new file mode 100644 index 0000000..2bf0d79 --- /dev/null +++ b/_build.bat @@ -0,0 +1,386 @@ +@ECHO OFF +setlocal enabledelayedexpansion + +SET "dlurl=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/publisher.jar" +SET "publisher_jar=publisher.jar" +SET "input_cache_path=%CD%\input-cache\" +SET "skipPrompts=false" +SET "upper_path=..\" +SET "scriptdlroot=https://raw.githubusercontent.com/HL7/ig-publisher-scripts/main" +SET "build_bat_url=%scriptdlroot%/_build.bat" +SET "build_sh_url=%scriptdlroot%/_build.sh" + + + +:: Debugging statements to check jar file location +ECHO Checking for publisher.jar in %input_cache_path% +IF EXIST "%input_cache_path%%publisher_jar%" ( + SET "jar_location=%input_cache_path%%publisher_jar%" + ECHO Found publisher.jar in input-cache +) ELSE ( + ECHO Checking for publisher.jar in %upper_path% + IF EXIST "%upper_path%%publisher_jar%" ( + SET "jar_location=%upper_path%%publisher_jar%" + ECHO Found publisher.jar in parent folder + ) ELSE ( + SET "jar_location=not_found" + SET "default_choice=1" + ECHO publisher.jar not found in input-cache or parent folder + ) +) + + +:: Handle command-line argument to bypass the menu +IF NOT "%~1"=="" ( + IF /I "%~1"=="update" SET "userChoice=1" + IF /I "%~1"=="build" SET "userChoice=2" + IF /I "%~1"=="nosushi" SET "userChoice=3" + IF /I "%~1"=="notx" SET "userChoice=4" + IF /I "%~1"=="jekyll" SET "userChoice=5" + IF /I "%~1"=="clean" SET "userChoice=6" + IF /I "%~1"=="exit" SET "userChoice=0" + GOTO executeChoice +) + +echo --------------------------------------------------------------- +ECHO Checking internet connection... +PING tx.fhir.org -4 -n 1 -w 4000 >nul 2>&1 && SET "online_status=true" || SET "online_status=false" + +IF "%online_status%"=="true" ( + ECHO We're online and tx.fhir.org is available. + FOR /F "tokens=2 delims=:" %%a IN ('curl -s https://api.github.com/repos/HL7/fhir-ig-publisher/releases/latest ^| findstr "tag_name"') DO SET "latest_version=%%a" + SET "latest_version=!latest_version:"=!" + SET "latest_version=!latest_version: =!" + SET "latest_version=!latest_version:~0,-1!" +) ELSE ( + ECHO We're offline or tx.fhir.org is not available, can only run the publisher without TX... + SET "txoption=-tx n/a" + SET "latest_version=unknown" + SET "default_choice=4" +) + +echo --------------------------------------------------------------- + + +IF NOT "%jar_location%"=="not_found" ( + FOR /F "tokens=*" %%i IN ('java "-Dfile.encoding=UTF-8" -jar "%jar_location%" -v 2^>^&1') DO SET "publisher_version=%%i" + SET "publisher_version=!publisher_version:"=!" + ECHO Detected publisher version: !publisher_version! +) ELSE ( + SET "publisher_version=unknown" + ECHO publisher.jar location is not found +) + +ECHO Publisher version: !publisher_version!; Latest is !latest_version! + +IF NOT "%online_status%"=="true" ( + ECHO We're offline. +) ELSE ( + IF NOT "!publisher_version!"=="!latest_version!" ( + ECHO An update is recommended. + SET "default_choice=1" + ) ELSE ( + ECHO Publisher is up to date. + SET "default_choice=2" + ) +) + +echo --------------------------------------------------------------- +echo. + +echo Please select an option: +echo 1. Download or upload publisher +echo 2. Build IG +echo 3. Build IG - no sushi +echo 4. Build IG - force no TX server +echo 5. Jekyll build +echo 6. Clean up temp directories +echo 0. Exit +:: echo [Press Enter for default (%default_choice%) or type an option number:] +echo. + +:: Using CHOICE to handle input with timeout +:: ECHO [Enter=Continue, 1-7=Option, 0=Exit] +choice /C 12345670 /N /CS /D %default_choice% /T 5 /M "Choose an option number or wait 5 seconds for default (%default_choice%):" +SET "userChoice=%ERRORLEVEL%" + + +:executeChoice +echo You selected: %userChoice% + +IF "%userChoice%"=="1" GOTO downloadpublisher +IF "%userChoice%"=="2" GOTO publish_once +IF "%userChoice%"=="3" GOTO publish_nosushi +IF "%userChoice%"=="4" GOTO publish_notx +IF "%userChoice%"=="5" GOTO debugjekyll +IF "%userChoice%"=="6" GOTO clean +IF "%userChoice%"=="0" EXIT /B + +:end + + + +:debugjekyll + echo Running Jekyll build... + jekyll build -s temp/pages -d output +GOTO end + + +:clean + echo Cleaning up directories... + if exist ".\input-cache\publisher.jar" ( + echo Preserving publisher.jar and removing other files in .\input-cache... + move ".\input-cache\publisher.jar" ".\" + rmdir /s /q ".\input-cache" + mkdir ".\input-cache" + move ".\publisher.jar" ".\input-cache" + ) else ( + if exist ".\input-cache\" ( + rmdir /s /q ".\input-cache" + ) + ) + if exist ".\temp\" ( + rmdir /s /q ".\temp" + echo Removed: .\temp + ) + if exist ".\output\" ( + rmdir /s /q ".\output" + echo Removed: .\output + ) + if exist ".\template\" ( + rmdir /s /q ".\template" + echo Removed: .\template + ) + +GOTO end + + + + + +:downloadpublisher +ECHO Downloading Publisher... +:processflags +SET ARG=%1 +IF DEFINED ARG ( + IF "%ARG%"=="-f" SET FORCE=true + IF "%ARG%"=="--force" SET FORCE=true + SHIFT + GOTO processflags +) + +FOR %%x IN ("%CD%") DO SET upper_path=%%~dpx + +ECHO. +IF NOT EXIST "%input_cache_path%%publisher_jar%" ( + IF NOT EXIST "%upper_path%%publisher_jar%" ( + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + ECHO IG Publisher is not yet in input-cache or parent folder. + REM we don't use jarlocation below because it will be empty because we're in a bracketed if statement + GOTO create + ) ELSE ( + ECHO IG Publisher FOUND in parent folder + SET jarlocation="%upper_path%%publisher_jar%" + SET jarlocationname=Parent folder + GOTO upgrade + ) +) ELSE ( + ECHO IG Publisher FOUND in input-cache + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + GOTO upgrade +) + +:create +IF DEFINED FORCE ( + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) + +IF "%skipPrompts%"=="y" ( + SET create=Y +) ELSE ( + SET /p create="Download? (Y/N) " +) +IF /I "%create%"=="Y" ( + ECHO Will place publisher jar here: %input_cache_path%%publisher_jar% + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) +GOTO done + +:upgrade +IF "%skipPrompts%"=="y" ( + SET overwrite=Y +) ELSE ( + SET /p overwrite="Overwrite %jarlocation%? (Y/N) " +) + +IF /I "%overwrite%"=="Y" ( + GOTO download +) +GOTO done + +:download +ECHO Downloading most recent publisher to %jarlocationname% - it's ~200 MB, so this may take a bit + +FOR /f "tokens=4-5 delims=. " %%i IN ('ver') DO SET VERSION=%%i.%%j +IF "%version%" == "10.0" GOTO win10 +IF "%version%" == "6.3" GOTO win8.1 +IF "%version%" == "6.2" GOTO win8 +IF "%version%" == "6.1" GOTO win7 +IF "%version%" == "6.0" GOTO vista + +ECHO Unrecognized version: %version% +GOTO done + +:win10 +CALL POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%dlurl%\",\"%jarlocation%\") } else { Invoke-WebRequest -Uri "%dlurl%" -Outfile "%jarlocation%" } + +GOTO done + +:win7 +rem this may be triggering the antivirus - bitsadmin.exe is a known threat +rem CALL bitsadmin /transfer GetPublisher /download /priority normal "%dlurl%" "%jarlocation%" + +rem this didn't work in win 10 +rem CALL Start-BitsTransfer /priority normal "%dlurl%" "%jarlocation%" + +rem this should work - untested +call (New-Object Net.WebClient).DownloadFile('%dlurl%', '%jarlocation%') +GOTO done + +:win8.1 +:win8 +:vista +GOTO done + + + +:done + + + + +ECHO. +ECHO Updating scripts +IF "%skipPrompts%"=="y" ( + SET updateScripts=Y +) ELSE ( + SET /p updateScripts="Update scripts? (Y/N) " +) +IF /I "%updateScripts%"=="Y" ( + GOTO scripts +) +GOTO end + + +:scripts + +REM Download all batch files (and this one with a new name) + +SETLOCAL DisableDelayedExpansion + + + +:dl_script_1 +ECHO Updating _build.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%build_sh_url%\",\"_build.new.sh\") } else { Invoke-WebRequest -Uri "%build_sh_url%" -Outfile "_build.new.sh" } +if %ERRORLEVEL% == 0 goto upd_script_1 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_2 +:upd_script_1 +start copy /y "_build.new.sh" "_build.sh" ^&^& del "_build.new.sh" ^&^& exit + + +:dl_script_2 +ECHO Updating _build.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%build_bat_url%\",\"_build.new.bat\") } else { Invoke-WebRequest -Uri "%build_bat_url%" -Outfile "_build.new.bat" } +if %ERRORLEVEL% == 0 goto upd_script_2 +echo "Errors encountered during download: %errorlevel%" +goto end +:upd_script_2 +start copy /y "_build.new.bat" "_build.bat" ^&^& del "_build.new.bat" ^&^& exit + + +GOTO end + + +:publish_once + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +:: Debugging statements before running publisher +ECHO 1jar_location is: %jar_location% +IF NOT "%jar_location%"=="not_found" ( + java %JAVA_OPTS% -jar "%jar_location%" -ig . %txoption% %* +) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... +) + +GOTO end + + + +:publish_nosushi + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +:: Debugging statements before running publisher +ECHO 3jar_location is: %jar_location% +IF NOT "%jar_location%"=="not_found" ( + java %JAVA_OPTS% -jar "%jar_location%" -ig . %txoption% -no-sushi %* +) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... +) + +GOTO end + + +:publish_notx +SET txoption=-tx n/a + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +:: Debugging statements before running publisher +ECHO 2jar_location is: %jar_location% +IF NOT "%jar_location%"=="not_found" ( + java %JAVA_OPTS% -jar "%jar_location%" -ig . %txoption% %* +) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... +) + +GOTO end + + + + +:publish_continuous + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +:: Debugging statements before running publisher +ECHO Checking %input_cache_path% for publisher.jar +IF EXIST "%input_cache_path%\%publisher_jar%" ( + java %JAVA_OPTS% -jar "%input_cache_path%\%publisher_jar%" -ig . %txoption% -watch %* +) ELSE ( + ECHO Checking %upper_path% for publisher.jar + IF EXIST "..\%publisher_jar%" ( + java %JAVA_OPTS% -jar "..\%publisher_jar%" -ig . %txoption% -watch %* + ) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... + ) +) + +GOTO end + + +:end + +:: Pausing at the end + + +IF NOT "%skipPrompts%"=="true" ( + PAUSE +) diff --git a/_build.sh b/_build.sh new file mode 100755 index 0000000..2649ff7 --- /dev/null +++ b/_build.sh @@ -0,0 +1,176 @@ +#!/bin/bash + +set -e + +# Variables +dlurl="https://github.com/HL7/fhir-ig-publisher/releases/latest/download/publisher.jar" +publisher_jar="publisher.jar" +input_cache_path="$(pwd)/input-cache/" +skipPrompts=false +upper_path="../" +scriptdlroot="https://raw.githubusercontent.com/HL7/ig-publisher-scripts/main" +build_bat_url="${scriptdlroot}/_build.bat" +build_sh_url="${scriptdlroot}/_build.sh" + +function check_jar_location() { + if [ -f "${input_cache_path}${publisher_jar}" ]; then + jar_location="${input_cache_path}${publisher_jar}" + echo "Found publisher.jar in input-cache" + elif [ -f "${upper_path}${publisher_jar}" ]; then + jar_location="${upper_path}${publisher_jar}" + echo "Found publisher.jar in parent folder" + else + jar_location="not_found" + echo "publisher.jar not found in input-cache or parent folder" + fi +} + +function check_internet_connection() { + if ping -c 1 tx.fhir.org &>/dev/null; then + online=true + echo "We're online and tx.fhir.org is available." + latest_version=$(curl -s https://api.github.com/repos/HL7/fhir-ig-publisher/releases/latest | grep tag_name | cut -d'"' -f4) + else + online=false + echo "We're offline or tx.fhir.org is unavailable." + fi +} + + +function update_publisher() { + echo "Publisher jar location: ${input_cache_path}${publisher_jar}" + read -p "Download or update publisher.jar? (Y/N): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + echo "Downloading latest publisher.jar (~200 MB)..." + mkdir -p "$input_cache_path" + curl -L "$dlurl" -o "${input_cache_path}${publisher_jar}" + else + echo "Skipped downloading publisher.jar" + fi + + update_scripts_prompt +} + + +function update_scripts_prompt() { + read -p "Update scripts (_build.bat and _build.sh)? (Y/N): " update_confirm + if [[ "$update_confirm" =~ ^[Yy]$ ]]; then + echo "Updating scripts..." + curl -L "$build_bat_url" -o "_build.new.bat" && mv "_build.new.bat" "_build.bat" + curl -L "$build_sh_url" -o "_build.new.sh" && mv "_build.new.sh" "_build.sh" + chmod +x _build.sh + echo "Scripts updated." + else + echo "Skipped updating scripts." + fi +} + + +function build_ig() { + if [ "$jar_location" != "not_found" ]; then + args=() + if [ "$online" = "false" ]; then + args+=("-tx" "n/a") + fi + java -Dfile.encoding=UTF-8 -jar "$jar_location" -ig . "${args[@]}" "$@" + else + echo "publisher.jar not found. Please run update." + fi +} + + +function build_nosushi() { + if [ "$jar_location" != "not_found" ]; then + java -Dfile.encoding=UTF-8 -jar "$jar_location" -ig . -no-sushi "$@" + else + echo "publisher.jar not found. Please run update." + fi +} + +function build_notx() { + if [ "$jar_location" != "not_found" ]; then + java -Dfile.encoding=UTF-8 -jar "$jar_location" -ig . -tx n/a "$@" + else + echo "publisher.jar not found. Please run update." + fi +} + +function jekyll_build() { + echo "Running Jekyll build..." + jekyll build -s temp/pages -d output +} + +function cleanup() { + echo "Cleaning up temp directories..." + if [ -f "${input_cache_path}${publisher_jar}" ]; then + mv "${input_cache_path}${publisher_jar}" ./ + rm -rf "${input_cache_path}"* + mkdir -p "$input_cache_path" + mv "$publisher_jar" "$input_cache_path" + fi + rm -rf ./output ./template ./temp + echo "Cleanup complete." +} + +check_jar_location +check_internet_connection + +# Handle command-line argument or menu +case "$1" in + update) update_publisher ;; + build) build_ig ;; + nosushi) build_nosushi ;; + notx) build_notx ;; + jekyll) jekyll_build ;; + clean) cleanup ;; + exit) exit 0 ;; + *) + # Compute default choice + default_choice=2 # Build by default + + if [ "$jar_location" = "not_found" ]; then + default_choice=1 # Download if jar is missing + elif [ "$online" = "false" ]; then + default_choice=4 # Offline build + elif [ -n "$latest_version" ]; then + current_version=$(java -jar "$jar_location" -v 2>/dev/null | tr -d '\r') + if [ "$current_version" != "$latest_version" ]; then + default_choice=1 # Offer update if newer version exists + fi + fi + + echo "---------------------------------------------" + echo "Publisher: ${current_version:-unknown}; Latest: ${latest_version:-unknown}" + echo "Publisher location: $jar_location" + echo "Online: $online" + echo "---------------------------------------------" + echo + echo "Please select an option:" + echo "1) Update publisher" + echo "2) Build IG" + echo "3) Build IG without Sushi" + echo "4) Build IG without TX server" + echo "5) Jekyll build" + echo "6) Cleanup temp directories" + echo "0) Exit" + echo + + # Read with timeout, but default if nothing entered + echo -n "Choose an option [default: $default_choice]: " + read -t 5 choice || choice="$default_choice" + choice="${choice:-$default_choice}" + echo "You selected: $choice" + + case "$choice" in + 1) update_publisher ;; + 2) build_ig ;; + 3) build_nosushi ;; + 4) build_notx ;; + 5) jekyll_build ;; + 6) cleanup ;; + 0) exit 0 ;; + *) echo "Invalid option." ;; + esac + ;; + +esac diff --git a/_updatePublisher.bat b/_updatePublisher.bat index 67aebf5..10fee38 100644 --- a/_updatePublisher.bat +++ b/_updatePublisher.bat @@ -8,6 +8,8 @@ SET input_cache_path=%CD%\input-cache\ SET skipPrompts=false SET scriptdlroot=https://raw.githubusercontent.com/HL7/ig-publisher-scripts/main +SET build_bat_url=%scriptdlroot%/_build.bat +SET build_sh_url=%scriptdlroot%/_build.sh SET update_bat_url=%scriptdlroot%/_updatePublisher.bat SET gen_bat_url=%scriptdlroot%/_genonce.bat SET gencont_bat_url=%scriptdlroot%/_gencontinuous.bat @@ -20,7 +22,7 @@ IF "%~1"=="/f" SET skipPrompts=y ECHO. ECHO Checking internet connection... -PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline +PING tx.fhir.org -4 -n 1 -w 4000 | FINDSTR TTL && GOTO isonline ECHO We're offline, nothing to do... GOTO end @@ -69,6 +71,7 @@ IF DEFINED FORCE ( IF "%skipPrompts%"=="y" ( SET create=Y ) ELSE ( + ECHO Will place publisher jar here: %input_cache_path%%publisher_jar% SET /p create="Ok? (Y/N) " ) IF /I "%create%"=="Y" ( @@ -211,6 +214,16 @@ goto end start copy /y "_updatePublisher.new.bat" "_updatePublisher.bat" ^&^& del "_updatePublisher.new.bat" ^&^& exit +:dl_script_7 +ECHO Updating _build.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%build_bat_url%\",\"_build.new.bat\") } else { Invoke-WebRequest -Uri "%update_bat_url%" -Outfile "_build.new.bat" } +if %ERRORLEVEL% == 0 goto upd_script_6 +echo "Errors encountered during download: %errorlevel%" +goto end +:upd_script_6 +start copy /y "_build.new.bat" "_build.bat" ^&^& del "_build.new.bat" ^&^& exit + + :end diff --git a/_updatePublisher.sh b/_updatePublisher.sh index 0f9ecbe..6a97fe0 100755 --- a/_updatePublisher.sh +++ b/_updatePublisher.sh @@ -12,6 +12,8 @@ gencont_bat_url=$scriptdlroot/_gencontinuous.bat gencont_sh_url=$scriptdlroot/_gencontinuous.sh gen_sh_url=$scriptdlroot/_genonce.sh update_sh_url=$scriptdlroot/_updatePublisher.sh +build_sh_url=$scriptdlroot/_build.sh +build_bat_url=$scriptdlroot/_build.bat skipPrompts=false FORCE=false @@ -103,6 +105,16 @@ if [[ $skipPrompts != true ]]; then if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then echo "Downloading most recent scripts " + curl -L $build_bat_url -o /tmp/_build.new + cp /tmp/_build.new _build.bat + rm /tmp/_build.new + + + curl -L $build_sh_url -o /tmp/_build.new + cp /tmp/_build.new _build.sh + chmod +x _build.sh + rm /tmp/_build.new + curl -L $update_bat_url -o /tmp/_updatePublisher.new cp /tmp/_updatePublisher.new _updatePublisher.bat rm /tmp/_updatePublisher.new @@ -129,4 +141,4 @@ if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then cp /tmp/_updatePublisher.new _updatePublisher.sh chmod +x _updatePublisher.sh rm /tmp/_updatePublisher.new -fi +fi \ No newline at end of file diff --git a/input/fsh/extensions/OperationNotSupported.fsh b/input/fsh/extensions/OperationNotSupported.fsh index 18e2cfb..ed71987 100644 --- a/input/fsh/extensions/OperationNotSupported.fsh +++ b/input/fsh/extensions/OperationNotSupported.fsh @@ -1,7 +1,19 @@ Extension: OperationNotSupported Id: operation-not-supported Title: "Operation Not Supported" -Description: "Used to indicate that the parent resource type or search parameter is not supported for use in a bulk data export operation." +Description: """ + Extension used in a CapabilityStatement to indicate that the parent resource type or search parameter is not supported for use in a bulk data export operation. For example, the following extension would indicate that the `AllergyIntolerance.clinical-status` search parameter may not be used in a `_typeFilter` parameter on this server. + ``` + "searchParam": [{ + "name": "clinical-status", + "type": "token", + "extension": [{ + "url": "http://hl7.org/fhir/uv/bulkdata/Extension/operation-not-supported", + "valueCanonical": "http://hl7.org/fhir/uv/bulkdata/CapabilityStatement/bulk-data" + }] + }] + ``` +""" Context: "CapabilityStatement.rest.resource | CapabilityStatement.rest.resource.searchParam" * value[x] only canonical * ^short = "Canonical URL for unsupported operation" \ No newline at end of file diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index 83ac897..a7a2dbe 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -1 +1,21 @@ -== Suppressed Messages == \ No newline at end of file +== Suppressed Messages == +# Warnings + +# 01. An inline example is provided in the extension description +The Implementation Guide contains no examples for this extension + +# 02. This valueset is defined on the Expression type, not in this IG +A definition could not be found for Canonical URL 'http://www.rfc-editor.org/bcp/bcp13.txt' + +# Hints + +# 01.This extension is defined in the Expression type, not in this IG +The extension http://hl7.org/fhir/StructureDefinition/elementdefinition-maxValueSet|5.2.0 is deprecated + +# Hints - Terminology + +# 01. Group profile - this code system is used by the Group resource +Reference to draft CodeSystem http://hl7.org/fhir/group-type|4.0.1 + +# 02. The includeAssociatedData code system and valueset are specific to this IGe and extremely unlikely to be used elsewhere. We will request TSMG approval. +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) \ No newline at end of file diff --git a/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md b/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md new file mode 100644 index 0000000..abd1ca9 --- /dev/null +++ b/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md @@ -0,0 +1,25 @@ + +{{ site.data.ig.description }} + +- [XML](ImplementationGuide-{{site.data.ig.id}}.xml) +- [JSON](ImplementationGuide-{{site.data.ig.id}}.json) + +### Cross Version Analysis + +{% capture cross-version-analysis %}{% include cross-version-analysis.xhtml %}{% endcapture %}{{ cross-version-analysis | remove: '

' | remove: '

'}} + +### IG Dependencies + +This IG Contains the following dependencies on other IGs. + +{% include dependency-table.xhtml %} + +### Global Profiles + +{% include globals-table.xhtml %} + +### Copyrights + +{% capture ip-statement %}{% include ip-statements.xhtml %}{% endcapture %} + +{{ ip-statement | remove: '

' | remove: '

'}} \ No newline at end of file diff --git a/input/pagecontent/changes.md b/input/pagecontent/changes.md index a81672e..8a29204 100644 --- a/input/pagecontent/changes.md +++ b/input/pagecontent/changes.md @@ -3,6 +3,15 @@ h4:before {content: none} +### STU3 - v3.0.0 +* Added support for partial export manifests to enable servers to make some files available prior to all of the files being ready and to split large lists of files across multiple manifests. +* Removed the “experimental” label from the `_typeFilter` kickoff parameter since it has been widely implemented, clarified its documentation and approach to boolean logic, and documented the interaction with other filters. +* Added optional `_until` kickoff parameter on the Bulk Data kickoff request as an analog to the `_since` parameter to enable users to specify a cutoff modification timestamp for the resources in the response. +* Added guidance on the use of FHIR Groups with Bulk Export, and added a Group profile to support the creation of characteristic based cohorts using coarse-grained filters to more efficiently export data on sets of patients from a source system. +* Moved guidance on the use of capability urls from a separate confluence page into the Bulk Data Output File Request section of the IG and added guidance on content encoding. +* Defined an extension for a server to indicate search parameters in the capability statement that are accessible with the REST API, but not available when using the Bulk Export operation. + + ### STU2 - v2.0.0 #### Export Kickoff Request diff --git a/input/pagecontent/group.md b/input/pagecontent/group.md index 5751094..950560f 100644 --- a/input/pagecontent/group.md +++ b/input/pagecontent/group.md @@ -16,6 +16,10 @@ When considering Bulk Export use cases, the community has identified three commo Servers supporting the Bulk Data Access IG MAY support the Bulk Cohort API which consists of an asynchronous Group creation REST interaction and a profile on the Group resource. The intent is to support the creation of characteristic based cohorts using coarse-grained filters to more efficiently export data on sets of patients from a source system. Post export, the client can use the FHIR resources returned for these cohorts for finer grained filtering to support use cases such as measure calculation or analytics that may necessitate more complex filter criteria. +
+While this overall implementation guide has a [maturity level] of FMM 5, the Bulk Cohort API is still experimental and has a maturity level of FMM 1. +
+ #### REST Interactions When the Bulk Cohort API is supported, the server SHALL accept FHIR Group create requests that use the [FHIR Asynchronous Interaction Request](https://hl7.org/fhir/async-bundle.html) pattern and provide a valid FHIR Group resource that complies with the [Bulk Cohort Group Profile](#group-profile). Servers MAY also accept synchronous FHIR Group create requests, but since not all servers can create groups in this way (for example, some systems require a manual group approval step), clients should not expect this to be universally available. After group creation, a server MAY subsequently make the new Group resource available to authorized clients or MAY reject resource creation request and returning a relevant error. Servers SHOULD support read, search, delete, and Bulk Export operations on created Group resources, and SHOULD support the `name` search parameter in search requests for these resources. Servers MAY support other FHIR REST API operations and other search parameters. diff --git a/input/pagecontent/index.md b/input/pagecontent/index.md index b33ccc7..796a6a5 100755 --- a/input/pagecontent/index.md +++ b/input/pagecontent/index.md @@ -30,6 +30,9 @@ This use case exports all resources needed to convey a patient's healthcare fina * Public health surveillance that does not require real-time exchange of data, such as aggregate situational awareness data reporting * Electronic Case Reporting (data from initial export may be filtered or summarized before submitting) +### Implementation Guide Details +The [Bulk Data Access ImplementationGuide Resource](ImplementationGuide-hl7.fhir.uv.bulkdata.html) defines the technical details of this publication, including dependencies and publishing parameters. + ### Additional Documentation * [Overview Presentation](https://docs.google.com/presentation/d/14ZHmam9hwz6-SsCG1YqUIQnJ56bvSqEatebltgEVR6c/edit?usp=sharing) * [Discussion Group (FHIR Zulip "Bulk Data" Track)](https://chat.fhir.org/#narrow/stream/bulk.20data) diff --git a/package-list.json b/package-list.json.old similarity index 100% rename from package-list.json rename to package-list.json.old diff --git a/publication-request.json b/publication-request.json new file mode 100644 index 0000000..6ce301b --- /dev/null +++ b/publication-request.json @@ -0,0 +1,10 @@ +{ + "package-id" : "hl7.fhir.uv.bulkdata", + "version" : "3.0.0-ballot", + "path" : "http://hl7.org/fhir/uv/bulkdata/2025Sep", + "mode" : "working", + "status": "ballot", + "sequence": "STU3", + "desc": "STU 3 with optional new functionality and additional guidance. Since all of the new capabilities are optional for servers to support and for clients to use, valid Bulk Export STU 2 servers are also valid STU 3 servers and clients that work with STU 2 servers will also work with STU 3 servers.\nAdditional features defined in STU 3 includes include the ability to organize output resources in export files by a focal resource such as Patient instead of by resource type, the ability to return of partial export manifests during an export and after it is complete, an `_until` kickoff parameter, a capability statement extension for servers to indicate supported _typeFilter search parameters, and a Group profile and extension to support the creation of characteristic based cohorts using coarse-grained filters.\nClarifications to the `_typeFilter` parameter cover search expression support, boolean logic, and interactions with other filters. Additional guidance covers the use of capability urls and content encoding when providing and retrieving bulk files, and the use of FHIR Groups with Bulk Export.", + "changes": "changes.html" +} \ No newline at end of file diff --git a/sushi-config.yaml b/sushi-config.yaml index c38f884..e4df31f 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -4,10 +4,10 @@ name: BulkDataAccessIG title: Bulk Data Access IG description: FHIR based approach for exporting large data sets from a FHIR server to a client application status: active -version: 2.0.0 +version: 3.0.0 fhirVersion: 4.0.1 copyrightYear: 2021+ -releaseLabel: ci-build # ci-build | draft | qa-preview | ballot | trial-use | release | update | normative+trial-use +releaseLabel: ballot # ci-build | draft | qa-preview | ballot | trial-use | release | update | normative+trial-use license: CC0-1.0 # https://www.hl7.org/fhir/valueset-spdx-license.html jurisdiction: http://unstats.un.org/unsd/methods/m49/m49.htm#001 publisher: @@ -30,6 +30,8 @@ pages: title: IG Change History downloads.html: title: Downloads + ImplementationGuide-hl7.fhir.uv.bulkdata.md: + title: Bulk Data Implementation Guide Resource parameters: excludettl: true @@ -63,4 +65,6 @@ extension: - url: http://hl7.org/fhir/StructureDefinition/structuredefinition-wg valueCode: fhir - url: http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status - valueCode: trial-use \ No newline at end of file + valueCode: trial-use + - url: http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm + valueInteger: 5 \ No newline at end of file From 979e9cb5705a20c20a06ca316049ee07cec490c2 Mon Sep 17 00:00:00 2001 From: Eric Haas Date: Mon, 23 Jun 2025 06:13:02 -0700 Subject: [PATCH 2/3] Fix implementation guide page --- .../ImplementationGuide-hl7.fhir.uv.bulkdata.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md b/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md index abd1ca9..deb9abb 100644 --- a/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md +++ b/input/pagecontent/ImplementationGuide-hl7.fhir.uv.bulkdata.md @@ -1,8 +1,16 @@ +{% assign igID = site.data.fhir.igId %} +{% assign IG = "ImplementationGuide/" | append: igID %} -{{ site.data.ig.description }} +||| +|---|---| +|*Official URL*: {{ site.data.resources[IG].url }}|*Version*: {{ site.data.resources[IG].version }}| +|*NPM package name*: {{ site.data.fhir.packageId }}|*ComputableName*: {{ site.data.resources[IG].name }}| +{:.grid} -- [XML](ImplementationGuide-{{site.data.ig.id}}.xml) -- [JSON](ImplementationGuide-{{site.data.ig.id}}.json) +{{ site.data.resources[IG].description }} + +- [XML](ImplementationGuide-{{igID}}.xml) +- [JSON](ImplementationGuide-{{igID}}.json) ### Cross Version Analysis From 87159ac01db892e15b3308351fcb942c030df703 Mon Sep 17 00:00:00 2001 From: Dan Gottlieb Date: Mon, 23 Jun 2025 10:25:01 -0400 Subject: [PATCH 3/3] typo --- input/ignoreWarnings.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index a7a2dbe..5469a8e 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -17,5 +17,5 @@ The extension http://hl7.org/fhir/StructureDefinition/elementdefinition-maxValue # 01. Group profile - this code system is used by the Group resource Reference to draft CodeSystem http://hl7.org/fhir/group-type|4.0.1 -# 02. The includeAssociatedData code system and valueset are specific to this IGe and extremely unlikely to be used elsewhere. We will request TSMG approval. +# 02. The includeAssociatedData code system and valueset are specific to this IG and extremely unlikely to be used elsewhere. We will request TSMG approval. 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) \ No newline at end of file