diff --git a/Dockerfile b/Dockerfile index 2452643..6f54fc2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,24 @@ -FROM python:3.9-slim - -WORKDIR /app +# Base image with Python and Java +FROM tomcat:10.1-jdk17 +# Install build dependencies and Node.js 18 RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 python3-pip python3-venv curl \ + && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* +# Install GoFSH globally +RUN npm install -g gofsh + +# Set up Python environment +WORKDIR /app +RUN python3 -m venv /app/venv +ENV PATH="/app/venv/bin:$PATH" + +# Copy Flask files COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt - COPY app.py . COPY services.py . COPY forms.py . @@ -15,10 +26,22 @@ COPY templates/ templates/ COPY static/ static/ COPY tests/ tests/ -# Ensure /tmp is writable as a fallback -RUN mkdir -p /tmp && chmod 777 /tmp +# Ensure /tmp, /app/h2-data, /app/static/uploads, and /app/logs are writable +RUN mkdir -p /tmp /app/h2-data /app/static/uploads /app/logs && chmod 777 /tmp /app/h2-data /app/static/uploads /app/logs -EXPOSE 5000 -ENV FLASK_APP=app.py -ENV FLASK_ENV=development -CMD ["flask", "run", "--host=0.0.0.0"] \ No newline at end of file +# Copy pre-built HAPI WAR and configuration +COPY hapi-fhir-jpaserver/target/ROOT.war /usr/local/tomcat/webapps/ +COPY hapi-fhir-jpaserver/target/classes/application.yaml /usr/local/tomcat/conf/ +COPY hapi-fhir-jpaserver/custom/ /usr/local/tomcat/webapps/custom/ + +# Install supervisord +RUN pip install supervisor + +# Configure supervisord +COPY supervisord.conf /etc/supervisord.conf + +# Expose ports +EXPOSE 5000 8080 + +# Start supervisord +CMD ["supervisord", "-c", "/etc/supervisord.conf"] \ No newline at end of file diff --git a/app.py b/app.py index 7fe33d0..36986b3 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ import sys import os sys.path.append(os.path.abspath(os.path.dirname(__file__))) import datetime -from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, Response, current_app +from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, Response, current_app, session, send_file from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from flask_wtf.csrf import CSRFProtect @@ -13,7 +13,9 @@ import requests import re import services # Restore full module import from services import services_bp # Keep Blueprint import -from forms import IgImportForm, ValidationForm +from forms import IgImportForm, ValidationForm, FSHConverterForm +from wtforms import SubmitField +import tempfile # Set up logging logging.basicConfig(level=logging.DEBUG) @@ -27,6 +29,7 @@ app.config['FHIR_PACKAGES_DIR'] = '/app/instance/fhir_packages' app.config['API_KEY'] = os.environ.get('API_KEY', 'your-fallback-api-key-here') app.config['VALIDATE_IMPOSED_PROFILES'] = True app.config['DISPLAY_PROFILE_RELATIONSHIPS'] = True +app.config['UPLOAD_FOLDER'] = '/app/static/uploads' # For GoFSH output # Ensure directories exist and are writable instance_path = '/app/instance' @@ -40,6 +43,7 @@ try: logger.debug(f"Flask instance folder path: {instance_folder_path}") os.makedirs(instance_folder_path, exist_ok=True) os.makedirs(packages_path, exist_ok=True) + os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) logger.debug(f"Directories created/verified: Instance: {instance_folder_path}, Packages: {packages_path}") except Exception as e: logger.error(f"Failed to create/verify directories: {e}", exc_info=True) @@ -891,5 +895,128 @@ def create_db(): with app.app_context(): create_db() + +class FhirRequestForm(FlaskForm): + submit = SubmitField('Send Request') + +@app.route('/fhir') +def fhir_ui(): + form = FhirRequestForm() + return render_template('fhir_ui.html', form=form, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + +@app.route('/fhir-ui-operations') +def fhir_ui_operations(): + form = FhirRequestForm() + return render_template('fhir_ui_operations.html', form=form, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + +@app.route('/fhir/', methods=['GET', 'POST', 'PUT', 'DELETE']) +def proxy_hapi(subpath): + # Clean subpath to remove r4/, fhir/, leading/trailing slashes + clean_subpath = subpath.replace('r4/', '').replace('fhir/', '').strip('/') + hapi_url = f"http://localhost:8080/fhir/{clean_subpath}" if clean_subpath else "http://localhost:8080/fhir" + headers = {k: v for k, v in request.headers.items() if k != 'Host'} + logger.debug(f"Proxying request: {request.method} {hapi_url}") + try: + response = requests.request( + method=request.method, + url=hapi_url, + headers=headers, + data=request.get_data(), + cookies=request.cookies, + allow_redirects=False + ) + response.raise_for_status() + # Strip hop-by-hop headers to avoid chunked encoding issues + response_headers = { + k: v for k, v in response.headers.items() + if k.lower() not in ( + 'transfer-encoding', 'connection', 'content-encoding', + 'content-length', 'keep-alive', 'proxy-authenticate', + 'proxy-authorization', 'te', 'trailers', 'upgrade' + ) + } + # Ensure Content-Length matches the actual body + response_headers['Content-Length'] = str(len(response.content)) + logger.debug(f"Response: {response.status_code} {response.reason}") + return response.content, response.status_code, response_headers.items() + except requests.RequestException as e: + logger.error(f"Proxy error: {str(e)}") + return jsonify({'error': str(e)}), response.status_code if 'response' in locals() else 500 + +@app.route('/fsh-converter', methods=['GET', 'POST']) +def fsh_converter(): + form = FSHConverterForm() + error = None + fsh_output = None + + # Populate package choices + packages = [] + packages_dir = app.config['FHIR_PACKAGES_DIR'] + if os.path.exists(packages_dir): + for filename in os.listdir(packages_dir): + if filename.endswith('.tgz'): + try: + with tarfile.open(os.path.join(packages_dir, filename), 'r:gz') as tar: + package_json = tar.extractfile('package/package.json') + if package_json: + pkg_info = json.load(package_json) + name = pkg_info.get('name') + version = pkg_info.get('version') + if name and version: + packages.append((f"{name}#{version}", f"{name}#{version}")) + except Exception as e: + logger.warning(f"Error reading package {filename}: {e}") + continue + form.package.choices = [('', 'None')] + sorted(packages, key=lambda x: x[0]) + + if form.validate_on_submit(): + input_mode = form.input_mode.data + fhir_file = form.fhir_file.data + fhir_text = form.fhir_text.data + output_style = form.output_style.data + log_level = form.log_level.data + fhir_version = form.fhir_version.data or None + + # Process input + input_path, temp_dir, error = services.process_fhir_input(input_mode, fhir_file, fhir_text) + if error: + flash(error, 'error') + return render_template('fsh_converter.html', form=form, error=error, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + + # Run GoFSH + output_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'fsh_output') + os.makedirs(output_dir, exist_ok=True) + fsh_output, error = services.run_gofsh(input_path, output_dir, output_style, log_level, fhir_version) + + # Clean up temporary files + if temp_dir and os.path.exists(temp_dir): + import shutil + shutil.rmtree(temp_dir) + + if error: + flash(error, 'error') + return render_template('fsh_converter.html', form=form, error=error, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + + # Store output for download + session['fsh_output'] = fsh_output + flash('Conversion successful!', 'success') + return render_template('fsh_converter.html', form=form, fsh_output=fsh_output, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + + return render_template('fsh_converter.html', form=form, error=error, site_name='FHIRFLARE IG Toolkit', now=datetime.datetime.now()) + +@app.route('/download-fsh') +def download_fsh(): + fsh_output = session.get('fsh_output', '') + if not fsh_output: + flash('No FSH output available for download.', 'error') + return redirect(url_for('fsh_converter')) + + temp_file = os.path.join(app.config['UPLOAD_FOLDER'], 'output.fsh') + with open(temp_file, 'w', encoding='utf-8') as f: + f.write(fsh_output) + + return send_file(temp_file, as_attachment=True, download_name='output.fsh') + + if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ed7e231 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.8' +services: + fhirflare: + build: + context: . + dockerfile: Dockerfile + ports: + - "5000:5000" + - "8080:8080" + volumes: + - ./instance:/app/instance + - ./static/uploads:/app/static/uploads + - ./hapi-fhir-jpaserver/target/h2-data:/app/h2-data + - ./logs:/app/logs + environment: + - FLASK_APP=app.py + - FLASK_ENV=development + - NODE_PATH=/usr/lib/node_modules + command: supervisord -c /etc/supervisord.conf \ No newline at end of file diff --git a/forms.py b/forms.py index a798229..946d1be 100644 --- a/forms.py +++ b/forms.py @@ -1,9 +1,10 @@ # forms.py from flask_wtf import FlaskForm -from wtforms import StringField, SelectField, TextAreaField, BooleanField, SubmitField -from wtforms.validators import DataRequired, Regexp, ValidationError +from wtforms import StringField, SelectField, TextAreaField, BooleanField, SubmitField, FileField +from wtforms.validators import DataRequired, Regexp, ValidationError, Optional import json +# Existing forms (IgImportForm, ValidationForm) remain unchanged class IgImportForm(FlaskForm): package_name = StringField('Package Name', validators=[ DataRequired(), @@ -45,4 +46,57 @@ def validate_json(data, mode): except json.JSONDecodeError: raise ValidationError("Invalid JSON format.") except ValueError as e: - raise ValidationError(str(e)) \ No newline at end of file + raise ValidationError(str(e)) + +class FSHConverterForm(FlaskForm): + package = SelectField('FHIR Package (Optional)', choices=[('', 'None')], validators=[Optional()]) + input_mode = SelectField('Input Mode', choices=[ + ('file', 'Upload File'), + ('text', 'Paste Text') + ], validators=[DataRequired()]) + fhir_file = FileField('FHIR Resource File (JSON/XML)', validators=[Optional()]) + fhir_text = TextAreaField('FHIR Resource Text (JSON/XML)', validators=[Optional()]) + output_style = SelectField('Output Style', choices=[ + ('file-per-definition', 'File per Definition'), + ('group-by-fsh-type', 'Group by FSH Type'), + ('group-by-profile', 'Group by Profile'), + ('single-file', 'Single File') + ], validators=[DataRequired()]) + log_level = SelectField('Log Level', choices=[ + ('error', 'Error'), + ('warn', 'Warn'), + ('info', 'Info'), + ('debug', 'Debug') + ], validators=[DataRequired()]) + fhir_version = SelectField('FHIR Version', choices=[ + ('', 'Auto-detect'), + ('4.0.1', 'R4'), + ('4.3.0', 'R4B'), + ('5.0.0', 'R5') + ], validators=[Optional()]) + submit = SubmitField('Convert to FSH') + + def validate(self, extra_validators=None): + if not super().validate(extra_validators): + return False + if self.input_mode.data == 'file' and not self.fhir_file.data: + self.fhir_file.errors.append('File is required when input mode is Upload File.') + return False + if self.input_mode.data == 'text' and not self.fhir_text.data: + self.fhir_text.errors.append('Text input is required when input mode is Paste Text.') + return False + if self.input_mode.data == 'text' and self.fhir_text.data: + try: + content = self.fhir_text.data.strip() + if content.startswith('{'): + json.loads(content) + elif content.startswith('<'): + import xml.etree.ElementTree as ET + ET.fromstring(content) + else: + self.fhir_text.errors.append('Text input must be valid JSON or XML.') + return False + except (json.JSONDecodeError, ET.ParseError): + self.fhir_text.errors.append('Invalid JSON or XML format.') + return False + return True \ No newline at end of file diff --git a/instance/fhir_ig.db b/instance/fhir_ig.db index 3a7e273..fe1b7ed 100644 Binary files a/instance/fhir_ig.db and b/instance/fhir_ig.db differ diff --git a/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.metadata.json b/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.metadata.json new file mode 100644 index 0000000..5a8de66 --- /dev/null +++ b/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.metadata.json @@ -0,0 +1,22 @@ +{ + "package_name": "hl7.fhir.au.base", + "version": "5.1.0-preview", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + }, + { + "name": "hl7.terminology.r4", + "version": "6.2.0" + }, + { + "name": "hl7.fhir.uv.extensions.r4", + "version": "5.2.0" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:45.070781+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.tgz b/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.tgz new file mode 100644 index 0000000..12b9c12 Binary files /dev/null and b/instance/fhir_packages/hl7.fhir.au.base-5.1.0-preview.tgz differ diff --git a/instance/fhir_packages/hl7.fhir.au.core-1.1.0-preview.metadata.json b/instance/fhir_packages/hl7.fhir.au.core-1.1.0-preview.metadata.json index 02443a7..0d1eed6 100644 --- a/instance/fhir_packages/hl7.fhir.au.core-1.1.0-preview.metadata.json +++ b/instance/fhir_packages/hl7.fhir.au.core-1.1.0-preview.metadata.json @@ -1,7 +1,7 @@ { "package_name": "hl7.fhir.au.core", "version": "1.1.0-preview", - "dependency_mode": "tree-shaking", + "dependency_mode": "recursive", "imported_dependencies": [ { "name": "hl7.fhir.r4.core", @@ -30,5 +30,5 @@ ], "complies_with_profiles": [], "imposed_profiles": [], - "timestamp": "2025-04-15T00:27:41.653977+00:00" + "timestamp": "2025-04-17T04:04:20.523471+00:00" } \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.r4.core-4.0.1.metadata.json b/instance/fhir_packages/hl7.fhir.r4.core-4.0.1.metadata.json index 20049e5..75120e4 100644 --- a/instance/fhir_packages/hl7.fhir.r4.core-4.0.1.metadata.json +++ b/instance/fhir_packages/hl7.fhir.r4.core-4.0.1.metadata.json @@ -1,9 +1,9 @@ { "package_name": "hl7.fhir.r4.core", "version": "4.0.1", - "dependency_mode": "tree-shaking", + "dependency_mode": "recursive", "imported_dependencies": [], "complies_with_profiles": [], "imposed_profiles": [], - "timestamp": "2025-04-15T00:27:55.537600+00:00" + "timestamp": "2025-04-17T04:04:29.230227+00:00" } \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.metadata.json b/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.metadata.json new file mode 100644 index 0000000..c511066 --- /dev/null +++ b/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.metadata.json @@ -0,0 +1,14 @@ +{ + "package_name": "hl7.fhir.uv.extensions.r4", + "version": "5.2.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:41.588025+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.tgz b/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.tgz new file mode 100644 index 0000000..e3c6914 Binary files /dev/null and b/instance/fhir_packages/hl7.fhir.uv.extensions.r4-5.2.0.tgz differ diff --git a/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.metadata.json b/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.metadata.json new file mode 100644 index 0000000..62ccee2 --- /dev/null +++ b/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.metadata.json @@ -0,0 +1,22 @@ +{ + "package_name": "hl7.fhir.uv.ipa", + "version": "1.0.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + }, + { + "name": "hl7.terminology.r4", + "version": "5.0.0" + }, + { + "name": "hl7.fhir.uv.smart-app-launch", + "version": "2.0.0" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:49.395594+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.tgz b/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.tgz new file mode 100644 index 0000000..79f0584 Binary files /dev/null and b/instance/fhir_packages/hl7.fhir.uv.ipa-1.0.0.tgz differ diff --git a/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.metadata.json b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.metadata.json new file mode 100644 index 0000000..4cfc730 --- /dev/null +++ b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.metadata.json @@ -0,0 +1,14 @@ +{ + "package_name": "hl7.fhir.uv.smart-app-launch", + "version": "2.0.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:56.492512+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.tgz b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.tgz new file mode 100644 index 0000000..767a6df Binary files /dev/null and b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.0.0.tgz differ diff --git a/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.metadata.json b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.metadata.json new file mode 100644 index 0000000..118e25e --- /dev/null +++ b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.metadata.json @@ -0,0 +1,18 @@ +{ + "package_name": "hl7.fhir.uv.smart-app-launch", + "version": "2.1.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + }, + { + "name": "hl7.terminology.r4", + "version": "5.0.0" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:46.943079+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.tgz b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.tgz new file mode 100644 index 0000000..326c413 Binary files /dev/null and b/instance/fhir_packages/hl7.fhir.uv.smart-app-launch-2.1.0.tgz differ diff --git a/instance/fhir_packages/hl7.terminology.r4-5.0.0.metadata.json b/instance/fhir_packages/hl7.terminology.r4-5.0.0.metadata.json new file mode 100644 index 0000000..e421e45 --- /dev/null +++ b/instance/fhir_packages/hl7.terminology.r4-5.0.0.metadata.json @@ -0,0 +1,14 @@ +{ + "package_name": "hl7.terminology.r4", + "version": "5.0.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:54.857273+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.terminology.r4-5.0.0.tgz b/instance/fhir_packages/hl7.terminology.r4-5.0.0.tgz new file mode 100644 index 0000000..91a9345 Binary files /dev/null and b/instance/fhir_packages/hl7.terminology.r4-5.0.0.tgz differ diff --git a/instance/fhir_packages/hl7.terminology.r4-6.2.0.metadata.json b/instance/fhir_packages/hl7.terminology.r4-6.2.0.metadata.json new file mode 100644 index 0000000..de5d0e2 --- /dev/null +++ b/instance/fhir_packages/hl7.terminology.r4-6.2.0.metadata.json @@ -0,0 +1,14 @@ +{ + "package_name": "hl7.terminology.r4", + "version": "6.2.0", + "dependency_mode": "recursive", + "imported_dependencies": [ + { + "name": "hl7.fhir.r4.core", + "version": "4.0.1" + } + ], + "complies_with_profiles": [], + "imposed_profiles": [], + "timestamp": "2025-04-17T04:04:37.703082+00:00" +} \ No newline at end of file diff --git a/instance/fhir_packages/hl7.terminology.r4-6.2.0.tgz b/instance/fhir_packages/hl7.terminology.r4-6.2.0.tgz new file mode 100644 index 0000000..5f0aef5 Binary files /dev/null and b/instance/fhir_packages/hl7.terminology.r4-6.2.0.tgz differ diff --git a/logs/flask.log b/logs/flask.log new file mode 100644 index 0000000..79cd429 --- /dev/null +++ b/logs/flask.log @@ -0,0 +1,4 @@ + * Serving Flask app 'app' + * Debug mode: off + * Serving Flask app 'app' + * Debug mode: off diff --git a/logs/flask_err.log b/logs/flask_err.log new file mode 100644 index 0000000..07890d0 --- /dev/null +++ b/logs/flask_err.log @@ -0,0 +1,258 @@ +DEBUG:__main__:Instance path configuration: /app/instance +DEBUG:__main__:Database URI: sqlite:////app/instance/fhir_ig.db +DEBUG:__main__:Packages path: /app/instance/fhir_packages +DEBUG:__main__:Flask instance folder path: /app/instance +DEBUG:__main__:Directories created/verified: Instance: /app/instance, Packages: /app/instance/fhir_packages +DEBUG:__main__:Attempting to create database tables for URI: sqlite:////app/instance/fhir_ig.db +INFO:__main__:Database tables created successfully (if they didn't exist). +INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://172.19.0.2:5000 +INFO:werkzeug:Press CTRL+C to quit +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:30] "GET /fhir-ui-operations HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:30] "GET /static/FHIRFLARE.png HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:31] "GET /static/favicon.ico HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:36] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:36] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Scanning packages directory: /app/instance/fhir_packages +DEBUG:services:Parsed 'hl7.fhir.au.base-5.1.0-preview.tgz' -> name='hl7.fhir.au.base-5.1.0', version='preview' +DEBUG:services:Parsed 'hl7.fhir.au.core-1.1.0-preview.tgz' -> name='hl7.fhir.au.core-1.1.0', version='preview' +DEBUG:services:Parsed 'hl7.fhir.r4.core-4.0.1.tgz' -> name='hl7.fhir.r4.core', version='4.0.1' +DEBUG:services:Parsed 'hl7.fhir.uv.extensions.r4-5.2.0.tgz' -> name='hl7.fhir.uv.extensions.r4', version='5.2.0' +DEBUG:services:Parsed 'hl7.fhir.uv.ipa-1.0.0.tgz' -> name='hl7.fhir.uv.ipa', version='1.0.0' +DEBUG:services:Parsed 'hl7.fhir.uv.smart-app-launch-2.0.0.tgz' -> name='hl7.fhir.uv.smart-app-launch', version='2.0.0' +DEBUG:services:Parsed 'hl7.fhir.uv.smart-app-launch-2.1.0.tgz' -> name='hl7.fhir.uv.smart-app-launch', version='2.1.0' +DEBUG:services:Parsed 'hl7.terminology.r4-5.0.0.tgz' -> name='hl7.terminology.r4', version='5.0.0' +DEBUG:services:Parsed 'hl7.terminology.r4-6.2.0.tgz' -> name='hl7.terminology.r4', version='6.2.0' +DEBUG:__main__:Found packages: [{'name': 'hl7.fhir.au.base', 'version': '5.1.0-preview', 'filename': 'hl7.fhir.au.base-5.1.0-preview.tgz'}, {'name': 'hl7.fhir.au.core', 'version': '1.1.0-preview', 'filename': 'hl7.fhir.au.core-1.1.0-preview.tgz'}, {'name': 'hl7.fhir.r4.core', 'version': '4.0.1', 'filename': 'hl7.fhir.r4.core-4.0.1.tgz'}, {'name': 'hl7.fhir.uv.extensions.r4', 'version': '5.2.0', 'filename': 'hl7.fhir.uv.extensions.r4-5.2.0.tgz'}, {'name': 'hl7.fhir.uv.ipa', 'version': '1.0.0', 'filename': 'hl7.fhir.uv.ipa-1.0.0.tgz'}, {'name': 'hl7.fhir.uv.smart-app-launch', 'version': '2.0.0', 'filename': 'hl7.fhir.uv.smart-app-launch-2.0.0.tgz'}, {'name': 'hl7.fhir.uv.smart-app-launch', 'version': '2.1.0', 'filename': 'hl7.fhir.uv.smart-app-launch-2.1.0.tgz'}, {'name': 'hl7.terminology.r4', 'version': '5.0.0', 'filename': 'hl7.terminology.r4-5.0.0.tgz'}, {'name': 'hl7.terminology.r4', 'version': '6.2.0', 'filename': 'hl7.terminology.r4-6.2.0.tgz'}] +DEBUG:__main__:Errors during package listing: [] +DEBUG:__main__:Duplicate groups: {'hl7.fhir.uv.smart-app-launch': ['2.0.0', '2.1.0'], 'hl7.terminology.r4': ['5.0.0', '6.2.0']} +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:56] "GET /view-igs HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:56] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Viewing IG hl7.fhir.au.core-1.1.0#preview: 25 profiles, 17 base resources, 1 optional elements +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:59] "GET /view-ig/1 HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:25:59] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Attempting to find SD for 'Practitioner' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Searching for SD matching 'Practitioner' with profile 'None' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Found SD: id=au-core-allergyintolerance, name=AUCoreAllergyIntolerance, type=AllergyIntolerance, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-allergyintolerance, path=package/StructureDefinition-au-core-allergyintolerance.json +DEBUG:services:Found SD: id=au-core-bloodpressure, name=AUCoreBloodPressure, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bloodpressure, path=package/StructureDefinition-au-core-bloodpressure.json +DEBUG:services:Found SD: id=au-core-bodyheight, name=AUCoreBodyHeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyheight, path=package/StructureDefinition-au-core-bodyheight.json +DEBUG:services:Found SD: id=au-core-bodytemp, name=AUCoreBodyTemperature, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodytemp, path=package/StructureDefinition-au-core-bodytemp.json +DEBUG:services:Found SD: id=au-core-bodyweight, name=AUCoreBodyWeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyweight, path=package/StructureDefinition-au-core-bodyweight.json +DEBUG:services:Found SD: id=au-core-condition, name=AUCoreCondition, type=Condition, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-condition, path=package/StructureDefinition-au-core-condition.json +DEBUG:services:Found SD: id=au-core-diagnosticresult-path, name=AUCorePathologyResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult-path, path=package/StructureDefinition-au-core-diagnosticresult-path.json +DEBUG:services:Found SD: id=au-core-diagnosticresult, name=AUCoreDiagnosticResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult, path=package/StructureDefinition-au-core-diagnosticresult.json +DEBUG:services:Found SD: id=au-core-encounter, name=AUCoreEncounter, type=Encounter, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-encounter, path=package/StructureDefinition-au-core-encounter.json +DEBUG:services:Found SD: id=au-core-heartrate, name=AUCoreHeartRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-heartrate, path=package/StructureDefinition-au-core-heartrate.json +DEBUG:services:Found SD: id=au-core-immunization, name=AUCoreImmunization, type=Immunization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-immunization, path=package/StructureDefinition-au-core-immunization.json +DEBUG:services:Found SD: id=au-core-location, name=AUCoreLocation, type=Location, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-location, path=package/StructureDefinition-au-core-location.json +DEBUG:services:Found SD: id=au-core-medication, name=AUCoreMedication, type=Medication, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medication, path=package/StructureDefinition-au-core-medication.json +DEBUG:services:Found SD: id=au-core-medicationrequest, name=AUCoreMedicationRequest, type=MedicationRequest, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationrequest, path=package/StructureDefinition-au-core-medicationrequest.json +DEBUG:services:Found SD: id=au-core-medicationstatement, name=AUCoreMedicationStatement, type=MedicationStatement, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationstatement, path=package/StructureDefinition-au-core-medicationstatement.json +DEBUG:services:Found SD: id=au-core-organization, name=AUCoreOrganization, type=Organization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-organization, path=package/StructureDefinition-au-core-organization.json +DEBUG:services:Found SD: id=au-core-patient, name=AUCorePatient, type=Patient, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient, path=package/StructureDefinition-au-core-patient.json +DEBUG:services:Found SD: id=au-core-practitioner, name=AUCorePractitioner, type=Practitioner, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitioner, path=package/StructureDefinition-au-core-practitioner.json +INFO:services:Found matching SD for 'Practitioner' at path: package/StructureDefinition-au-core-practitioner.json +DEBUG:services:Found SD: id=au-core-practitionerrole, name=AUCorePractitionerRole, type=PractitionerRole, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitionerrole, path=package/StructureDefinition-au-core-practitionerrole.json +INFO:services:Found matching SD for 'Practitioner' at path: package/StructureDefinition-au-core-practitionerrole.json +DEBUG:services:Found SD: id=au-core-procedure, name=AUCoreProcedure, type=Procedure, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-procedure, path=package/StructureDefinition-au-core-procedure.json +DEBUG:services:Found SD: id=au-core-relatedperson, name=AUCoreRelatedPerson, type=RelatedPerson, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-relatedperson, path=package/StructureDefinition-au-core-relatedperson.json +DEBUG:services:Found SD: id=au-core-resprate, name=AUCoreRespirationRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-resprate, path=package/StructureDefinition-au-core-resprate.json +DEBUG:services:Found SD: id=au-core-rsg-sexassignedab, name=AUCoreSexAssignedAtBirth, type=Extension, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-rsg-sexassignedab, path=package/StructureDefinition-au-core-rsg-sexassignedab.json +DEBUG:services:Found SD: id=au-core-smokingstatus, name=AUCoreSmokingStatus, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-smokingstatus, path=package/StructureDefinition-au-core-smokingstatus.json +DEBUG:services:Found SD: id=au-core-waistcircum, name=AUCoreWaistCircumference, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-waistcircum, path=package/StructureDefinition-au-core-waistcircum.json +DEBUG:__main__:Retrieved 0 Must Support paths for 'Practitioner' from processed IG hl7.fhir.au.core-1.1.0#preview +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:26:04] "GET /get-structure?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&resource_type=Practitioner HTTP/1.1" 200 - +DEBUG:__main__:Attempting to find SD for 'au-core-practitioner' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Searching for SD matching 'au-core-practitioner' with profile 'None' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Found SD: id=au-core-allergyintolerance, name=AUCoreAllergyIntolerance, type=AllergyIntolerance, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-allergyintolerance, path=package/StructureDefinition-au-core-allergyintolerance.json +DEBUG:services:Found SD: id=au-core-bloodpressure, name=AUCoreBloodPressure, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bloodpressure, path=package/StructureDefinition-au-core-bloodpressure.json +DEBUG:services:Found SD: id=au-core-bodyheight, name=AUCoreBodyHeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyheight, path=package/StructureDefinition-au-core-bodyheight.json +DEBUG:services:Found SD: id=au-core-bodytemp, name=AUCoreBodyTemperature, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodytemp, path=package/StructureDefinition-au-core-bodytemp.json +DEBUG:services:Found SD: id=au-core-bodyweight, name=AUCoreBodyWeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyweight, path=package/StructureDefinition-au-core-bodyweight.json +DEBUG:services:Found SD: id=au-core-condition, name=AUCoreCondition, type=Condition, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-condition, path=package/StructureDefinition-au-core-condition.json +DEBUG:services:Found SD: id=au-core-diagnosticresult-path, name=AUCorePathologyResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult-path, path=package/StructureDefinition-au-core-diagnosticresult-path.json +DEBUG:services:Found SD: id=au-core-diagnosticresult, name=AUCoreDiagnosticResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult, path=package/StructureDefinition-au-core-diagnosticresult.json +DEBUG:services:Found SD: id=au-core-encounter, name=AUCoreEncounter, type=Encounter, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-encounter, path=package/StructureDefinition-au-core-encounter.json +DEBUG:services:Found SD: id=au-core-heartrate, name=AUCoreHeartRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-heartrate, path=package/StructureDefinition-au-core-heartrate.json +DEBUG:services:Found SD: id=au-core-immunization, name=AUCoreImmunization, type=Immunization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-immunization, path=package/StructureDefinition-au-core-immunization.json +DEBUG:services:Found SD: id=au-core-location, name=AUCoreLocation, type=Location, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-location, path=package/StructureDefinition-au-core-location.json +DEBUG:services:Found SD: id=au-core-medication, name=AUCoreMedication, type=Medication, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medication, path=package/StructureDefinition-au-core-medication.json +DEBUG:services:Found SD: id=au-core-medicationrequest, name=AUCoreMedicationRequest, type=MedicationRequest, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationrequest, path=package/StructureDefinition-au-core-medicationrequest.json +DEBUG:services:Found SD: id=au-core-medicationstatement, name=AUCoreMedicationStatement, type=MedicationStatement, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationstatement, path=package/StructureDefinition-au-core-medicationstatement.json +DEBUG:services:Found SD: id=au-core-organization, name=AUCoreOrganization, type=Organization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-organization, path=package/StructureDefinition-au-core-organization.json +DEBUG:services:Found SD: id=au-core-patient, name=AUCorePatient, type=Patient, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient, path=package/StructureDefinition-au-core-patient.json +DEBUG:services:Found SD: id=au-core-practitioner, name=AUCorePractitioner, type=Practitioner, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitioner, path=package/StructureDefinition-au-core-practitioner.json +INFO:services:Found matching SD for 'au-core-practitioner' at path: package/StructureDefinition-au-core-practitioner.json +DEBUG:services:Found SD: id=au-core-practitionerrole, name=AUCorePractitionerRole, type=PractitionerRole, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitionerrole, path=package/StructureDefinition-au-core-practitionerrole.json +INFO:services:Found matching SD for 'au-core-practitioner' at path: package/StructureDefinition-au-core-practitionerrole.json +DEBUG:services:Found SD: id=au-core-procedure, name=AUCoreProcedure, type=Procedure, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-procedure, path=package/StructureDefinition-au-core-procedure.json +DEBUG:services:Found SD: id=au-core-relatedperson, name=AUCoreRelatedPerson, type=RelatedPerson, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-relatedperson, path=package/StructureDefinition-au-core-relatedperson.json +DEBUG:services:Found SD: id=au-core-resprate, name=AUCoreRespirationRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-resprate, path=package/StructureDefinition-au-core-resprate.json +DEBUG:services:Found SD: id=au-core-rsg-sexassignedab, name=AUCoreSexAssignedAtBirth, type=Extension, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-rsg-sexassignedab, path=package/StructureDefinition-au-core-rsg-sexassignedab.json +DEBUG:services:Found SD: id=au-core-smokingstatus, name=AUCoreSmokingStatus, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-smokingstatus, path=package/StructureDefinition-au-core-smokingstatus.json +DEBUG:services:Found SD: id=au-core-waistcircum, name=AUCoreWaistCircumference, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-waistcircum, path=package/StructureDefinition-au-core-waistcircum.json +DEBUG:__main__:Retrieved 5 Must Support paths for 'au-core-practitioner' from processed IG hl7.fhir.au.core-1.1.0#preview +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:26:15] "GET /get-structure?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&resource_type=au-core-practitioner HTTP/1.1" 200 - +DEBUG:__main__:Attempting to find SD for 'au-core-patient' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Searching for SD matching 'au-core-patient' with profile 'None' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Found SD: id=au-core-allergyintolerance, name=AUCoreAllergyIntolerance, type=AllergyIntolerance, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-allergyintolerance, path=package/StructureDefinition-au-core-allergyintolerance.json +DEBUG:services:Found SD: id=au-core-bloodpressure, name=AUCoreBloodPressure, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bloodpressure, path=package/StructureDefinition-au-core-bloodpressure.json +DEBUG:services:Found SD: id=au-core-bodyheight, name=AUCoreBodyHeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyheight, path=package/StructureDefinition-au-core-bodyheight.json +DEBUG:services:Found SD: id=au-core-bodytemp, name=AUCoreBodyTemperature, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodytemp, path=package/StructureDefinition-au-core-bodytemp.json +DEBUG:services:Found SD: id=au-core-bodyweight, name=AUCoreBodyWeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyweight, path=package/StructureDefinition-au-core-bodyweight.json +DEBUG:services:Found SD: id=au-core-condition, name=AUCoreCondition, type=Condition, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-condition, path=package/StructureDefinition-au-core-condition.json +DEBUG:services:Found SD: id=au-core-diagnosticresult-path, name=AUCorePathologyResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult-path, path=package/StructureDefinition-au-core-diagnosticresult-path.json +DEBUG:services:Found SD: id=au-core-diagnosticresult, name=AUCoreDiagnosticResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult, path=package/StructureDefinition-au-core-diagnosticresult.json +DEBUG:services:Found SD: id=au-core-encounter, name=AUCoreEncounter, type=Encounter, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-encounter, path=package/StructureDefinition-au-core-encounter.json +DEBUG:services:Found SD: id=au-core-heartrate, name=AUCoreHeartRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-heartrate, path=package/StructureDefinition-au-core-heartrate.json +DEBUG:services:Found SD: id=au-core-immunization, name=AUCoreImmunization, type=Immunization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-immunization, path=package/StructureDefinition-au-core-immunization.json +DEBUG:services:Found SD: id=au-core-location, name=AUCoreLocation, type=Location, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-location, path=package/StructureDefinition-au-core-location.json +DEBUG:services:Found SD: id=au-core-medication, name=AUCoreMedication, type=Medication, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medication, path=package/StructureDefinition-au-core-medication.json +DEBUG:services:Found SD: id=au-core-medicationrequest, name=AUCoreMedicationRequest, type=MedicationRequest, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationrequest, path=package/StructureDefinition-au-core-medicationrequest.json +DEBUG:services:Found SD: id=au-core-medicationstatement, name=AUCoreMedicationStatement, type=MedicationStatement, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationstatement, path=package/StructureDefinition-au-core-medicationstatement.json +DEBUG:services:Found SD: id=au-core-organization, name=AUCoreOrganization, type=Organization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-organization, path=package/StructureDefinition-au-core-organization.json +DEBUG:services:Found SD: id=au-core-patient, name=AUCorePatient, type=Patient, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient, path=package/StructureDefinition-au-core-patient.json +INFO:services:Found matching SD for 'au-core-patient' at path: package/StructureDefinition-au-core-patient.json +DEBUG:services:Found SD: id=au-core-practitioner, name=AUCorePractitioner, type=Practitioner, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitioner, path=package/StructureDefinition-au-core-practitioner.json +DEBUG:services:Found SD: id=au-core-practitionerrole, name=AUCorePractitionerRole, type=PractitionerRole, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitionerrole, path=package/StructureDefinition-au-core-practitionerrole.json +DEBUG:services:Found SD: id=au-core-procedure, name=AUCoreProcedure, type=Procedure, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-procedure, path=package/StructureDefinition-au-core-procedure.json +DEBUG:services:Found SD: id=au-core-relatedperson, name=AUCoreRelatedPerson, type=RelatedPerson, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-relatedperson, path=package/StructureDefinition-au-core-relatedperson.json +DEBUG:services:Found SD: id=au-core-resprate, name=AUCoreRespirationRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-resprate, path=package/StructureDefinition-au-core-resprate.json +DEBUG:services:Found SD: id=au-core-rsg-sexassignedab, name=AUCoreSexAssignedAtBirth, type=Extension, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-rsg-sexassignedab, path=package/StructureDefinition-au-core-rsg-sexassignedab.json +DEBUG:services:Found SD: id=au-core-smokingstatus, name=AUCoreSmokingStatus, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-smokingstatus, path=package/StructureDefinition-au-core-smokingstatus.json +DEBUG:services:Found SD: id=au-core-waistcircum, name=AUCoreWaistCircumference, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-waistcircum, path=package/StructureDefinition-au-core-waistcircum.json +DEBUG:__main__:Retrieved 19 Must Support paths for 'au-core-patient' from processed IG hl7.fhir.au.core-1.1.0#preview +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:26:16] "GET /get-structure?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&resource_type=au-core-patient HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:26:19] "GET /get-example?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&filename=package/example/Patient-banks-mia-leanne.json HTTP/1.1" 200 - +DEBUG:services:Processed input: /tmp/tmph9efztgj/input.json +ERROR:app:Exception on /fsh-converter [POST] +Traceback (most recent call last): + File "/app/venv/lib/python3.12/site-packages/flask/app.py", line 2190, in wsgi_app + response = self.full_dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/venv/lib/python3.12/site-packages/flask/app.py", line 1486, in full_dispatch_request + rv = self.handle_user_exception(e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/venv/lib/python3.12/site-packages/flask/app.py", line 1484, in full_dispatch_request + rv = self.dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/venv/lib/python3.12/site-packages/flask/app.py", line 1469, in dispatch_request + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/app.py", line 985, in fsh_converter + output_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'fsh_output') + ~~~~~~~~~~^^^^^^^^^^^^^^^^^ +KeyError: 'UPLOAD_FOLDER' +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:28:22] "POST /fsh-converter HTTP/1.1" 500 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:28:22] "GET /favicon.ico HTTP/1.1" 404 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:46] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:46] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:46] "GET /static/favicon.ico HTTP/1.1" 304 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:48] "GET / HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:48] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Scanning packages directory: /app/instance/fhir_packages +DEBUG:services:Parsed 'hl7.fhir.au.base-5.1.0-preview.tgz' -> name='hl7.fhir.au.base-5.1.0', version='preview' +DEBUG:services:Parsed 'hl7.fhir.au.core-1.1.0-preview.tgz' -> name='hl7.fhir.au.core-1.1.0', version='preview' +DEBUG:services:Parsed 'hl7.fhir.r4.core-4.0.1.tgz' -> name='hl7.fhir.r4.core', version='4.0.1' +DEBUG:services:Parsed 'hl7.fhir.uv.extensions.r4-5.2.0.tgz' -> name='hl7.fhir.uv.extensions.r4', version='5.2.0' +DEBUG:services:Parsed 'hl7.fhir.uv.ipa-1.0.0.tgz' -> name='hl7.fhir.uv.ipa', version='1.0.0' +DEBUG:services:Parsed 'hl7.fhir.uv.smart-app-launch-2.0.0.tgz' -> name='hl7.fhir.uv.smart-app-launch', version='2.0.0' +DEBUG:services:Parsed 'hl7.fhir.uv.smart-app-launch-2.1.0.tgz' -> name='hl7.fhir.uv.smart-app-launch', version='2.1.0' +DEBUG:services:Parsed 'hl7.terminology.r4-5.0.0.tgz' -> name='hl7.terminology.r4', version='5.0.0' +DEBUG:services:Parsed 'hl7.terminology.r4-6.2.0.tgz' -> name='hl7.terminology.r4', version='6.2.0' +DEBUG:__main__:Found packages: [{'name': 'hl7.fhir.au.base', 'version': '5.1.0-preview', 'filename': 'hl7.fhir.au.base-5.1.0-preview.tgz'}, {'name': 'hl7.fhir.au.core', 'version': '1.1.0-preview', 'filename': 'hl7.fhir.au.core-1.1.0-preview.tgz'}, {'name': 'hl7.fhir.r4.core', 'version': '4.0.1', 'filename': 'hl7.fhir.r4.core-4.0.1.tgz'}, {'name': 'hl7.fhir.uv.extensions.r4', 'version': '5.2.0', 'filename': 'hl7.fhir.uv.extensions.r4-5.2.0.tgz'}, {'name': 'hl7.fhir.uv.ipa', 'version': '1.0.0', 'filename': 'hl7.fhir.uv.ipa-1.0.0.tgz'}, {'name': 'hl7.fhir.uv.smart-app-launch', 'version': '2.0.0', 'filename': 'hl7.fhir.uv.smart-app-launch-2.0.0.tgz'}, {'name': 'hl7.fhir.uv.smart-app-launch', 'version': '2.1.0', 'filename': 'hl7.fhir.uv.smart-app-launch-2.1.0.tgz'}, {'name': 'hl7.terminology.r4', 'version': '5.0.0', 'filename': 'hl7.terminology.r4-5.0.0.tgz'}, {'name': 'hl7.terminology.r4', 'version': '6.2.0', 'filename': 'hl7.terminology.r4-6.2.0.tgz'}] +DEBUG:__main__:Errors during package listing: [] +DEBUG:__main__:Duplicate groups: {'hl7.fhir.uv.smart-app-launch': ['2.0.0', '2.1.0'], 'hl7.terminology.r4': ['5.0.0', '6.2.0']} +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:52] "GET /view-igs HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:52] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:57] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 06:45:57] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Instance path configuration: /app/instance +DEBUG:__main__:Database URI: sqlite:////app/instance/fhir_ig.db +DEBUG:__main__:Packages path: /app/instance/fhir_packages +DEBUG:__main__:Flask instance folder path: /app/instance +DEBUG:__main__:Directories created/verified: Instance: /app/instance, Packages: /app/instance/fhir_packages +DEBUG:__main__:Attempting to create database tables for URI: sqlite:////app/instance/fhir_ig.db +INFO:__main__:Database tables created successfully (if they didn't exist). +INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://172.19.0.2:5000 +INFO:werkzeug:Press CTRL+C to quit +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:09] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:09] "GET /static/FHIRFLARE.png HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:09] "GET /static/favicon.ico HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:13] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:13] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +DEBUG:__main__:Attempting to find SD for 'au-core-allergyintolerance' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Searching for SD matching 'au-core-allergyintolerance' with profile 'None' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Found SD: id=au-core-allergyintolerance, name=AUCoreAllergyIntolerance, type=AllergyIntolerance, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-allergyintolerance, path=package/StructureDefinition-au-core-allergyintolerance.json +INFO:services:Found matching SD for 'au-core-allergyintolerance' at path: package/StructureDefinition-au-core-allergyintolerance.json +DEBUG:services:Found SD: id=au-core-bloodpressure, name=AUCoreBloodPressure, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bloodpressure, path=package/StructureDefinition-au-core-bloodpressure.json +DEBUG:services:Found SD: id=au-core-bodyheight, name=AUCoreBodyHeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyheight, path=package/StructureDefinition-au-core-bodyheight.json +DEBUG:services:Found SD: id=au-core-bodytemp, name=AUCoreBodyTemperature, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodytemp, path=package/StructureDefinition-au-core-bodytemp.json +DEBUG:services:Found SD: id=au-core-bodyweight, name=AUCoreBodyWeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyweight, path=package/StructureDefinition-au-core-bodyweight.json +DEBUG:services:Found SD: id=au-core-condition, name=AUCoreCondition, type=Condition, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-condition, path=package/StructureDefinition-au-core-condition.json +DEBUG:services:Found SD: id=au-core-diagnosticresult-path, name=AUCorePathologyResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult-path, path=package/StructureDefinition-au-core-diagnosticresult-path.json +DEBUG:services:Found SD: id=au-core-diagnosticresult, name=AUCoreDiagnosticResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult, path=package/StructureDefinition-au-core-diagnosticresult.json +DEBUG:services:Found SD: id=au-core-encounter, name=AUCoreEncounter, type=Encounter, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-encounter, path=package/StructureDefinition-au-core-encounter.json +DEBUG:services:Found SD: id=au-core-heartrate, name=AUCoreHeartRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-heartrate, path=package/StructureDefinition-au-core-heartrate.json +DEBUG:services:Found SD: id=au-core-immunization, name=AUCoreImmunization, type=Immunization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-immunization, path=package/StructureDefinition-au-core-immunization.json +DEBUG:services:Found SD: id=au-core-location, name=AUCoreLocation, type=Location, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-location, path=package/StructureDefinition-au-core-location.json +DEBUG:services:Found SD: id=au-core-medication, name=AUCoreMedication, type=Medication, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medication, path=package/StructureDefinition-au-core-medication.json +DEBUG:services:Found SD: id=au-core-medicationrequest, name=AUCoreMedicationRequest, type=MedicationRequest, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationrequest, path=package/StructureDefinition-au-core-medicationrequest.json +DEBUG:services:Found SD: id=au-core-medicationstatement, name=AUCoreMedicationStatement, type=MedicationStatement, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationstatement, path=package/StructureDefinition-au-core-medicationstatement.json +DEBUG:services:Found SD: id=au-core-organization, name=AUCoreOrganization, type=Organization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-organization, path=package/StructureDefinition-au-core-organization.json +DEBUG:services:Found SD: id=au-core-patient, name=AUCorePatient, type=Patient, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient, path=package/StructureDefinition-au-core-patient.json +DEBUG:services:Found SD: id=au-core-practitioner, name=AUCorePractitioner, type=Practitioner, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitioner, path=package/StructureDefinition-au-core-practitioner.json +DEBUG:services:Found SD: id=au-core-practitionerrole, name=AUCorePractitionerRole, type=PractitionerRole, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitionerrole, path=package/StructureDefinition-au-core-practitionerrole.json +DEBUG:services:Found SD: id=au-core-procedure, name=AUCoreProcedure, type=Procedure, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-procedure, path=package/StructureDefinition-au-core-procedure.json +DEBUG:services:Found SD: id=au-core-relatedperson, name=AUCoreRelatedPerson, type=RelatedPerson, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-relatedperson, path=package/StructureDefinition-au-core-relatedperson.json +DEBUG:services:Found SD: id=au-core-resprate, name=AUCoreRespirationRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-resprate, path=package/StructureDefinition-au-core-resprate.json +DEBUG:services:Found SD: id=au-core-rsg-sexassignedab, name=AUCoreSexAssignedAtBirth, type=Extension, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-rsg-sexassignedab, path=package/StructureDefinition-au-core-rsg-sexassignedab.json +DEBUG:services:Found SD: id=au-core-smokingstatus, name=AUCoreSmokingStatus, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-smokingstatus, path=package/StructureDefinition-au-core-smokingstatus.json +DEBUG:services:Found SD: id=au-core-waistcircum, name=AUCoreWaistCircumference, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-waistcircum, path=package/StructureDefinition-au-core-waistcircum.json +DEBUG:__main__:Retrieved 8 Must Support paths for 'au-core-allergyintolerance' from processed IG hl7.fhir.au.core-1.1.0#preview +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:27] "GET /get-structure?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&resource_type=au-core-allergyintolerance HTTP/1.1" 200 - +DEBUG:__main__:Attempting to find SD for 'au-core-patient' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Searching for SD matching 'au-core-patient' with profile 'None' in hl7.fhir.au.core-1.1.0-preview.tgz +DEBUG:services:Found SD: id=au-core-allergyintolerance, name=AUCoreAllergyIntolerance, type=AllergyIntolerance, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-allergyintolerance, path=package/StructureDefinition-au-core-allergyintolerance.json +DEBUG:services:Found SD: id=au-core-bloodpressure, name=AUCoreBloodPressure, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bloodpressure, path=package/StructureDefinition-au-core-bloodpressure.json +DEBUG:services:Found SD: id=au-core-bodyheight, name=AUCoreBodyHeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyheight, path=package/StructureDefinition-au-core-bodyheight.json +DEBUG:services:Found SD: id=au-core-bodytemp, name=AUCoreBodyTemperature, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodytemp, path=package/StructureDefinition-au-core-bodytemp.json +DEBUG:services:Found SD: id=au-core-bodyweight, name=AUCoreBodyWeight, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-bodyweight, path=package/StructureDefinition-au-core-bodyweight.json +DEBUG:services:Found SD: id=au-core-condition, name=AUCoreCondition, type=Condition, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-condition, path=package/StructureDefinition-au-core-condition.json +DEBUG:services:Found SD: id=au-core-diagnosticresult-path, name=AUCorePathologyResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult-path, path=package/StructureDefinition-au-core-diagnosticresult-path.json +DEBUG:services:Found SD: id=au-core-diagnosticresult, name=AUCoreDiagnosticResult, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-diagnosticresult, path=package/StructureDefinition-au-core-diagnosticresult.json +DEBUG:services:Found SD: id=au-core-encounter, name=AUCoreEncounter, type=Encounter, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-encounter, path=package/StructureDefinition-au-core-encounter.json +DEBUG:services:Found SD: id=au-core-heartrate, name=AUCoreHeartRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-heartrate, path=package/StructureDefinition-au-core-heartrate.json +DEBUG:services:Found SD: id=au-core-immunization, name=AUCoreImmunization, type=Immunization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-immunization, path=package/StructureDefinition-au-core-immunization.json +DEBUG:services:Found SD: id=au-core-location, name=AUCoreLocation, type=Location, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-location, path=package/StructureDefinition-au-core-location.json +DEBUG:services:Found SD: id=au-core-medication, name=AUCoreMedication, type=Medication, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medication, path=package/StructureDefinition-au-core-medication.json +DEBUG:services:Found SD: id=au-core-medicationrequest, name=AUCoreMedicationRequest, type=MedicationRequest, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationrequest, path=package/StructureDefinition-au-core-medicationrequest.json +DEBUG:services:Found SD: id=au-core-medicationstatement, name=AUCoreMedicationStatement, type=MedicationStatement, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-medicationstatement, path=package/StructureDefinition-au-core-medicationstatement.json +DEBUG:services:Found SD: id=au-core-organization, name=AUCoreOrganization, type=Organization, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-organization, path=package/StructureDefinition-au-core-organization.json +DEBUG:services:Found SD: id=au-core-patient, name=AUCorePatient, type=Patient, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient, path=package/StructureDefinition-au-core-patient.json +INFO:services:Found matching SD for 'au-core-patient' at path: package/StructureDefinition-au-core-patient.json +DEBUG:services:Found SD: id=au-core-practitioner, name=AUCorePractitioner, type=Practitioner, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitioner, path=package/StructureDefinition-au-core-practitioner.json +DEBUG:services:Found SD: id=au-core-practitionerrole, name=AUCorePractitionerRole, type=PractitionerRole, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-practitionerrole, path=package/StructureDefinition-au-core-practitionerrole.json +DEBUG:services:Found SD: id=au-core-procedure, name=AUCoreProcedure, type=Procedure, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-procedure, path=package/StructureDefinition-au-core-procedure.json +DEBUG:services:Found SD: id=au-core-relatedperson, name=AUCoreRelatedPerson, type=RelatedPerson, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-relatedperson, path=package/StructureDefinition-au-core-relatedperson.json +DEBUG:services:Found SD: id=au-core-resprate, name=AUCoreRespirationRate, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-resprate, path=package/StructureDefinition-au-core-resprate.json +DEBUG:services:Found SD: id=au-core-rsg-sexassignedab, name=AUCoreSexAssignedAtBirth, type=Extension, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-rsg-sexassignedab, path=package/StructureDefinition-au-core-rsg-sexassignedab.json +DEBUG:services:Found SD: id=au-core-smokingstatus, name=AUCoreSmokingStatus, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-smokingstatus, path=package/StructureDefinition-au-core-smokingstatus.json +DEBUG:services:Found SD: id=au-core-waistcircum, name=AUCoreWaistCircumference, type=Observation, url=http://hl7.org.au/fhir/core/StructureDefinition/au-core-waistcircum, path=package/StructureDefinition-au-core-waistcircum.json +DEBUG:__main__:Retrieved 19 Must Support paths for 'au-core-patient' from processed IG hl7.fhir.au.core-1.1.0#preview +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:28] "GET /get-structure?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&resource_type=au-core-patient HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:09:32] "GET /get-example?package_name=hl7.fhir.au.core-1.1.0&package_version=preview&filename=package/example/Patient-banks-mia-leanne.json HTTP/1.1" 200 - +DEBUG:services:Processed input: /tmp/tmpgwv6g5vl/input.json +INFO:services:GoFSH executed successfully for /tmp/tmpgwv6g5vl/input.json +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:10:23] "POST /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:10:23] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:11:09] "GET /download-fsh HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:16:19] "GET /fhir HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:16:19] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:16:56] "GET /fsh-converter HTTP/1.1" 200 - +INFO:werkzeug:172.19.0.1 - - [17/Apr/2025 07:16:56] "GET /static/FHIRFLARE.png HTTP/1.1" 304 - diff --git a/logs/supervisord.log b/logs/supervisord.log new file mode 100644 index 0000000..23623ba --- /dev/null +++ b/logs/supervisord.log @@ -0,0 +1,17 @@ +2025-04-17 06:25:17,514 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message. +2025-04-17 06:25:17,521 INFO supervisord started with pid 1 +2025-04-17 06:25:18,537 INFO spawned: 'flask' with pid 7 +2025-04-17 06:25:18,542 INFO spawned: 'tomcat' with pid 8 +2025-04-17 06:25:29,060 INFO success: flask entered RUNNING state, process has stayed up for > than 10 seconds (startsecs) +2025-04-17 06:25:48,549 INFO success: tomcat entered RUNNING state, process has stayed up for > than 30 seconds (startsecs) +2025-04-17 07:05:48,346 WARN received SIGTERM indicating exit request +2025-04-17 07:05:48,354 INFO waiting for flask, tomcat to die +2025-04-17 07:05:51,475 WARN stopped: tomcat (exit status 143) +2025-04-17 07:05:51,483 INFO waiting for flask to die +2025-04-17 07:05:52,495 WARN stopped: flask (terminated by SIGTERM) +2025-04-17 07:08:06,100 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message. +2025-04-17 07:08:06,109 INFO supervisord started with pid 1 +2025-04-17 07:08:07,117 INFO spawned: 'flask' with pid 7 +2025-04-17 07:08:07,122 INFO spawned: 'tomcat' with pid 8 +2025-04-17 07:08:17,381 INFO success: flask entered RUNNING state, process has stayed up for > than 10 seconds (startsecs) +2025-04-17 07:08:37,990 INFO success: tomcat entered RUNNING state, process has stayed up for > than 30 seconds (startsecs) diff --git a/logs/supervisord.pid b/logs/supervisord.pid new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/logs/supervisord.pid @@ -0,0 +1 @@ +1 diff --git a/logs/tomcat.log b/logs/tomcat.log new file mode 100644 index 0000000..5f2e2e7 --- /dev/null +++ b/logs/tomcat.log @@ -0,0 +1,368 @@ + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + + :: Spring Boot :: (v3.3.5) + +2025-04-17T06:25:41.168Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : Starting Application using Java 17.0.14 with PID 8 (/usr/local/tomcat/webapps/ROOT/WEB-INF/classes started by root in /usr/local/tomcat) +2025-04-17T06:25:41.173Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : No active profile set, falling back to 1 default profile: "default" +2025-04-17T06:25:43.114Z INFO 8 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-04-17T06:25:43.465Z INFO 8 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 338 ms. Found 52 JPA repository interfaces. +2025-04-17T06:25:47.008Z WARN 8 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'ca.uhn.fhir.jpa.config.BeanPostProcessorConfig' of type [ca.uhn.fhir.jpa.config.BeanPostProcessorConfig$$SpringCGLIB$$0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). The currently created BeanPostProcessor [persistenceExceptionTranslationPostProcessor] is declared through a non-static factory method on that class; consider declaring it as static instead. +2025-04-17T06:25:47.312Z INFO 8 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6089 ms +2025-04-17T06:25:47.688Z INFO 8 --- [ main] ca.uhn.fhir.util.VersionUtil : HAPI FHIR version 8.0.0 - Rev 091beb6d18 +2025-04-17T06:25:47.701Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T06:25:47.820Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to allow contains searches +2025-04-17T06:25:47.821Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to deny multiple deletes +2025-04-17T06:25:47.822Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to deny external references +2025-04-17T06:25:47.823Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable DAO scheduling +2025-04-17T06:25:47.823Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to disable delete expunges +2025-04-17T06:25:47.824Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable expunges +2025-04-17T06:25:47.824Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to allow overriding default search params +2025-04-17T06:25:47.825Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to disable auto-creating placeholder references +2025-04-17T06:25:47.825Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to auto-version references at paths [] +2025-04-17T06:25:47.826Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable value set pre-expansion +2025-04-17T06:25:47.826Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable value set pre-expansion task +2025-04-17T06:25:47.826Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for pre-expand value set default count of 1000 +2025-04-17T06:25:47.826Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for pre-expand value set max count of 1000 +2025-04-17T06:25:47.826Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for maximum expansion size of 1000 +2025-04-17T06:25:47.878Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to have a maximum fetch size of 'unlimited' +2025-04-17T06:25:47.879Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to cache search results for 60000 milliseconds +2025-04-17T06:25:47.879Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to use 'ALPHANUMERIC' Client ID Strategy +2025-04-17T06:25:48.139Z INFO 8 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: HAPI_PU] +2025-04-17T06:25:48.494Z INFO 8 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.4.Final +2025-04-17T06:25:48.547Z INFO 8 --- [ main] .f.j.l.FilteringSqlLoggerImplContributor : Adding service: SqlStatementFilteringLogger +2025-04-17T06:25:48.743Z INFO 8 --- [ main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled +2025-04-17T06:25:49.196Z INFO 8 --- [ main] o.h.e.boot.internal.EnversServiceImpl : Envers integration enabled? : true +2025-04-17T06:25:49.780Z INFO 8 --- [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer +2025-04-17T06:25:49.878Z INFO 8 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17T06:25:51.263Z INFO 8 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn1: url=jdbc:h2:file:/app/h2-data/fhir user=SA +2025-04-17T06:25:51.269Z INFO 8 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17T06:25:51.433Z INFO 8 --- [ main] org.hibernate.orm.connections.pooling : HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2025-04-17T06:25:53.533Z INFO 8 --- [ main] b.i.HibernateSearchPreIntegrationService : HSEARCH000034: Hibernate Search version 7.2.1.Final +2025-04-17T06:25:53.763Z INFO 8 --- [ main] o.h.e.c.i.m.AuditMetadataGenerator : Adding properties for entity: ca.uhn.fhir.jpa.entity.MdmLink +2025-04-17T06:25:58.698Z INFO 8 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2025-04-17T06:25:59.508Z INFO 8 --- [ main] irLocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'HAPI_PU' +2025-04-17T06:26:01.166Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-resources.xml +2025-04-17T06:26:01.191Z INFO 8 --- [ main] ca.uhn.fhir.util.XmlUtil : FHIR XML procesing will use StAX implementation 'Woodstox' version '6.4.0' +2025-04-17T06:26:02.561Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-types.xml +2025-04-17T06:26:02.707Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-others.xml +2025-04-17T06:26:03.137Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/extension/extension-definitions.xml +2025-04-17T06:26:04.442Z INFO 8 --- [ main] o.s.d.j.r.query.QueryEnhancerFactory : Hibernate is in classpath; If applicable, HQL parser will be used. +2025-04-17T06:26:10.654Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Creating Local Scheduler +2025-04-17T06:26:10.739Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T06:26:10.772Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T06:26:10.772Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T06:26:10.774Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T06:26:10.776Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'hapi-fhir-jpa-scheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 4 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T06:26:10.776Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'hapi-fhir-jpa-scheduler' initialized from an externally provided properties instance. +2025-04-17T06:26:10.776Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T06:26:10.777Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory@493c19fd +2025-04-17T06:26:10.777Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T06:26:10.778Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Creating Clustered Scheduler +2025-04-17T06:26:10.780Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T06:26:10.790Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T06:26:10.790Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T06:26:10.791Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T06:26:10.791Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'hapi-fhir-jpa-scheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 4 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T06:26:10.791Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'hapi-fhir-jpa-scheduler' initialized from an externally provided properties instance. +2025-04-17T06:26:10.791Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T06:26:10.792Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory@493c19fd +2025-04-17T06:26:10.792Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T06:26:11.644Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.645Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 1ms +2025-04-17T06:26:11.658Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.661Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 3ms +2025-04-17T06:26:11.663Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.664Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 1ms +2025-04-17T06:26:11.665Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.666Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 1ms +2025-04-17T06:26:11.668Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.669Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 1ms +2025-04-17T06:26:11.671Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T06:26:11.672Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 1ms +2025-04-17T06:26:11.820Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T06:26:12.275Z INFO 8 --- [ main] c.u.f.j.starter.common.StarterJpaConfig : CORS is enabled on this server +2025-04-17T06:26:12.280Z INFO 8 --- [ main] c.u.f.j.starter.common.StarterJpaConfig : CORS allows the following origins: * +2025-04-17T06:26:12.330Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R5] +2025-04-17T06:26:20.902Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T06:26:22.510Z WARN 8 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-04-17T06:26:23.228Z INFO 8 --- [ main] .s.i.SubscriptionSubmitInterceptorLoader : Subscriptions are disabled on this server. Subscriptions will not be activated and incoming resources will not be matched against subscriptions. +2025-04-17T06:26:24.173Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T06:26:24.190Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3d31c83e +2025-04-17T06:26:24.251Z INFO 8 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator' +2025-04-17T06:26:24.502Z INFO 8 --- [ main] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17T06:26:24.503Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17T06:26:24.509Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_IMPORT_PULL / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: REINDEX / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: REINDEX / 2 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: DELETE_EXPUNGE / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_EXPORT / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_EXPORT / 2 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: termCodeSystemVersionDeleteJob / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: termCodeSystemDeleteJob / 1 +2025-04-17T06:26:24.510Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: bulkImportJob / 1 +2025-04-17T06:26:24.512Z INFO 8 --- [ main] .j.s.m.m.s.MatchingQueueSubscriberLoader : Subscription Matching Subscriber subscribed to Matching Channel ca.uhn.fhir.jpa.subscription.channel.subscription.BroadcastingSubscribableChannelWrapper with name subscription-matching +2025-04-17T06:26:25.538Z INFO 8 --- [ main] c.u.f.j.s.registry.JpaSearchParamCache : Have 0 unique search params +2025-04-17T06:26:25.611Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling 15 jobs in application +2025-04-17T06:26:25.614Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.term.TermDeferredStorageSvcImpl$Job with interval 5000ms +2025-04-17T06:26:25.623Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl with interval 00:00:10.000 +2025-04-17T06:26:25.625Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.reindex.ResourceReindexingSvcImpl with interval 00:00:10.000 +2025-04-17T06:26:25.627Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.bulk.export.svc.BulkDataExportJobSchedulingHelperImpl$PurgeExpiredFilesJob with interval 01:00:00 +2025-04-17T06:26:25.630Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.bulk.imprt.svc.BulkDataImportSvcImpl$ActivationJob with interval 00:00:10.000 +2025-04-17T06:26:25.632Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.warm.CacheWarmingSvcImpl with interval 00:00:10.000 +2025-04-17T06:26:25.633Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.term.TermReadSvcImpl with interval 00:10:00 +2025-04-17T06:26:25.634Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.term.TermReindexingSvcImpl with interval 00:01:00.000 +2025-04-17T06:26:25.636Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.SearchUrlJobMaintenanceSvcImpl$SearchUrlMaintenanceJob with interval 00:10:00 +2025-04-17T06:26:25.638Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl with interval 00:01:00.000 +2025-04-17T06:26:25.639Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.util.ResourceCountCache with interval 00:10:00 +2025-04-17T06:26:25.640Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.subscription.triggering.SubscriptionTriggeringSvcImpl with interval 5000ms +2025-04-17T06:26:25.642Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.subscription.async.AsyncResourceModifiedProcessingSchedulerSvc with interval 5000ms +2025-04-17T06:26:25.642Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.batch2.coordinator.ReductionStepExecutorServiceImpl$ReductionStepExecutorScheduledJob with interval 00:00:10.000 +2025-04-17T06:26:25.642Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.batch2.maintenance.JobMaintenanceServiceImpl$JobMaintenanceScheduledJob with interval 00:01:00.000 +2025-04-17T06:26:25.643Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Starting task schedulers for context application +2025-04-17T06:26:25.643Z INFO 8 --- [ main] c.uhn.fhir.jpa.sched.BaseHapiScheduler : Starting scheduler hapi-fhir-jpa-scheduler-local +2025-04-17T06:26:25.643Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED started. +2025-04-17T06:26:25.643Z INFO 8 --- [ main] c.uhn.fhir.jpa.sched.BaseHapiScheduler : Starting scheduler hapi-fhir-jpa-scheduler-clustered +2025-04-17T06:26:25.644Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED started. +2025-04-17T06:26:25.644Z WARN 8 --- [ main] u.f.j.u.PartitionedIdModeVerificationSvc : Dialect is not a HAPI FHIR dialect: org.hibernate.dialect.H2Dialect, version: 2.3.232 +2025-04-17T06:26:25.648Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : Started Application in 45.501 seconds (process running for 67.034) +2025-04-17T06:26:25.684Z INFO 8 --- [ler-clustered-2] .s.BulkDataExportJobSchedulingHelperImpl : Finished bulk export job deletion with nothing to do +2025-04-17T06:26:25.767Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Initializing HAPI FHIR restful server running in R4 mode +2025-04-17T06:26:25.769Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Added 147 resource provider(s). Total 147 +2025-04-17T06:26:26.644Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Added 5 plain provider(s). Total 5 +2025-04-17T06:26:26.655Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Removing RESTful methods for: class ca.uhn.fhir.jpa.provider.JpaCapabilityStatementProvider +2025-04-17T06:26:26.656Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : OperationDefinition binding of ca.uhn.fhir.rest.server.method.ReadMethodBinding@7c3ae39a was removed +2025-04-17T06:26:26.656Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : OperationDefinition binding of ca.uhn.fhir.rest.server.method.ReadMethodBinding@7594beb2 was removed +2025-04-17T06:26:26.721Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : A FHIR has been lit on this server +2025-04-17T07:05:48.691Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17T07:05:48.694Z INFO 8 --- [ Thread-5] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17T07:05:48.694Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17T07:05:48.694Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17T07:05:48.694Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17T07:05:48.712Z INFO 8 --- [ Thread-5] .j.s.m.m.s.MatchingQueueSubscriberLoader : Destroying matching Channel ca.uhn.fhir.jpa.subscription.channel.subscription.BroadcastingSubscribableChannelWrapper with name subscription-matching +2025-04-17T07:05:48.735Z INFO 8 --- [ Thread-5] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 +2025-04-17T07:05:48.840Z INFO 8 --- [ Thread-5] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@2604b187 succeeded in 105ms +2025-04-17T07:05:48.920Z INFO 8 --- [ Thread-5] c.u.f.j.sched.BaseSchedulerServiceImpl : Shutting down task scheduler... +2025-04-17T07:05:48.920Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED shutting down. +2025-04-17T07:05:48.920Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T07:05:49.143Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17T07:05:49.143Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED shutting down. +2025-04-17T07:05:49.143Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T07:05:49.643Z INFO 8 --- [ Thread-5] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17T07:05:49.664Z INFO 8 --- [ Thread-5] irLocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'HAPI_PU' +2025-04-17T07:05:49.679Z INFO 8 --- [ Thread-5] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17T07:05:49.694Z INFO 8 --- [ Thread-5] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + + :: Spring Boot :: (v3.3.5) + +2025-04-17T07:08:24.261Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : Starting Application using Java 17.0.14 with PID 8 (/usr/local/tomcat/webapps/ROOT/WEB-INF/classes started by root in /usr/local/tomcat) +2025-04-17T07:08:24.266Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : No active profile set, falling back to 1 default profile: "default" +2025-04-17T07:08:26.438Z INFO 8 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-04-17T07:08:26.907Z INFO 8 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 446 ms. Found 52 JPA repository interfaces. +2025-04-17T07:08:30.475Z WARN 8 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'ca.uhn.fhir.jpa.config.BeanPostProcessorConfig' of type [ca.uhn.fhir.jpa.config.BeanPostProcessorConfig$$SpringCGLIB$$0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). The currently created BeanPostProcessor [persistenceExceptionTranslationPostProcessor] is declared through a non-static factory method on that class; consider declaring it as static instead. +2025-04-17T07:08:30.845Z INFO 8 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6539 ms +2025-04-17T07:08:31.211Z INFO 8 --- [ main] ca.uhn.fhir.util.VersionUtil : HAPI FHIR version 8.0.0 - Rev 091beb6d18 +2025-04-17T07:08:31.228Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to allow contains searches +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to deny multiple deletes +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to deny external references +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable DAO scheduling +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to disable delete expunges +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable expunges +2025-04-17T07:08:31.384Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to allow overriding default search params +2025-04-17T07:08:31.385Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to disable auto-creating placeholder references +2025-04-17T07:08:31.385Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to auto-version references at paths [] +2025-04-17T07:08:31.385Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable value set pre-expansion +2025-04-17T07:08:31.385Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to enable value set pre-expansion task +2025-04-17T07:08:31.386Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for pre-expand value set default count of 1000 +2025-04-17T07:08:31.386Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for pre-expand value set max count of 1000 +2025-04-17T07:08:31.387Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured for maximum expansion size of 1000 +2025-04-17T07:08:31.440Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to have a maximum fetch size of 'unlimited' +2025-04-17T07:08:31.440Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to cache search results for 60000 milliseconds +2025-04-17T07:08:31.441Z INFO 8 --- [ main] c.u.f.j.s.common.FhirServerConfigCommon : Server configured to use 'ALPHANUMERIC' Client ID Strategy +2025-04-17T07:08:31.669Z INFO 8 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: HAPI_PU] +2025-04-17T07:08:31.967Z INFO 8 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.4.Final +2025-04-17T07:08:32.007Z INFO 8 --- [ main] .f.j.l.FilteringSqlLoggerImplContributor : Adding service: SqlStatementFilteringLogger +2025-04-17T07:08:32.136Z INFO 8 --- [ main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled +2025-04-17T07:08:32.571Z INFO 8 --- [ main] o.h.e.boot.internal.EnversServiceImpl : Envers integration enabled? : true +2025-04-17T07:08:33.153Z INFO 8 --- [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer +2025-04-17T07:08:33.239Z INFO 8 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17T07:08:34.098Z INFO 8 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn1: url=jdbc:h2:file:/app/h2-data/fhir user=SA +2025-04-17T07:08:34.102Z INFO 8 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17T07:08:34.192Z INFO 8 --- [ main] org.hibernate.orm.connections.pooling : HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2025-04-17T07:08:35.793Z INFO 8 --- [ main] b.i.HibernateSearchPreIntegrationService : HSEARCH000034: Hibernate Search version 7.2.1.Final +2025-04-17T07:08:35.986Z INFO 8 --- [ main] o.h.e.c.i.m.AuditMetadataGenerator : Adding properties for entity: ca.uhn.fhir.jpa.entity.MdmLink +2025-04-17T07:08:40.053Z INFO 8 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2025-04-17T07:08:40.874Z INFO 8 --- [ main] irLocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'HAPI_PU' +2025-04-17T07:08:42.403Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-resources.xml +2025-04-17T07:08:42.428Z INFO 8 --- [ main] ca.uhn.fhir.util.XmlUtil : FHIR XML procesing will use StAX implementation 'Woodstox' version '6.4.0' +2025-04-17T07:08:43.725Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-types.xml +2025-04-17T07:08:43.859Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/profile/profiles-others.xml +2025-04-17T07:08:44.102Z INFO 8 --- [ main] .u.f.c.s.DefaultProfileValidationSupport : Loading structure definitions from classpath: /org/hl7/fhir/r4/model/extension/extension-definitions.xml +2025-04-17T07:08:45.368Z INFO 8 --- [ main] o.s.d.j.r.query.QueryEnhancerFactory : Hibernate is in classpath; If applicable, HQL parser will be used. +2025-04-17T07:08:51.064Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Creating Local Scheduler +2025-04-17T07:08:51.147Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T07:08:51.181Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T07:08:51.182Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T07:08:51.183Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T07:08:51.186Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'hapi-fhir-jpa-scheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 4 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T07:08:51.187Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'hapi-fhir-jpa-scheduler' initialized from an externally provided properties instance. +2025-04-17T07:08:51.187Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T07:08:51.187Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory@28e7a4df +2025-04-17T07:08:51.187Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T07:08:51.188Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Creating Clustered Scheduler +2025-04-17T07:08:51.190Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T07:08:51.198Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T07:08:51.198Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'hapi-fhir-jpa-scheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 4 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'hapi-fhir-jpa-scheduler' initialized from an externally provided properties instance. +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory@28e7a4df +2025-04-17T07:08:51.199Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED paused. +2025-04-17T07:08:51.912Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.914Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 2ms +2025-04-17T07:08:51.927Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.928Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 1ms +2025-04-17T07:08:51.929Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.930Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 1ms +2025-04-17T07:08:51.932Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.932Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 0ms +2025-04-17T07:08:51.933Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.933Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 0ms +2025-04-17T07:08:51.934Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Performing initial retrieval for non-expiring cache: org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 +2025-04-17T07:08:51.935Z INFO 8 --- [ main] c.u.f.log.terminology_troubleshooting : Initial retrieval for non-expiring cache org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain$FetchAllKey@823fb59 succeeded in 1ms +2025-04-17T07:08:52.063Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T07:08:52.472Z INFO 8 --- [ main] c.u.f.j.starter.common.StarterJpaConfig : CORS is enabled on this server +2025-04-17T07:08:52.477Z INFO 8 --- [ main] c.u.f.j.starter.common.StarterJpaConfig : CORS allows the following origins: * +2025-04-17T07:08:52.528Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R5] +2025-04-17T07:09:00.375Z INFO 8 --- [ main] ca.uhn.fhir.context.FhirContext : Creating new FHIR context for FHIR version [R4] +2025-04-17T07:09:03.002Z WARN 8 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-04-17T07:09:03.862Z INFO 8 --- [ main] .s.i.SubscriptionSubmitInterceptorLoader : Subscriptions are disabled on this server. Subscriptions will not be activated and incoming resources will not be matched against subscriptions. +2025-04-17T07:09:04.932Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17T07:09:04.955Z INFO 8 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17T07:09:04.956Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@4af6d469 +2025-04-17T07:09:05.031Z INFO 8 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator' +2025-04-17T07:09:05.376Z INFO 8 --- [ main] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17T07:09:05.377Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17T07:09:05.385Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_IMPORT_PULL / 1 +2025-04-17T07:09:05.386Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: REINDEX / 1 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: REINDEX / 2 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: DELETE_EXPUNGE / 1 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_EXPORT / 1 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: BULK_EXPORT / 2 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: termCodeSystemVersionDeleteJob / 1 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: termCodeSystemDeleteJob / 1 +2025-04-17T07:09:05.387Z INFO 8 --- [ main] ca.uhn.fhir.log.batch_troubleshooting : Registering Batch2 Job Definition: bulkImportJob / 1 +2025-04-17T07:09:05.390Z INFO 8 --- [ main] .j.s.m.m.s.MatchingQueueSubscriberLoader : Subscription Matching Subscriber subscribed to Matching Channel ca.uhn.fhir.jpa.subscription.channel.subscription.BroadcastingSubscribableChannelWrapper with name subscription-matching +2025-04-17T07:09:07.149Z INFO 8 --- [ main] c.u.f.j.s.registry.JpaSearchParamCache : Have 0 unique search params +2025-04-17T07:09:07.246Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling 15 jobs in application +2025-04-17T07:09:07.252Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.term.TermDeferredStorageSvcImpl$Job with interval 5000ms +2025-04-17T07:09:07.264Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl with interval 00:00:10.000 +2025-04-17T07:09:07.266Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.reindex.ResourceReindexingSvcImpl with interval 00:00:10.000 +2025-04-17T07:09:07.268Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.bulk.export.svc.BulkDataExportJobSchedulingHelperImpl$PurgeExpiredFilesJob with interval 01:00:00 +2025-04-17T07:09:07.271Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.bulk.imprt.svc.BulkDataImportSvcImpl$ActivationJob with interval 00:00:10.000 +2025-04-17T07:09:07.273Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.warm.CacheWarmingSvcImpl with interval 00:00:10.000 +2025-04-17T07:09:07.275Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.term.TermReadSvcImpl with interval 00:10:00 +2025-04-17T07:09:07.276Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.term.TermReindexingSvcImpl with interval 00:01:00.000 +2025-04-17T07:09:07.278Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.SearchUrlJobMaintenanceSvcImpl$SearchUrlMaintenanceJob with interval 00:10:00 +2025-04-17T07:09:07.280Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl with interval 00:01:00.000 +2025-04-17T07:09:07.282Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.util.ResourceCountCache with interval 00:10:00 +2025-04-17T07:09:07.285Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling local job ca.uhn.fhir.jpa.subscription.triggering.SubscriptionTriggeringSvcImpl with interval 5000ms +2025-04-17T07:09:07.288Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.jpa.subscription.async.AsyncResourceModifiedProcessingSchedulerSvc with interval 5000ms +2025-04-17T07:09:07.289Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.batch2.coordinator.ReductionStepExecutorServiceImpl$ReductionStepExecutorScheduledJob with interval 00:00:10.000 +2025-04-17T07:09:07.289Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Scheduling clustered job ca.uhn.fhir.batch2.maintenance.JobMaintenanceServiceImpl$JobMaintenanceScheduledJob with interval 00:01:00.000 +2025-04-17T07:09:07.289Z INFO 8 --- [ main] c.u.f.j.sched.BaseSchedulerServiceImpl : Starting task schedulers for context application +2025-04-17T07:09:07.289Z INFO 8 --- [ main] c.uhn.fhir.jpa.sched.BaseHapiScheduler : Starting scheduler hapi-fhir-jpa-scheduler-local +2025-04-17T07:09:07.290Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED started. +2025-04-17T07:09:07.290Z INFO 8 --- [ main] c.uhn.fhir.jpa.sched.BaseHapiScheduler : Starting scheduler hapi-fhir-jpa-scheduler-clustered +2025-04-17T07:09:07.290Z INFO 8 --- [ main] org.quartz.core.QuartzScheduler : Scheduler hapi-fhir-jpa-scheduler_$_NON_CLUSTERED started. +2025-04-17T07:09:07.290Z WARN 8 --- [ main] u.f.j.u.PartitionedIdModeVerificationSvc : Dialect is not a HAPI FHIR dialect: org.hibernate.dialect.H2Dialect, version: 2.3.232 +2025-04-17T07:09:07.295Z INFO 8 --- [ main] ca.uhn.fhir.jpa.starter.Application : Started Application in 44.05 seconds (process running for 60.148) +2025-04-17T07:09:07.384Z INFO 8 --- [ler-clustered-2] .s.BulkDataExportJobSchedulingHelperImpl : Finished bulk export job deletion with nothing to do +2025-04-17T07:09:07.446Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Initializing HAPI FHIR restful server running in R4 mode +2025-04-17T07:09:07.448Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Added 147 resource provider(s). Total 147 +2025-04-17T07:09:08.404Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Added 5 plain provider(s). Total 5 +2025-04-17T07:09:08.422Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : Removing RESTful methods for: class ca.uhn.fhir.jpa.provider.JpaCapabilityStatementProvider +2025-04-17T07:09:08.423Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : OperationDefinition binding of ca.uhn.fhir.rest.server.method.ReadMethodBinding@711dda46 was removed +2025-04-17T07:09:08.423Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : OperationDefinition binding of ca.uhn.fhir.rest.server.method.ReadMethodBinding@231712f was removed +2025-04-17T07:09:08.489Z INFO 8 --- [ main] ca.uhn.fhir.rest.server.RestfulServer : A FHIR has been lit on this server diff --git a/logs/tomcat_err.log b/logs/tomcat_err.log new file mode 100644 index 0000000..ae5d5ca --- /dev/null +++ b/logs/tomcat_err.log @@ -0,0 +1,83 @@ +17-Apr-2025 06:25:19.367 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/10.1.40 +17-Apr-2025 06:25:19.375 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 1 2025 17:20:53 UTC +17-Apr-2025 06:25:19.375 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.1.40.0 +17-Apr-2025 06:25:19.375 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux +17-Apr-2025 06:25:19.375 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.15.167.4-microsoft-standard-WSL2 +17-Apr-2025 06:25:19.375 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64 +17-Apr-2025 06:25:19.376 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /opt/java/openjdk +17-Apr-2025 06:25:19.376 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 17.0.14+7 +17-Apr-2025 06:25:19.376 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Eclipse Adoptium +17-Apr-2025 06:25:19.376 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat +17-Apr-2025 06:25:19.376 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat +17-Apr-2025 06:25:19.400 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dsun.io.useCanonCaches=false +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang.reflect=ALL-UNNAMED +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED +17-Apr-2025 06:25:19.401 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED +17-Apr-2025 06:25:19.402 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED +17-Apr-2025 06:25:19.402 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat +17-Apr-2025 06:25:19.402 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat +17-Apr-2025 06:25:19.402 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp +17-Apr-2025 06:25:19.411 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [2.0.8] using APR version [1.7.2]. +17-Apr-2025 06:25:19.416 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.0.13 30 Jan 2024] +17-Apr-2025 06:25:19.821 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] +17-Apr-2025 06:25:19.882 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [794] milliseconds +17-Apr-2025 06:25:20.017 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] +17-Apr-2025 06:25:20.017 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.1.40] +17-Apr-2025 06:25:20.048 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/ROOT.war] +17-Apr-2025 06:25:38.970 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. +17-Apr-2025 06:26:26.803 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [66,753] ms +17-Apr-2025 06:26:26.804 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/custom] +17-Apr-2025 06:26:26.847 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/custom] has finished in [42] ms +17-Apr-2025 06:26:26.854 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] +17-Apr-2025 06:26:26.893 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [67014] milliseconds +17-Apr-2025 07:05:48.360 INFO [Thread-5] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"] +17-Apr-2025 07:05:48.381 INFO [Thread-5] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina] +17-Apr-2025 07:05:49.774 SEVERE [Thread-5] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [org.springframework.boot.SpringBootExceptionHandler.LoggedExceptionHandlerThreadLocal] (value [org.springframework.boot.SpringBootExceptionHandler$LoggedExceptionHandlerThreadLocal@60f94e9]) and a value of type [org.springframework.boot.SpringBootExceptionHandler] (value [org.springframework.boot.SpringBootExceptionHandler@46b9f0e9]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. +17-Apr-2025 07:05:49.827 INFO [Thread-5] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"] +17-Apr-2025 07:05:49.841 INFO [Thread-5] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"] +17-Apr-2025 07:08:07.777 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/10.1.40 +17-Apr-2025 07:08:07.785 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 1 2025 17:20:53 UTC +17-Apr-2025 07:08:07.786 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.1.40.0 +17-Apr-2025 07:08:07.786 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux +17-Apr-2025 07:08:07.786 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.15.167.4-microsoft-standard-WSL2 +17-Apr-2025 07:08:07.786 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64 +17-Apr-2025 07:08:07.787 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /opt/java/openjdk +17-Apr-2025 07:08:07.787 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 17.0.14+7 +17-Apr-2025 07:08:07.787 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Eclipse Adoptium +17-Apr-2025 07:08:07.787 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat +17-Apr-2025 07:08:07.787 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat +17-Apr-2025 07:08:07.813 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties +17-Apr-2025 07:08:07.813 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager +17-Apr-2025 07:08:07.814 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 +17-Apr-2025 07:08:07.814 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources +17-Apr-2025 07:08:07.814 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dsun.io.useCanonCaches=false +17-Apr-2025 07:08:07.814 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 +17-Apr-2025 07:08:07.814 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang.reflect=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat +17-Apr-2025 07:08:07.815 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp +17-Apr-2025 07:08:07.826 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [2.0.8] using APR version [1.7.2]. +17-Apr-2025 07:08:07.831 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.0.13 30 Jan 2024] +17-Apr-2025 07:08:08.209 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] +17-Apr-2025 07:08:08.251 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [759] milliseconds +17-Apr-2025 07:08:08.340 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] +17-Apr-2025 07:08:08.340 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.1.40] +17-Apr-2025 07:08:08.368 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/ROOT.war] +17-Apr-2025 07:08:22.061 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. +17-Apr-2025 07:09:08.525 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [60,155] ms +17-Apr-2025 07:09:08.528 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/custom] +17-Apr-2025 07:09:08.565 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/custom] has finished in [37] ms +17-Apr-2025 07:09:08.575 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] +17-Apr-2025 07:09:08.662 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [60427] milliseconds diff --git a/services.py b/services.py index 8fb5c3e..1464754 100644 --- a/services.py +++ b/services.py @@ -8,6 +8,9 @@ from flask import current_app, Blueprint, request, jsonify from collections import defaultdict from pathlib import Path import datetime +import subprocess +import tempfile +import xml.etree.ElementTree as ET # Define Blueprint services_bp = Blueprint('services', __name__) @@ -1438,3 +1441,72 @@ if __name__ == '__main__': else: print(f"\n--- Skipping Processing Test (Import failed for {pkg_name_to_test}#{pkg_version_to_test}) ---") +# Add new functions for GoFSH integration +def run_gofsh(input_path, output_dir, output_style, log_level, fhir_version=None): + """Run GoFSH on the input FHIR resource and return the FSH output.""" + cmd = ["gofsh", input_path, "-o", output_dir, "-s", output_style, "-l", log_level] + if fhir_version: + cmd.extend(["-u", fhir_version]) + + try: + result = subprocess.run( + cmd, + capture_output=True, + text=True, + check=True + ) + # Read all FSH files from the output directory + fsh_content = [] + for root, _, files in os.walk(output_dir): + for file in files: + if file.endswith(".fsh"): + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + fsh_content.append(f.read()) + logger.info(f"GoFSH executed successfully for {input_path}") + return "\n\n".join(fsh_content), None + except subprocess.CalledProcessError as e: + logger.error(f"GoFSH failed: {e.stderr}") + return None, f"GoFSH failed: {e.stderr}" + except Exception as e: + logger.error(f"Error running GoFSH: {str(e)}", exc_info=True) + return None, f"Error running GoFSH: {str(e)}" + +def process_fhir_input(input_mode, fhir_file, fhir_text): + """Process user input (file or text) and save to a temporary file.""" + temp_dir = tempfile.mkdtemp() + temp_file = None + + try: + if input_mode == 'file' and fhir_file: + content = fhir_file.read().decode('utf-8') + file_type = 'json' if content.strip().startswith('{') else 'xml' + temp_file = os.path.join(temp_dir, f"input.{file_type}") + with open(temp_file, 'w', encoding='utf-8') as f: + f.write(content) + elif input_mode == 'text' and fhir_text: + content = fhir_text.strip() + file_type = 'json' if content.startswith('{') else 'xml' + temp_file = os.path.join(temp_dir, f"input.{file_type}") + with open(temp_file, 'w', encoding='utf-8') as f: + f.write(content) + else: + return None, None, "No input provided" + + # Basic validation + if file_type == 'json': + try: + json.loads(content) + except json.JSONDecodeError: + return None, None, "Invalid JSON format" + elif file_type == 'xml': + try: + ET.fromstring(content) + except ET.ParseError: + return None, None, "Invalid XML format" + + logger.debug(f"Processed input: {temp_file}") + return temp_file, temp_dir, None + except Exception as e: + logger.error(f"Error processing input: {str(e)}", exc_info=True) + return None, None, f"Error processing input: {str(e)}" + diff --git a/static/uploads/fsh_output/input/fsh/aliases.fsh b/static/uploads/fsh_output/input/fsh/aliases.fsh new file mode 100644 index 0000000..3b35aa5 --- /dev/null +++ b/static/uploads/fsh_output/input/fsh/aliases.fsh @@ -0,0 +1,5 @@ +Alias: $sct = http://snomed.info/sct +Alias: $loinc = http://loinc.org +Alias: $ihi-status-1 = https://healthterminologies.gov.au/fhir/CodeSystem/ihi-status-1 +Alias: $ihi-record-status-1 = https://healthterminologies.gov.au/fhir/CodeSystem/ihi-record-status-1 +Alias: $v2-0203 = http://terminology.hl7.org/CodeSystem/v2-0203 \ No newline at end of file diff --git a/static/uploads/fsh_output/input/fsh/index.txt b/static/uploads/fsh_output/input/fsh/index.txt new file mode 100644 index 0000000..4ee6caf --- /dev/null +++ b/static/uploads/fsh_output/input/fsh/index.txt @@ -0,0 +1,2 @@ +Name Type File +banks-mia-leanne Instance instances/banks-mia-leanne.fsh \ No newline at end of file diff --git a/static/uploads/fsh_output/input/fsh/instances/banks-mia-leanne.fsh b/static/uploads/fsh_output/input/fsh/instances/banks-mia-leanne.fsh new file mode 100644 index 0000000..d90a724 --- /dev/null +++ b/static/uploads/fsh_output/input/fsh/instances/banks-mia-leanne.fsh @@ -0,0 +1,49 @@ +Instance: banks-mia-leanne +InstanceOf: Patient +Usage: #example +* meta.profile = "http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient" +* extension[0].url = "http://hl7.org/fhir/StructureDefinition/individual-genderIdentity" +* extension[=].extension.url = "value" +* extension[=].extension.valueCodeableConcept = $sct#446141000124107 "Identifies as female gender" +* extension[+].url = "http://hl7.org/fhir/StructureDefinition/individual-pronouns" +* extension[=].extension.url = "value" +* extension[=].extension.valueCodeableConcept = $loinc#LA29519-8 "she/her/her/hers/herself" +* extension[+].url = "http://hl7.org/fhir/StructureDefinition/individual-recordedSexOrGender" +* extension[=].extension[0].url = "value" +* extension[=].extension[=].valueCodeableConcept = $sct#248152002 +* extension[=].extension[=].valueCodeableConcept.text = "Female" +* extension[=].extension[+].url = "type" +* extension[=].extension[=].valueCodeableConcept = $sct#1515311000168102 "Biological sex at birth" +* identifier.extension[0].url = "http://hl7.org.au/fhir/StructureDefinition/ihi-status" +* identifier.extension[=].valueCoding = $ihi-status-1#active +* identifier.extension[+].url = "http://hl7.org.au/fhir/StructureDefinition/ihi-record-status" +* identifier.extension[=].valueCoding = $ihi-record-status-1#verified "verified" +* identifier.type = $v2-0203#NI +* identifier.type.text = "IHI" +* identifier.system = "http://ns.electronichealth.net.au/id/hi/ihi/1.0" +* identifier.value = "8003608333647261" +* name.use = #usual +* name.family = "Banks" +* name.given[0] = "Mia" +* name.given[+] = "Leanne" +* telecom[0].system = #phone +* telecom[=].value = "0270102724" +* telecom[=].use = #work +* telecom[+].system = #phone +* telecom[=].value = "0491574632" +* telecom[=].use = #mobile +* telecom[+].system = #phone +* telecom[=].value = "0270107520" +* telecom[=].use = #home +* telecom[+].system = #email +* telecom[=].value = "mia.banks@myownpersonaldomain.com" +* telecom[+].system = #phone +* telecom[=].value = "270107520" +* telecom[=].use = #home +* gender = #female +* birthDate = "1983-08-25" +* address.line = "50 Sebastien St" +* address.city = "Minjary" +* address.state = "NSW" +* address.postalCode = "2720" +* address.country = "AU" \ No newline at end of file diff --git a/static/uploads/fsh_output/sushi-config.yaml b/static/uploads/fsh_output/sushi-config.yaml new file mode 100644 index 0000000..8fc21a5 --- /dev/null +++ b/static/uploads/fsh_output/sushi-config.yaml @@ -0,0 +1,6 @@ +canonical: http://example.org +fhirVersion: 4.0.1 +FSHOnly: true +applyExtensionMetadataToRoot: false +id: example +name: Example diff --git a/static/uploads/output.fsh b/static/uploads/output.fsh new file mode 100644 index 0000000..705f93b --- /dev/null +++ b/static/uploads/output.fsh @@ -0,0 +1,55 @@ +Alias: $sct = http://snomed.info/sct +Alias: $loinc = http://loinc.org +Alias: $ihi-status-1 = https://healthterminologies.gov.au/fhir/CodeSystem/ihi-status-1 +Alias: $ihi-record-status-1 = https://healthterminologies.gov.au/fhir/CodeSystem/ihi-record-status-1 +Alias: $v2-0203 = http://terminology.hl7.org/CodeSystem/v2-0203 + +Instance: banks-mia-leanne +InstanceOf: Patient +Usage: #example +* meta.profile = "http://hl7.org.au/fhir/core/StructureDefinition/au-core-patient" +* extension[0].url = "http://hl7.org/fhir/StructureDefinition/individual-genderIdentity" +* extension[=].extension.url = "value" +* extension[=].extension.valueCodeableConcept = $sct#446141000124107 "Identifies as female gender" +* extension[+].url = "http://hl7.org/fhir/StructureDefinition/individual-pronouns" +* extension[=].extension.url = "value" +* extension[=].extension.valueCodeableConcept = $loinc#LA29519-8 "she/her/her/hers/herself" +* extension[+].url = "http://hl7.org/fhir/StructureDefinition/individual-recordedSexOrGender" +* extension[=].extension[0].url = "value" +* extension[=].extension[=].valueCodeableConcept = $sct#248152002 +* extension[=].extension[=].valueCodeableConcept.text = "Female" +* extension[=].extension[+].url = "type" +* extension[=].extension[=].valueCodeableConcept = $sct#1515311000168102 "Biological sex at birth" +* identifier.extension[0].url = "http://hl7.org.au/fhir/StructureDefinition/ihi-status" +* identifier.extension[=].valueCoding = $ihi-status-1#active +* identifier.extension[+].url = "http://hl7.org.au/fhir/StructureDefinition/ihi-record-status" +* identifier.extension[=].valueCoding = $ihi-record-status-1#verified "verified" +* identifier.type = $v2-0203#NI +* identifier.type.text = "IHI" +* identifier.system = "http://ns.electronichealth.net.au/id/hi/ihi/1.0" +* identifier.value = "8003608333647261" +* name.use = #usual +* name.family = "Banks" +* name.given[0] = "Mia" +* name.given[+] = "Leanne" +* telecom[0].system = #phone +* telecom[=].value = "0270102724" +* telecom[=].use = #work +* telecom[+].system = #phone +* telecom[=].value = "0491574632" +* telecom[=].use = #mobile +* telecom[+].system = #phone +* telecom[=].value = "0270107520" +* telecom[=].use = #home +* telecom[+].system = #email +* telecom[=].value = "mia.banks@myownpersonaldomain.com" +* telecom[+].system = #phone +* telecom[=].value = "270107520" +* telecom[=].use = #home +* gender = #female +* birthDate = "1983-08-25" +* address.line = "50 Sebastien St" +* address.city = "Minjary" +* address.state = "NSW" +* address.postalCode = "2720" +* address.country = "AU" \ No newline at end of file diff --git a/supervisord.conf b/supervisord.conf new file mode 100644 index 0000000..10b724c --- /dev/null +++ b/supervisord.conf @@ -0,0 +1,36 @@ +[supervisord] +nodaemon=true +logfile=/app/logs/supervisord.log +logfile_maxbytes=50MB +logfile_backups=10 +pidfile=/app/logs/supervisord.pid + +[program:flask] +command=/app/venv/bin/python /app/app.py +directory=/app +environment=FLASK_APP="app.py",FLASK_ENV="development",NODE_PATH="/usr/lib/node_modules" +autostart=true +autorestart=true +startsecs=10 +stopwaitsecs=10 +stdout_logfile=/app/logs/flask.log +stdout_logfile_maxbytes=10MB +stdout_logfile_backups=5 +stderr_logfile=/app/logs/flask_err.log +stderr_logfile_maxbytes=10MB +stderr_logfile_backups=5 + +[program:tomcat] +command=/usr/local/tomcat/bin/catalina.sh run +directory=/usr/local/tomcat +environment=SPRING_CONFIG_LOCATION="file:/usr/local/tomcat/conf/application.yaml",NODE_PATH="/usr/lib/node_modules" +autostart=true +autorestart=true +startsecs=30 +stopwaitsecs=30 +stdout_logfile=/app/logs/tomcat.log +stdout_logfile_maxbytes=10MB +stdout_logfile_backups=5 +stderr_logfile=/app/logs/tomcat_err.log +stderr_logfile_maxbytes=10MB +stderr_logfile_backups=5 \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 8494903..9ee9369 100644 --- a/templates/base.html +++ b/templates/base.html @@ -32,6 +32,15 @@ + + + diff --git a/templates/fhir_ui.html b/templates/fhir_ui.html new file mode 100644 index 0000000..209cd2f --- /dev/null +++ b/templates/fhir_ui.html @@ -0,0 +1,303 @@ +{% extends "base.html" %} + +{% block content %} +
+ FHIRFLARE IG Toolkit +

FHIR API Explorer

+
+

+ Interact with FHIR servers using GET, POST, PUT, or DELETE requests. Toggle between local HAPI or a custom server to explore resources or perform searches. +

+ +
+
+ +
+
+
Send FHIR Request
+
+
+ {{ form.hidden_tag() }} +
+ +
+ + +
+ Toggle to use local HAPI (http://localhost:8080/fhir) or enter a custom FHIR server URL. +
+
+ + + Enter a resource path (e.g., Patient, Observation/example) or '_search' for search queries. +
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+ + +
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/fhir_ui_operations.html b/templates/fhir_ui_operations.html new file mode 100644 index 0000000..36bc59b --- /dev/null +++ b/templates/fhir_ui_operations.html @@ -0,0 +1,908 @@ +{% extends "base.html" %} + +{% block content %} + + +
+ FHIRFLARE IG Toolkit +

FHIR UI Operations

+
+

+ Explore FHIR server operations by selecting resource types or system operations. Toggle between local HAPI or a custom server to interact with FHIR metadata, resources, and server-wide operations. +

+ +
+
+ +
+
+
FHIR Operations Configuration
+
+
+ {{ form.hidden_tag() }} +
+ +
+ + +
+ Toggle to use local HAPI (/fhir proxy) or enter a custom FHIR server URL. +
+ +
+ + + + +
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/fsh_converter.html b/templates/fsh_converter.html new file mode 100644 index 0000000..0d0a7bc --- /dev/null +++ b/templates/fsh_converter.html @@ -0,0 +1,75 @@ +{% extends "base.html" %} +{% from "_form_helpers.html" import render_field %} + +{% block content %} +
+ FHIRFLARE IG Toolkit +

FSH Converter

+
+

+ Convert FHIR JSON or XML resources to FHIR Shorthand (FSH) using GoFSH. +

+ +
+
+ +
+

Convert FHIR to FSH

+
+
+
+
+
+ {{ form.hidden_tag() }} + {{ render_field(form.package) }} + {{ render_field(form.input_mode) }} + + + {{ render_field(form.output_style) }} + {{ render_field(form.log_level) }} + {{ render_field(form.fhir_version) }} +
+ {{ form.submit(class="btn btn-success") }} + Back +
+
+
+
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if fsh_output %} +
Conversion successful!
+

FSH Output

+
{{ fsh_output }}
+ Download FSH + {% endif %} +
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/woooo b/templates/woooo deleted file mode 100644 index 1dbee21..0000000 --- a/templates/woooo +++ /dev/null @@ -1,155 +0,0 @@ -// Function to build the hierarchical data structure for the tree -function buildTreeData(elements) { - const treeRoot = { children: {}, element: null, name: 'Root' }; - const nodeMap = { 'Root': treeRoot }; - - console.log("Building tree with elements:", elements.length); - elements.forEach((el, index) => { - const path = el.path; - const id = el.id || null; - const sliceName = el.sliceName || null; - - console.log(`Element ${index}: path=${path}, id=${id}, sliceName=${sliceName}`); - - if (!path) { - console.warn(`Skipping element ${index} with no path`); - return; - } - - const parts = path.split('.'); - let currentPath = ''; - let parentNode = treeRoot; - - for (let i = 0; i < parts.length; i++) { - const part = parts[i]; - currentPath = i === 0 ? part : `${currentPath}.${part}`; - - // For extensions, append sliceName to path if present - let nodeKey = part; - if (part === 'extension' && i === parts.length - 1 && sliceName) { - nodeKey = `${part}:${sliceName}`; - currentPath = id || currentPath; // Use id for precise matching in extensions - } - - if (!nodeMap[currentPath]) { - const newNode = { - children: {}, - element: null, - name: nodeKey, - path: currentPath - }; - let parentPath = i === 0 ? 'Root' : parts.slice(0, i).join('.'); - parentNode = nodeMap[parentPath] || treeRoot; - parentNode.children[nodeKey] = newNode; - nodeMap[currentPath] = newNode; - console.log(`Created node: path=${currentPath}, name=${nodeKey}`); - } - - if (i === parts.length - 1) { - const targetNode = nodeMap[currentPath]; - targetNode.element = el; - console.log(`Assigned element to node: path=${currentPath}, id=${id}, sliceName=${sliceName}`); - } - - parentNode = nodeMap[currentPath]; - } - }); - - const treeData = Object.values(treeRoot.children); - console.log("Tree data constructed:", treeData); - return treeData; -} - -// Function to render a single node (and its children recursively) as an
  • -function renderNodeAsLi(node, mustSupportPathsSet, level = 0) { - if (!node || !node.element) { - console.warn("Skipping render for invalid node:", node); - return ''; - } - const el = node.element; - const path = el.path || 'N/A'; - const id = el.id || null; - const sliceName = el.sliceName || null; - const min = el.min !== undefined ? el.min : ''; - const max = el.max || ''; - const short = el.short || ''; - const definition = el.definition || ''; - - console.log(`Rendering node: path=${path}, id=${id}, sliceName=${sliceName}`); - console.log(` MustSupportPathsSet contains path: ${mustSupportPathsSet.has(path)}`); - if (id) { - console.log(` MustSupportPathsSet contains id: ${mustSupportPathsSet.has(id)}`); - } - - // Check MS for path, id, or normalized extension path - let isMustSupport = mustSupportPathsSet.has(path) || (id && mustSupportPathsSet.has(id)); - if (!isMustSupport && path.startsWith('Extension.extension')) { - const basePath = path.split(':')[0]; - const baseId = id ? id.split(':')[0] : null; - isMustSupport = mustSupportPathsSet.has(basePath) || (baseId && mustSupportPathsSet.has(baseId)); - console.log(` Extension check: basePath=${basePath}, baseId=${baseId}, isMustSupport=${isMustSupport}`); - } - - console.log(` Final isMustSupport for ${path}: ${isMustSupport}`); - - const liClass = isMustSupport ? 'list-group-item py-1 px-2 list-group-item-warning' : 'list-group-item py-1 px-2'; - const mustSupportDisplay = isMustSupport ? '' : ''; - const hasChildren = Object.keys(node.children).length > 0; - const collapseId = `collapse-${path.replace(/[\.\:\/\[\]\(\)]/g, '-')}`; - const padding = level * 20; - const pathStyle = `padding-left: ${padding}px; white-space: nowrap;`; - - let typeString = 'N/A'; - if (el.type && el.type.length > 0) { - typeString = el.type.map(t => { - let s = t.code || ''; - let profiles = t.targetProfile || t.profile || []; - if (profiles.length > 0) { - const targetTypes = profiles.map(p => (p || '').split('/').pop()).filter(Boolean).join(', '); - if (targetTypes) { - s += `(${targetTypes})`; - } - } - return s; - }).join(' | '); - } - - let childrenHtml = ''; - if (hasChildren) { - childrenHtml += ``; - } - - let itemHtml = `
  • `; - itemHtml += ``; - itemHtml += childrenHtml; - itemHtml += `
  • `; - return itemHtml; -} \ No newline at end of file