From 4aed4ae668a00b060606d901d1b9c3700a042265 Mon Sep 17 00:00:00 2001
From: Pa-Touche <47572440+Pa-Touche@users.noreply.github.com>
Date: Tue, 20 Jan 2026 10:31:58 +0100
Subject: [PATCH 01/46] Added properties, started cleanup.
---
.run-configs/re-build-deploy-ear.sh | 22 ++++
.../src/main/resources/strings.properties | 101 ++++++++++++++++++
.../common/messaging/EmailService.java | 4 +-
.../backend/common/messaging/SmsService.java | 3 +-
.../SystemConfigurationValueEjb.java | 1 +
5 files changed, 127 insertions(+), 4 deletions(-)
create mode 100644 .run-configs/re-build-deploy-ear.sh
diff --git a/.run-configs/re-build-deploy-ear.sh b/.run-configs/re-build-deploy-ear.sh
new file mode 100644
index 00000000000..ac7e47ab0e3
--- /dev/null
+++ b/.run-configs/re-build-deploy-ear.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+echo "Build started at: $(date '+%H:%M:%S.%3N')"
+
+cd ./sormas-base
+
+echo "Executed from path: $(pwd)"
+
+set MAVEN_OPTS=-Xmx4g -Xms2g -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+UseParallelGC
+mvnd.cmd package -o -nsu -pl ../sormas-ear -Dmaven.test.skip \
+-Dmaven.javadoc.skip=true \
+-Dmaven.source.skip=true \
+-Dmaven.compile.fork=true \
+-Dlicense.skip=true
+
+echo "un/deploy sormas-ear"
+# asadmin.bat --port 6048 undeploy sormas-ear 2>/dev/null || true
+asadmin.bat --port 6048 deploy --force ../sormas-ear/target/sormas-ear.war
+
+END_TIME=$(date +%s)
+echo "Build finished: $(date -d @$END_TIME '+%H:%M:%S.%3N')"
+
diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties
index 62384e048e9..351889eee32 100644
--- a/sormas-api/src/main/resources/strings.properties
+++ b/sormas-api/src/main/resources/strings.properties
@@ -1980,6 +1980,107 @@ infoSystemConfigurationValueDescriptionEmailSenderName=Name that will be set as
infoSystemConfigurationValueDescriptionSmsSenderName=Name that will be set as the sender of SMS notifications sent out by the system.
infoSystemConfigurationValueDescriptionSmsAuthKey=SORMAS supports the delivery of SMS notifications via Vonage (https://www.vonage.com/communications-apis/). You need to specify a valid authentication key and secret in order to use this feature. SORMAS will not attempt to send out SMS if these properties are left empty.
infoSystemConfigurationValueDescriptionSmsAuthSecret=Secret for SMS authentication.
+infoSystemConfigurationValueDescription.AUTHENTICATION_PROVIDER=Specifies the authentication provider to be used for the user interface and the ReST API.
+infoSystemConfigurationValueDescription.SMS_AUTH_SECRET=SORMAS supports the delivery of SMS notifications via Vonage (https://www.vonage.com/communications-apis/). You need to specify a valid authentication key and secret in order to use this feature. SORMAS will not attempt to send out SMS if these properties are left empty.
+infoSystemConfigurationValueDescription.MAP_TILES_URL=Tileset of the map
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_ID=The S2S ID of this instance
+infoSystemConfigurationValueDescription.CENTRAL_ETCD_HOST=The hostname of the etcd instance providing data.
+infoSystemConfigurationValueDescription.GEOCODING_LONGITUDE_JSON_PATH=JSON paths of the longitude and latitude in the result of the geocoding service calls.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOMJOURNAL_URL=SYMPTOM JOURNALS (e.g. PIA) Website that is displayed inside an iFrame to create a symptom journal user account for a contact person. If left empty, this feature will be disabled.
+infoSystemConfigurationValueDescription.COUNTRY_NAME=The name of the country this SORMAS instance is used in. If the database contains countries, this property must be filled in and match the name of one of those countries for SORMAS to work properly. The country will be used to pre-fill the country fields of locations.
+infoSystemConfigurationValueDescription.CUSTOM_BRANDING_USELOGINSIDEBAR=Determines whether the login sidebar that contains the SORMAS logo, description, and logos of the original creators should be shown.
+infoSystemConfigurationValueDescription.DASHBOARD_MAP_MARKER_LIMIT=Maximum number of cases, contacts and events to be displayed automatically on the Dashboard and Statistics maps. If the amount of markers exceed this threshold, a warning message is displayed instead. Leaving this empty means that markers are always shown. Please note that this could significantly slow down your systems if there are a lot of markers to be displayed.
+infoSystemConfigurationValueDescription.INTERFACE_EXTERNAL_MESSAGE_ADAPTER_JNDI_NAME=JNDI name of the external message adapter that is connected to this SORMAS instance. Specifies where additionally deployed modules are stored.
+infoSystemConfigurationValueDescription.DAYS_AFTER_SYSTEM_EVENT_GETS_DELETED=Number of days after which system events are deleted from the database. An example for a system event is the last date at which data from an external service was pulled. default: 90
+infoSystemConfigurationValueDescription.CREATE_DEFAULT_ENTITIES=Determines whether default infrastructure data and users are created when the server is starting with an empty database. Please note that a default admin user is always created to make sure that you can log in and use the system.
+infoSystemConfigurationValueDescription.COUNTRY_CENTER_LATITUDE=GPS coordinates of the geographical center of the country SORMAS is used in. The maps on the Dashboard and in the Statistics screen will be centered to these coordinates, if no user-region is provided or map.usecountrycenter=true
+infoSystemConfigurationValueDescription.NAME_SIMILARITY_THRESHOLD=The similarity threshold after which two names are identified as similar enough to consider them for duplicate detection. The default value should work for most servers. If you need to change it, please change it carefully as slightly higher or lower values already lead to significant differences. The D after the number is required and specified that it is a decimal number. Value-Range: 0.0D - 1.0D
+infoSystemConfigurationValueDescription.CENTRAL_ETCD_CLIENT_NAME=The client name used in etcd authentication
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_KEYSTORE_NAME=Name of the key store file.
+infoSystemConfigurationValueDescription.STEP_SIZE_FOR_CSV_EXPORT=Number of entries in detailed CSV exports that are processed in one batch. Only change this value if there is a good reason for it, i.e. there are performance issues with the detailed exports that could be improved by it.
+infoSystemConfigurationValueDescription.CENTRAL_LOCATION_SYNC=If set to true, all infrastructure data from the central server will be synchronized into the local SORMAS database at startup and on a nightly basis.
+infoSystemConfigurationValueDescription.AUTHENTICATION_PROVIDER_USER_SYNC_AT_STARTUP=Specifies whether server startup will trigger a user sync to Keycloak. Since this is mainly needed for an initial sync, it is recommended to disable this property once that initial sync has been performed.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_TRUSTSTORE_NAME=Name of the trust store file.
+infoSystemConfigurationValueDescription.AUDITOR_ATTRIBUTE_LOGGING=Determines whether database logs storing the information which user changed which data at which point in time also includes the specific values that were changed.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_FRONTEND_AUTHURL=URL used to retrieve tokens for frontend requests. If not specified, the authurl is used instead.
+infoSystemConfigurationValueDescription.CUSTOM_BRANDING_NAME=Custom name that is used instead of SORMAS for this instance.
+infoSystemConfigurationValueDescription.COUNTRY_EPID_PREFIX=If your country is using so-called EPID numbers to identify cases, you need to specify the country prefix here.
+infoSystemConfigurationValueDescription.UI_URL=Path to the folder on the server where documents added as attachments to cases, contacts or events are stored. URL of the SORMAS UI Will be used in email and SMS notifications to link to a specific page.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOMJOURNAL_AUTHURL=Authentication details necessary to access the external symptom journal.
+infoSystemConfigurationValueDescription.SKIP_DEFAULT_PASSWORD_CHECK=Determines whether logging in as a default user using a default password will bring up a prompt that asks the user to change their password.
+infoSystemConfigurationValueDescription.APP.URL=The URL that can be used to download the Android .apk file. Must contain a placeholder for the app version, or a specific version number (not recommended). If you want to use the mobile app, this property must be filled in because the app is using it to automatically download new versions. Example: https://SERVER-NAME/downloads/sormas-%version-release.apk
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_IGNORE_PROPERTY_EXTERNAL_ID=Control which values are ignored when shared / overwritten trough S2S. Is applied to all entities shared trough S2S
+infoSystemConfigurationValueDescription.INTERFACE_PATIENT_DIARY_ACCEPT_PHONE_CONTACT=Configure weather the phone number is accepted for registering a person in the patient diary
+infoSystemConfigurationValueDescription.CASE_CLASSIFICATION_ALL=Configuration for case classification calculation for all diseases.
+infoSystemConfigurationValueDescription.MAP_TILES_ATTRIBUTION=Attribution of the tileset, required for tiles from OpenStreatMap @see https://www.openstreetmap.org/copyright
+infoSystemConfigurationValueDescription.IMPORT_FILE_SIZE_LIMIT_MB=Maximum file size allowed to upload for import
+infoSystemConfigurationValueDescription.INTERFACE_PATIENT_DIARY_PASSWORD=Credentials used for both authurls.
+infoSystemConfigurationValueDescription.MINIMUM_EMANCIPATED_AGE=Minimum emancipated age
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_OIDC_REALM=Name of our authorization realm.
+infoSystemConfigurationValueDescription.CUSTOM_BRANDING_LOGINBACKGROUND_PATH=The path on the server to an image file to replace the standard world map background of the login page. Please have a look at the "File Paths" section to see how paths are supposed to be formatted depending on your operating system.
+infoSystemConfigurationValueDescription.CENTRAL_ETCD_CA_PATH=The path to the CA cert trusted by etcd clients.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_PROBANDSURL=URL that is used to register new persons in the patient diary.
+infoSystemConfigurationValueDescription.GEOCODING_SERVICE_URL_TEMPLATE=URL template used to access a geocoding service. If specified, the application can generate geo coordinates based on entered addresses. Example (Germany): https://sg.geodatenzentrum.de/gdz_geokodierung_bund__{credentials}/geosearch.json?query=${street}+${houseNumber},${postalCode}+${city}&filter=typ:haus&count1 Example (France): https://api-adresse.data.gouv.fr/search?q=${houseNumber}+${street},${postalCode}+${city}&type=housenumber&limit=1
+infoSystemConfigurationValueDescription.ALLOWED_FILE_EXTENSIONS=A list of allowed file types to be uploaded
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_ETCD_KEY_PREFIX=The etcd key prefix which is used to store s2s related information
+infoSystemConfigurationValueDescription.CUSTOM_BRANDING_LOGO_PATH=The path on the server to an image file to replace the standard SORMAS logo. Please have a look at the "File Paths" section to see how paths are supposed to be formatted depending on your operating system.
+infoSystemConfigurationValueDescription.CASE_CLASSIFICATION_CHOLERA=Configuration for case classification calculation for specific diseases.
+infoSystemConfigurationValueDescription.DOCUMENTS_PATH=Path were SORMAS will store documents added by users
+infoSystemConfigurationValueDescription.INTERFACE_PATIENT_DIARY_AUTHURL=Configure weather the phone number is accepted for registering a person in the patient diary
+infoSystemConfigurationValueDescription.GENERATED_PATH=Path where generated files, such as import templates or the data dictionary, are stored.
+infoSystemConfigurationValueDescription.DOCGENERATION_NULL_REPLACEMENT=Replacement for empty variables in generated documents.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_EMAIL=Credentials used for both authurls.
+infoSystemConfigurationValueDescription.AUTHENTICATION_PROVIDER_SYNCED_NEW_USER_ROLE=Specifies what user role should be used as default for new users synced from the authentication provider (e.g. Keycloak). Must be set to the name of an existing user role in the database when the feature AUTH_PROVIDER_TO_SORMAS_USER_SYNC is active
+infoSystemConfigurationValueDescription.DOCUMENT_UPLOAD_SIZE_LIMIT_MB=Maximum file size allowed for document and document template upload
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_KEYSTORE_PASS=Password of the key store.
+infoSystemConfigurationValueDescription.GEOCODING_LATITUDE_JSON_PATH=JSON paths of the longitude and latitude in the result of the geocoding service calls.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_OIDC_CLIENT_ID=The client ID used in OIDC.
+infoSystemConfigurationValueDescription.CASE_CLASSIFICATION_CORONAVIRUS=Configuration for case classification calculation for specific diseases.
+infoSystemConfigurationValueDescription.NEGATIVE-COVID-TESTS-MAX-AGE-DAYS=Number of days after which system events are deleted from the database. An example for a system event is the last date at which data from an external service was pulled. default: 90
+infoSystemConfigurationValueDescription.TEMP_PATH=Path where temporary files will be stored. Both Payara and PostgreSQL need read and write access to this folder. Temporary files are deleted on a nightly basis, so make sure to not store any important files here.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOM_JOURNAL_CLIENTID=Authentication details necessary to access the external symptom journal.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_OIDC_CLIENT_SECRET=The client secret used in OIDC.
+infoSystemConfigurationValueDescription.MAP_ZOOM=Initial zoom level of the maps on the Dashboard and the Statistics screen
+infoSystemConfigurationValueDescription.AUDIT_LOGGER_CONFIG=Config file path of the audit logger
+infoSystemConfigurationValueDescription.INFRASTRUCTURE_SYNC_THRESHOLD=The maximum number of communities and facilities that can be synchronized in a single infrastructure synchronization call. Lower this value if you expect mobile app users to have a bad internet connection frequently.
+infoSystemConfigurationValueDescription.AUDIT_SOURCE_SITE=Identifies the SORMAS instance in the audit log
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_IGNORE_PROPERTY_ADDITIONAL_DETAILS=Control which values are ignored when shared / overwritten trough S2S. Is applied to all entities shared trough S2S
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_IGNORE_PROPERTY_INTERNAL_TOKEN=Control which values are ignored when shared / overwritten trough S2S. Is applied to all entities shared trough S2S
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_DEFAULTUSER_USERNAME=Credentials of the default user used by the patient diary to communicate with the SORMAS API. Can be used to automate the setup process of new systems.
+infoSystemConfigurationValueDescription.SMS_SENDER_NAME=Name that will be set as the sender of SMS notifications sent out by the system.
+infoSystemConfigurationValueDescription.CENTRAL_OIDC_URL=SORMAS Central URL of the OIDC server (e.g., Keycloak) authenticating 3rd party requests.
+infoSystemConfigurationValueDescription.SURVNET_VERSION_ENDPOINT=Name of the endpoint for getting the version of the SurvNet Gateway
+infoSystemConfigurationValueDescription.SMS_AUTH_KEY=SORMAS supports the delivery of SMS notifications via Vonage (https://www.vonage.com/communications-apis/). You need to specify a valid authentication key and secret in order to use this feature. SORMAS will not attempt to send out SMS if these properties are left empty.
+infoSystemConfigurationValueDescription.COUNTRY_CENTER_LONGITUDE=GPS coordinates of the geographical center of the country SORMAS is used in. The maps on the Dashboard and in the Statistics screen will be centered to these coordinates, if no user-region is provided or map.usecountrycenter=true
+infoSystemConfigurationValueDescription.DUPLICATE_CHECKS_EXCLUDE_PERSONS_ONLY_LINKED_TO_ARCHIVED_ENTRIES=Excludes persons that are only related to archived cases, contacts or event participants when searching for duplicate persons during case, contact or event participant creation. Setting this value to true might increase performance during imports and entity creation, but will likely lead to more duplicate persons in the system.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOM_JOURNAL_SECRET=Authentication details necessary to access the external symptom journal.
+infoSystemConfigurationValueDescription.CUSTOM_BRANDING=SORMAS allows server administrators to customize the name and logo of the application. This will for example affect the login page, main menu, and generated files (like exports or import templates). Further customization can be done by editing the files in the custom directory, e.g. to add additional supporter logos to the sidebar or a disclaimer text to the login area. Determines whether custom branding is supposed to be used. If custom branding is disabled, the following properties as well as the files in the custom directory will have no effect.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_URL=PATIENT DIARIES (e.g. Climedo) Website that is displayed inside an iFrame to create a patient diary user account for a contact person. If left empty, this feature will be disabled.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_DISTRICT_EXTERNAL_ID=External id of the district to which the Cases/Contacts to be assigned when accepting a share request
+infoSystemConfigurationValueDescription.GEOCODING_EPSG4326_WKT=EPSG4326 WKT string used to interpret geo coordinates (e.g. axis order).
+infoSystemConfigurationValueDescription.SORMAS_STATS_URL=URL of the SORMAS STATS app Will be used to create a link inside SORMAS. Must be HTTPS.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOM_JOURNAL_DEFAULTUSER_USERNAME=Credentials of the default user used by the symptom journal to communicate with the SORMAS API. Can be used to automate the setup process of new systems.
+infoSystemConfigurationValueDescription.EMAIL_SENDER_NAME=Name that will be set as the sender of email notifications sent out by the system.
+infoSystemConfigurationValueDescription.COUNTRY_LOCALE=The default locale each user will be using as long as they don't overwrite it in their settings. It impacts both the language that SORMAS is displayed in as well as the date and number formats. This property must be filled in for SORMAS to work properly. If it's not specified, the application will try to fall back to English.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENTDIARY_TOKEN_LIFETIME=Number of seconds tokens fetched via the authurl (and frontendAuthurl) are cached. Defaults to 21600 (6 hrs.).
+infoSystemConfigurationValueDescription.CENTRAL_ETCD_CLIENT_PASSWORD=The client password used in etcd authentication
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_PATH=SORMAS2SORMAS INTERFACE Path on the server where certificates and files related to SORMAS2SORMAS are stored. Please have a look at the "File Paths" section to see how paths are supposed to be formatted depending on your operating system.
+infoSystemConfigurationValueDescription.MAP_USECOUNTRYCENTER=Forces the dashboard map to always center on the country.center coordinates defined above.
+infoSystemConfigurationValueDescription.INTERFACE_PATIENT_DIARY_DEFAULTUSER_PASSWORD=Authentication details necessary to access the external patient diary. URL used to retrieve tokens for backend requests.
+infoSystemConfigurationValueDescription.CUSTOM_PATH=Path where custom files that are used by the system for various purposes can be stored, e.g. HTML content for the login page or a custom logo.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_ROOT_CA_ALIAS=The alias of the trusted root CA
+infoSystemConfigurationValueDescription.EMAIL_SENDER_ADDRESS=^.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
+infoSystemConfigurationValueDescription.DUPLICATECHECKS_NATIONAL_HEALTH_ID_OVERRIDES_CRITERIA=Determines whether the national health ID is used to unambiguously identify duplicate persons irrespective of whether other fields match or not.
+infoSystemConfigurationValueDescription.INTERFACE_SYMPTOM_JOURNAL_DEFAULTUSER_PASSWORD=Credentials of the default user used by the symptom journal to communicate with the SORMAS API. Can be used to automate the setup process of new systems.
+infoSystemConfigurationValueDescription.MINIMUM_ADULT_AGE=Minimum adult age
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_IGNORE_PROPERTY_EXTERNAL_TOKEN=Control which values are ignored when shared / overwritten trough S2S. Is applied to all entities shared trough S2S
+infoSystemConfigurationValueDescription.RSCRIPT_EXECUTABLE=Path to the R script executable
+infoSystemConfigurationValueDescription.SURVNET_URL=URL of the SurvNet Gateway. Leaving this empty will disable all features related to SurvNet.
+infoSystemConfigurationValueDescription.SORMAS2SORMAS_TRUSTSTORE_PASS=Password of the trust store.
+infoSystemConfigurationValueDescription.CSV_SEPARATOR=The character used in .csv files to separate columns from each other. Should match the separator that is commonly used in the locale specified in country.locale.
+infoSystemConfigurationValueDescription.DEV_MODE=Dev mode allows administrators to use functionalities that are not intended for live systems, such as creating random cases for testing or training purposes.
+infoSystemConfigurationValueDescription.MENU_BACKGROUND_COLOR=Allows to distinguish various SORMAS instances by specifying a custom background color. You can either use defaults: default|red|green|indigo|gray or use the hexadecimal format, example: #dd2b0e or #4AA
+infoSystemConfigurationValueDescription.MENU_SUBTITLE=Will be displayed under the application name in the menu. Can be used to define name of the environment: PRODUCTION - TEST etc.
notificationCannotCreate=Cannot Create Or Edit Notification
notificationCreationNotAllowedWithoutSurveillanceReport=Notifier creation or modification is not allowed when a surveillance report already exists for this case.
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/EmailService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/EmailService.java
index 7b82ac87172..89ef7a1c276 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/EmailService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/EmailService.java
@@ -39,11 +39,11 @@
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
-import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
-import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationValueEjb;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
+
@Stateless(name = "EmailService")
@LocalBean
public class EmailService {
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/SmsService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/SmsService.java
index 99d9eef0a5a..381482d5e2e 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/SmsService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/messaging/SmsService.java
@@ -24,8 +24,6 @@
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
-import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
-import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationValueEjb;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +38,7 @@
import com.nexmo.client.sms.SmsSubmissionResponseMessage;
import com.nexmo.client.sms.messages.TextMessage;
+import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
@Stateless(name = "SmsService")
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/systemconfiguration/SystemConfigurationValueEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/systemconfiguration/SystemConfigurationValueEjb.java
index 195d080bc22..3146598b319 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/systemconfiguration/SystemConfigurationValueEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/systemconfiguration/SystemConfigurationValueEjb.java
@@ -132,6 +132,7 @@ public String getValue(final String key) {
}
@PermitAll
+ @Override
public boolean exists(final String key) {
return configurationValuesByKey.containsKey(key);
}
From b56ac3cfb63598b72147640845cd06c8f5c2d361 Mon Sep 17 00:00:00 2001
From: Pa-Touche <47572440+Pa-Touche@users.noreply.github.com>
Date: Wed, 21 Jan 2026 09:29:40 +0100
Subject: [PATCH 02/46] Started refactoring to use new facade.
---
.run-configs/AGENTS.md | 277 ++++++++++++++++++
.../de/symeda/sormas/api/FacadeProvider.java | 16 +-
.../SystemConfiguration.java | 106 +++++++
.../SystemConfigurationAccessorFacade.java | 63 ++++
.../SystemConfigurationValueDataProvider.java | 8 +-
...temConfigurationValueDiseasesProvider.java | 1 -
.../sormas/api/systemconfiguration/Test.java | 4 +
.../sormas/api/utils/CsvStreamUtils.java | 17 +-
.../de/symeda/sormas/api/utils/Tuple.java | 20 ++
.../src/main/resources/strings.properties | 2 +-
.../sormas/backend/caze/CaseFacadeEjb.java | 4 +-
.../CaseClassificationFacadeEjb.java | 4 +-
.../SurveillanceReportFacadeEjb.java | 2 +-
.../ClinicalVisitFacadeEjb.java | 4 +-
.../sormas/backend/common/CronService.java | 3 +-
.../common/StartupShutdownService.java | 2 +-
.../backend/common/messaging/SmsService.java | 6 +-
.../backend/contact/ContactFacadeEjb.java | 5 +-
.../docgeneration/DocGenerationHelper.java | 3 +-
.../DocumentTemplateFacadeEjb.java | 3 +-
.../document/DocumentStorageService.java | 3 +-
.../EpipulseDiseaseExportFacadeEjb.java | 4 +-
.../event/EventParticipantFacadeEjb.java | 4 +-
.../externalemail/ExternalEmailFacadeEjb.java | 5 +-
.../AutomaticLabMessageProcessor.java | 4 +-
...ernalSurveillanceToolGatewayFacadeEjb.java | 4 +-
.../backend/geo/GeoShapeProviderEjb.java | 3 +-
.../backend/geocoding/GeocodingService.java | 25 +-
.../immunization/ImmunizationFacadeEjb.java | 6 +-
.../importexport/DatabaseExportService.java | 4 +-
.../backend/importexport/ExportFacadeEjb.java | 3 +-
.../backend/importexport/ImportFacadeEjb.java | 3 +-
.../sormas/backend/info/InfoFacadeEjb.java | 3 +-
.../ClientInfraSyncFacadeEjb.java | 3 +-
.../country/CountryFacadeEjb.java | 3 +-
.../backend/person/PersonFacadeEjb.java | 2 +-
.../sormas/backend/person/PersonService.java | 5 +-
.../sample/AdditionalTestFacadeEjb.java | 3 +-
.../backend/sample/PathogenTestFacadeEjb.java | 2 +-
.../sormas/backend/sample/SampleService.java | 3 +-
.../AbstractSormasToSormasInterface.java | 3 +-
.../SormasToSormasFacadeEjb.java | 2 +-
.../SormasToSormasEncryptionFacadeEjb.java | 2 +-
.../SormasToSormasEntitiesHelper.java | 2 +-
.../share/ShareDataBuilderHelper.java | 2 +-
.../SystemConfigurationAccessorEjb.java | 145 +++++++++
.../sormas/backend/task/TaskFacadeEjb.java | 2 +-
.../therapy/PrescriptionFacadeEjb.java | 2 +-
.../TravelEntryImportFacadeEjb.java | 2 +-
.../sormas/backend/user/KeycloakService.java | 3 +-
.../sormas/backend/user/UserFacadeEjb.java | 2 +-
.../visualization/VisualizationFacadeEjb.java | 2 +-
.../src/main/resources/sql/sormas_schema.sql | 38 ++-
.../de/symeda/sormas/rest/RestConfig.java | 3 +-
.../sormas/rest/filter/SessionFilter.java | 4 +-
.../rest/resources/BAGExportResource.java | 4 +-
.../sormas/rest/resources/InfoResource.java | 37 ++-
.../MultiAuthenticationMechanism.java | 11 +-
.../rest/security/s2s/oidc/S2SAuthFilter.java | 4 +-
.../java/de/symeda/sormas/ui/AboutView.java | 10 +-
.../ActivityAsCase/ActivityAsCaseField.java | 4 +-
.../ui/ActivityAsCase/ActivityAsCaseForm.java | 8 +-
.../java/de/symeda/sormas/ui/MainScreen.java | 2 +-
.../main/java/de/symeda/sormas/ui/Menu.java | 8 +-
.../java/de/symeda/sormas/ui/SormasUI.java | 2 +-
.../sormas/ui/StartupShutdownService.java | 3 +-
.../AefiInvestigationDataForm.java | 4 +-
.../components/form/AefiDataForm.java | 2 +-
.../sormas/ui/caze/AbstractCaseGrid.java | 4 +-
.../sormas/ui/caze/AbstractCaseView.java | 4 +-
.../symeda/sormas/ui/caze/CaseController.java | 2 +-
.../symeda/sormas/ui/caze/CaseCreateForm.java | 2 +-
.../symeda/sormas/ui/caze/CaseDataForm.java | 23 +-
.../symeda/sormas/ui/caze/CaseDataView.java | 3 +-
.../symeda/sormas/ui/caze/CaseFilterForm.java | 2 +-
.../sormas/ui/caze/CaseGridDetailed.java | 2 +-
.../symeda/sormas/ui/caze/CaseInfoLayout.java | 2 +-
.../de/symeda/sormas/ui/caze/CasesView.java | 9 +-
.../caseselection/CaseSelectionGrid.java | 2 +-
.../linelisting/LineListingLayout.java | 2 +-
.../porthealthinfo/PortHealthInfoForm.java | 2 +-
.../ui/clinicalcourse/ClinicalCourseForm.java | 2 +-
.../ui/clinicalcourse/ClinicalVisitForm.java | 2 +-
.../ui/clinicalcourse/ClinicalVisitGrid.java | 4 +-
.../AbstractConfigurationView.java | 4 +-
.../sormas/ui/configuration/DevModeView.java | 12 +-
.../SystemConfigurationValueEditForm.java | 1 +
.../ui/contact/AbstractContactGrid.java | 8 +-
.../sormas/ui/contact/AdoptAddressLayout.java | 2 +-
.../sormas/ui/contact/ContactCreateForm.java | 5 +-
.../sormas/ui/contact/ContactDataForm.java | 15 +-
.../sormas/ui/contact/ContactDataView.java | 7 +-
.../ui/contact/ContactFollowUpGrid.java | 6 +-
.../sormas/ui/contact/ContactsFilterForm.java | 4 +-
.../sormas/ui/contact/ContactsView.java | 4 +-
.../contactfield/ContactLineField.java | 3 +-
.../customexport/CustomExportController.java | 6 +-
.../contacts/ContactsDashboardView.java | 2 +-
.../gis/GisDashboardMapComponent.java | 2 +-
.../map/BaseDashboardMapComponent.java | 10 +-
.../dashboard/map/DashboardMapComponent.java | 2 +-
.../builders/CaseStatusCurveBuilder.java | 4 +-
.../statistics/CaseStatisticsComponent.java | 4 +-
.../summary/DiseaseSummaryComponent.java | 4 +-
.../DocGenerationController.java | 2 +-
.../ui/environment/EnvironmentCreateForm.java | 2 +-
.../ui/environment/EnvironmentDataForm.java | 2 +-
.../sormas/ui/epidata/CaseEpiDataView.java | 2 +-
.../symeda/sormas/ui/epidata/EpiDataForm.java | 10 +-
.../ui/epipulse/EpiPulseExportController.java | 2 +-
.../sormas/ui/events/EventDataForm.java | 4 +-
.../ui/events/EventParticipantsView.java | 2 +-
.../sormas/ui/events/EventsFilterForm.java | 2 +-
.../symeda/sormas/ui/events/EventsView.java | 2 +-
.../sormas/ui/exposure/ExposureForm.java | 2 +-
.../sormas/ui/exposure/ExposuresField.java | 6 +-
.../ExternalMessageController.java | 4 +-
.../externalmessage/ExternalMessageGrid.java | 4 +-
.../externalmessage/ExternalMessagesView.java | 2 +-
.../hospitalization/HospitalizationForm.java | 2 +-
.../form/ImmunizationCreationForm.java | 2 +-
.../components/form/ImmunizationDataForm.java | 2 +-
.../ui/importer/AbstractImportLayout.java | 2 +-
.../sormas/ui/importer/DataImporter.java | 4 +-
.../ui/importer/DocumentMultiFileUpload.java | 2 +-
.../ui/importer/DocumentTemplateReceiver.java | 4 +-
.../DocumentUploadFinishedHandler.java | 2 +-
.../ui/importer/DocumentUploadReceiver.java | 2 +-
.../sormas/ui/importer/ImportReceiver.java | 4 +-
.../sormas/ui/location/LocationEditForm.java | 2 +-
.../ui/login/DefaultPasswordUIHelper.java | 2 +-
.../symeda/sormas/ui/login/LoginHelper.java | 2 +-
.../symeda/sormas/ui/login/LoginScreen.java | 21 +-
.../de/symeda/sormas/ui/login/LoginUI.java | 6 +-
.../de/symeda/sormas/ui/map/LeafletMap.java | 4 +-
.../ui/person/PersonContactDetailsField.java | 4 +-
.../sormas/ui/person/PersonCreateForm.java | 6 +-
.../sormas/ui/person/PersonEditForm.java | 17 +-
.../ui/person/PersonSelectionField.java | 3 +-
.../person/PersonSideComponentsElement.java | 4 +-
.../aggregate/AggregateReportsFilterForm.java | 2 +-
.../sormas/ui/samples/AbstractSampleForm.java | 3 +-
.../ui/samples/PathogenTestController.java | 4 +-
.../sormas/ui/samples/PathogenTestForm.java | 19 +-
.../EnvironmentSampleEditForm.java | 3 +-
.../samples/humansample/HumanSampleGrid.java | 2 +-
.../MultiAuthenticationMechanism.java | 2 +-
.../ui/selfreport/SelfReportDataForm.java | 6 +-
.../ui/statistics/AbstractStatisticsView.java | 2 +-
.../ui/statistics/DatabaseExportView.java | 8 +-
.../sormas/ui/statistics/StatisticsView.java | 4 +-
.../sormas/ui/symptoms/SymptomsForm.java | 6 +-
.../symeda/sormas/ui/task/TaskEditForm.java | 2 +-
.../de/symeda/sormas/ui/task/TaskGrid.java | 4 +-
.../ui/therapy/DrugSusceptibilityForm.java | 2 +-
.../sormas/ui/therapy/PrescriptionGrid.java | 4 +-
.../symeda/sormas/ui/therapy/TherapyForm.java | 4 +-
.../sormas/ui/therapy/TreatmentGrid.java | 4 +-
.../ui/travelentry/TravelEntryDataForm.java | 2 +-
.../ui/travelentry/TravelEntryFilterForm.java | 2 +-
.../components/TravelEntryCreateForm.java | 2 +-
.../symeda/sormas/ui/user/UserController.java | 6 +-
.../de/symeda/sormas/ui/user/UserGrid.java | 3 +-
.../sormas/ui/user/UserSettingsForm.java | 2 +-
.../sormas/ui/user/UserSyncHandler.java | 4 +-
.../symeda/sormas/ui/utils/AbstractForm.java | 2 +-
.../sormas/ui/utils/CustomizableGrid.java | 6 +-
.../symeda/sormas/ui/utils/DownloadUtil.java | 10 +-
.../sormas/ui/utils/ExportEntityName.java | 2 +-
.../sormas/ui/utils/ExternalJournalUtil.java | 14 +-
.../FieldAccessColumnStyleGenerator.java | 5 +-
.../sormas/ui/utils/FieldAccessHelper.java | 4 +-
.../ui/utils/GridExportStreamResource.java | 2 +-
.../ui/utils/V7GridExportStreamResource.java | 2 +-
.../ui/vaccination/VaccinationEditForm.java | 2 +-
175 files changed, 1060 insertions(+), 363 deletions(-)
create mode 100644 .run-configs/AGENTS.md
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfiguration.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationAccessorFacade.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/Test.java
create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/utils/Tuple.java
create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/systemconfiguration/SystemConfigurationAccessorEjb.java
diff --git a/.run-configs/AGENTS.md b/.run-configs/AGENTS.md
new file mode 100644
index 00000000000..0fb6067331e
--- /dev/null
+++ b/.run-configs/AGENTS.md
@@ -0,0 +1,277 @@
+# AGENTS.md
+
+## Overview
+
+SORMAS (Surveillance Outbreak Response Management and Analysis System) is an open-source eHealth system designed for public health authorities to monitor infectious diseases and manage outbreak responses [1](#1-0) . The system consists of separate web and mobile applications optimized for disease surveillance, contact tracing, and outbreak management.
+
+## System Architecture
+
+### Multi-Module Maven Structure
+
+SORMAS follows a multi-module Maven architecture with clear separation of concerns [2](#1-1) :
+
+- **sormas-api**: Shared DTOs, interfaces, and business logic definitions
+- **sormas-backend**: Server-side implementation with facades and services
+- **sormas-ui**: Vaadin-based web application
+- **sormas-rest**: REST API interface
+- **sormas-app**: Android mobile application
+- **sormas-base**: Parent POM with build configuration
+- **sormas-cargoserver**: Local development server setup
+
+### Technology Stack
+
+The system uses Java EE 8 on Payara Server 5.2022.5 [3](#1-2) with:
+
+- **Backend**: EJB 3.2, JPA 2.2, JAX-RS 2.1, CDI 2.0
+- **Database**: PostgreSQL with Hibernate 5.6.15
+- **Web UI**: Vaadin 8.14.3 with GWT compiler
+- **Mobile**: Android with ORMLite for SQLite
+- **Authentication**: Keycloak 21.1.2 for OIDC/OAuth2
+- **API Documentation**: Swagger/OpenAPI 2.2.15
+
+## Core Domain Model
+
+SORMAS manages public health data through interconnected entities:
+
+- **Person**: Central entity for demographic data
+- **Case**: Disease cases with classification and outcome tracking
+- **Contact**: Exposed individuals with follow-up status
+- **Event**: Outbreaks or gatherings with participants
+- **Sample & PathogenTest**: Laboratory specimen tracking
+- **Immunization**: Vaccination history and records
+
+## Development Environment
+
+### Prerequisites
+
+- Java 11 JDK for backend development [4](#1-3)
+- Maven 3.6.3+ for build management
+- PostgreSQL database
+- Payara Server for deployment
+
+### Setup Process
+
+1. Clone repository and configure Git for rebase workflow
+2. Install Java 11 JDK and Maven
+3. Set up local SORMAS server using Maven Cargo or Docker
+4. Configure IDE (IntelliJ or Eclipse) with proper plugins
+5. Build project with `mvn install` from sormas-base directory
+
+## Key Development Patterns
+
+### Facade-Service Architecture
+
+Backend follows a clear separation:
+
+- **Facades**: EJBs with `@RightsAllowed` annotations for security
+- **Services**: Business logic implementation with JPA queries
+- **DTOs**: Data transfer objects for client communication
+
+### Testing Framework
+
+Uses comprehensive testing approach [5](#1-4) :
+
+- JUnit 5 for core testing
+- Hamcrest for matchers
+- Mockito for mocking
+- ArchUnit for architectural rules
+- Testcontainers for PostgreSQL integration tests
+
+### Security Model
+
+Multi-layered security with:
+
+- OIDC/OAuth2 via Keycloak
+- Role-based access control with `@RightsAllowed`
+- Jurisdiction-based data filtering
+- Pseudonymization for GDPR compliance
+
+## Important Configuration
+
+### sormas.properties
+
+Main configuration file controls [6](#1-5) :
+
+- Feature flags and server settings
+- Authentication providers
+- Database connections
+- File paths and external service URLs
+
+### Feature Management
+
+System uses feature toggles in `FeatureType` enum [7](#1-6) to enable/disable functionality per deployment.
+
+## API Documentation
+
+REST API is automatically documented with OpenAPI specification [8](#1-7) :
+
+- Semantic versioning (X.Y.Z)
+- Development branch for ongoing work
+- Feature branches for new functionality
+- Pull requests with code review requirements
+
+## Documentation Structure
+
+Comprehensive documentation in docs/ folder:
+
+- `CONTRIBUTING.md`: Development guidelines
+- `DEVELOPMENT_ENVIRONMENT.md`: Setup instructions
+- `SERVER_SETUP.md`: Production deployment
+- `SERVER_CUSTOMIZATION.md`: Configuration options
+
+## Notes
+
+This reference document provides essential technical information for understanding and working with the SORMAS codebase. For detailed implementation specifics, refer to the individual module README files and the comprehensive wiki documentation available at https://wiki.sorm.as.
+
+Wiki pages you might want to explore:
+
+- [Overview (SORMAS-Foundation/SORMAS-Project)](/wiki/SORMAS-Foundation/SORMAS-Project#1)
+
+### Citations
+
+**File:** README.md (L16-19)
+
+```markdown
+# SORMAS
+
+**SORMAS** (Surveillance Outbreak Response Management and Analysis System) is an open source eHealth system - consisting of separate web and mobile apps - that is geared towards optimizing the processes used in monitoring the spread of infectious diseases and responding to outbreak situations.
+
+```
+
+**File:** README.md (L77-93)
+
+```markdown
+## Project Structure
+
+The project consists of the following modules:
+
+- [**sormas-api:**](/sormas-api) General business logic and definitions for data exchange between app and server
+- [**sormas-app:**](/sormas-app) The Android app
+- [**sormas-backend:**](/sormas-backend) Server entity services, facades, etc.
+- [**sormas-base:**](/sormas-base) Base project that also contains build scripts
+- [**sormas-cargoserver:**](/sormas-cargoserver) Setup for a local dev server using maven-cargo
+- [**sormas-e2e-performance-tests:**](/sormas-e2e-performance-tests) Automated performance tests addressing the ReST interface (sormas-rest)
+- [**sormas-e2e-tests:**](/sormas-e2e-tests) Automated frontend tests addressing sormas-ui **and** API tests against sormas-rest. The API steps are partly used to prepare data for UI tests.
+- [**sormas-ear:**](/sormas-ear) The ear needed to build the application
+- [**sormas-keycloak-service-provider:**](/sormas-keycloak-service-provider) Custom Keycloak SPI for SORMAS
+- [**sormas-rest:**](/sormas-rest) The REST interface; see [`sormas-rest/README.md`](sormas-rest/README.md)
+- [**sormas-serverlibs:**](/sormas-serverlibs) Dependencies to be deployed with the payara server
+- [**sormas-ui:**](/sormas-ui) The web application
+- [**sormas-widgetset:**](/sormas-widgetset) The GWT widgetset generated by Vaadin
+- [**sormas-e2e-tests:**](/sormas-e2e-tests) Automated tests addressing the sormas-ui, and the ReST interface
+```
+
+**File:** sormas-base/pom.xml (L20-27)
+
+```text
+
+ 2.3.7
+ 2.13.4
+ 1.2.2
+ 8.0.1
+ 2.37
+
+ 5.2022.5
+```
+
+**File:** docs/DEVELOPMENT_ENVIRONMENT.md (L14-18)
+
+```markdown
+## Step 2: Install Java
+
+Download and install the **Java 11 JDK** (not JRE) for your operating system, which is also needed for the [Server Setup](SERVER_SETUP.md).
+We suggest using [Zulu OpenJDK](https://www.azul.com/downloads/?version=java-11-lts&package=jdk). If you're running Linux, please refer to the [official documentation](https://docs.azul.com/zulu/zuludocs/ZuluUserGuide/PrepareZuluPlatform/AttachAPTRepositoryUbuntuOrDebianSys.htm) on how to install Zulu OpenJDK on your system.
+
+Note: To work with the Android app JDK 17 is needed for the gradle build. The needed JDK is part of Android Studio, thus there is no need to manually install it.
+```
+
+**File:** sormas-backend/README.md (L5-19)
+
+```markdown
+## Unit Testing
+
+### JUnit 5, Hamcrest & Mockito
+
+* [Junit 5](https://junit.org/junit5/) is the core testing framework used here.
+* [Hamcrest](https://hamcrest.org/JavaHamcrest/index) is used to define declarative matchers.\
+ A good tutorial can be found here: [Hamcrest Guide](https://www.baeldung.com/java-junit-hamcrest-guide).
+* [Mockito](https://site.mockito.org/) is used to mock unavailable or unwanted behaviour of classes and methods.\
+ An extensive tutorial can be found here: [Mockito Tutorial](https://www.baeldung.com/mockito-series).
+
+### Jakarta EE Testing
+
+The relevant aspects of Jakarta EE are covered in the following sub chapters.
+
+Most important:
+
+* **The `AbstractBeanTest` class should be used as a super class** for all EJB unit test classes. It initializes all needed mocks (e.g. `javax.ejb.SessionContext`) and provides some utility methods like `loginWith` and `executeInTransaction` (see below).
+* The TestDataCreator class should be used to generated test entities and dtos where needed.
+```
+
+**File:** sormas-base/setup/sormas.properties (L114-128)
+
+```properties
+# Determines whether default infrastructure data and users are created when the server is starting with an empty database.
+# Please note that a default admin user is always created to make sure that you can log in and use the system.
+# Default: false
+# Possible Values: true, false
+#createDefaultEntities=false
+# Determines whether logging in as a default user using a default password will bring up a prompt that asks the user to change their password.
+# Default: false
+# Possible Values: true, false
+#skipDefaultPasswordCheck=false
+# Dev mode allows administrators to use functionalities that are not intended for live systems, such as creating random cases for testing or training purposes.
+# Default: false
+# Possible Values: true, false
+#devmode=false
+```
+
+**File:** sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java (L340-371)
+
+```java
+ public static final FeatureType[] SURVEILLANCE_FEATURE_TYPES = {
+ FeatureType.CASE_SURVEILANCE,
+ FeatureType.EVENT_SURVEILLANCE,
+ FeatureType.AGGREGATE_REPORTING};
+
+/**
+ * Server feature means that the feature only needs to be configured once per server since they define the way the system
+ * is supposed to operate.
+ */
+private final boolean serverFeature;
+
+/**
+ * Is the feature enabled by default?
+ */
+private final boolean enabledDefault;
+
+private final FeatureType[] dependentFeatures;
+private final List entityTypes;
+private final Map supportedPropertyDefaults;
+
+FeatureType(
+ boolean serverFeature,
+ boolean enabledDefault,
+ FeatureType[] dependentFeatures,
+ List entityTypes,
+ Map supportedPropertyDefaults) {
+ this.serverFeature = serverFeature;
+ this.enabledDefault = enabledDefault;
+ this.dependentFeatures = dependentFeatures;
+ this.entityTypes = entityTypes;
+ this.supportedPropertyDefaults = supportedPropertyDefaults;
+}
+```
+
+**File:** sormas-rest/README.md (L19-25)
+
+```markdown
+## API Documentation
+
+The SORMAS REST API is documented automatically. The OpenAPI specification files are generated during the build process
+and can be found at `${Project Root}/sormas-rest/target/swagger.{json,yaml}`.
+
+You can render the OpenAPI specification with tools like
+[editor.swagger.io](https://editor.swagger.io/?url=https://raw.githubusercontent.com/sormas-foundation/SORMAS-Project/development/sormas-rest/swagger.yaml).
+This allows you to inspect endpoints and example payloads, generate a matching API client for many languages, and to easily interact with the API of a live instance.
+```
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
index 1b2e5edcb41..298e6113b91 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java
@@ -14,7 +14,6 @@
*/
package de.symeda.sormas.api;
-import javax.naming.ConfigurationException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
@@ -108,6 +107,8 @@
import de.symeda.sormas.api.survey.SurveyFacade;
import de.symeda.sormas.api.survey.SurveyTokenFacade;
import de.symeda.sormas.api.symptoms.SymptomsFacade;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
+import de.symeda.sormas.api.systemconfiguration.SystemConfigurationAccessorFacade;
import de.symeda.sormas.api.systemconfiguration.SystemConfigurationCategoryFacade;
import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
import de.symeda.sormas.api.systemevents.SystemEventFacade;
@@ -297,6 +298,10 @@ public static ConfigFacade getConfigFacade() {
return get().lookupEjbRemote(ConfigFacade.class);
}
+ public static SystemConfigurationAccessorFacade getSystemConfigFacade() {
+ return get().lookupEjbRemote(SystemConfigurationAccessorFacade.class);
+ }
+
public static ExportFacade getExportFacade() {
return get().lookupEjbRemote(ExportFacade.class);
}
@@ -471,13 +476,8 @@ public static ExternalMessageFacade getExternalMessageFacade() {
}
public static ExternalMessageAdapterFacade getExternalLabResultsFacade() throws NamingException {
-
- String jndiName = FacadeProvider.getConfigFacade().getExternalMessageAdapterJndiName();
- if (jndiName == null) {
- throw new ConfigurationException("No LabResultAdapter JNDI name is configured in the sormas.properties");
- } else {
- return (ExternalMessageAdapterFacade) get().ic.lookup(jndiName);
- }
+ return (ExternalMessageAdapterFacade) get().ic
+ .lookup(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.INTERFACE_EXTERNAL_MESSAGE_ADAPTER_JNDI_NAME));
}
public static SurveillanceReportFacade getSurveillanceReportFacade() {
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfiguration.java b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfiguration.java
new file mode 100644
index 00000000000..e47d3ef5f24
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfiguration.java
@@ -0,0 +1,106 @@
+package de.symeda.sormas.api.systemconfiguration;
+
+public enum SystemConfiguration {
+ AUTHENTICATION_PROVIDER,
+ SMS_AUTH_SECRET,
+ MAP_TILES_URL,
+ SORMAS2SORMAS_ID,
+ CENTRAL_ETCD_HOST,
+ GEOCODING_LONGITUDE_JSON_PATH,
+ INTERFACE_SYMPTOMJOURNAL_URL,
+ COUNTRY_NAME,
+ CUSTOM_BRANDING_USELOGINSIDEBAR,
+ DASHBOARD_MAP_MARKER_LIMIT,
+ INTERFACE_EXTERNAL_MESSAGE_ADAPTER_JNDI_NAME,
+ DAYS_AFTER_SYSTEM_EVENT_GETS_DELETED,
+ CREATE_DEFAULT_ENTITIES,
+ COUNTRY_CENTER_LATITUDE,
+ NAME_SIMILARITY_THRESHOLD,
+ CENTRAL_ETCD_CLIENT_NAME,
+ SORMAS2SORMAS_KEYSTORE_NAME,
+ STEP_SIZE_FOR_CSV_EXPORT,
+ CENTRAL_LOCATION_SYNC,
+ AUTHENTICATION_PROVIDER_USER_SYNC_AT_STARTUP,
+ SORMAS2SORMAS_TRUSTSTORE_NAME,
+ AUDITOR_ATTRIBUTE_LOGGING,
+ INTERFACE_PATIENTDIARY_FRONTEND_AUTHURL,
+ CUSTOM_BRANDING_NAME,
+ COUNTRY_EPID_PREFIX,
+ UI_URL,
+ INTERFACE_SYMPTOMJOURNAL_AUTHURL,
+ SKIP_DEFAULT_PASSWORD_CHECK,
+ APP_URL,
+ APP_LEGACY_URL,
+ SORMAS2SORMAS_IGNORE_PROPERTY_EXTERNAL_ID,
+ INTERFACE_PATIENT_DIARY_ACCEPT_PHONE_CONTACT,
+ CASE_CLASSIFICATION_ALL,
+ MAP_TILES_ATTRIBUTION,
+ IMPORT_FILE_SIZE_LIMIT_MB,
+ INTERFACE_PATIENT_DIARY_PASSWORD,
+ MINIMUM_EMANCIPATED_AGE,
+ SORMAS2SORMAS_OIDC_REALM,
+ CUSTOM_BRANDING_LOGINBACKGROUND_PATH,
+ CENTRAL_ETCD_CA_PATH,
+ INTERFACE_PATIENTDIARY_PROBANDSURL,
+ GEOCODING_SERVICE_URL_TEMPLATE,
+ ALLOWED_FILE_EXTENSIONS,
+ SORMAS2SORMAS_ETCD_KEY_PREFIX,
+ CUSTOM_BRANDING_LOGO_PATH,
+ CASE_CLASSIFICATION_CHOLERA,
+ DOCUMENTS_PATH,
+ INTERFACE_PATIENT_DIARY_AUTHURL,
+ GENERATED_PATH,
+ DOCGENERATION_NULL_REPLACEMENT,
+ INTERFACE_PATIENTDIARY_EMAIL,
+ AUTHENTICATION_PROVIDER_SYNCED_NEW_USER_ROLE,
+ DOCUMENT_UPLOAD_SIZE_LIMIT_MB,
+ SORMAS2SORMAS_KEYSTORE_PASS,
+ GEOCODING_LATITUDE_JSON_PATH,
+ SORMAS2SORMAS_OIDC_CLIENT_ID,
+ CASE_CLASSIFICATION_CORONAVIRUS,
+ NEGATIVE,
+ TEMP_PATH,
+ INTERFACE_SYMPTOM_JOURNAL_CLIENTID,
+ SORMAS2SORMAS_OIDC_CLIENT_SECRET,
+ MAP_ZOOM,
+ AUDIT_LOGGER_CONFIG,
+ INFRASTRUCTURE_SYNC_THRESHOLD,
+ AUDIT_SOURCE_SITE,
+ SORMAS2SORMAS_IGNORE_PROPERTY_ADDITIONAL_DETAILS,
+ SORMAS2SORMAS_IGNORE_PROPERTY_INTERNAL_TOKEN,
+ INTERFACE_PATIENTDIARY_DEFAULTUSER_USERNAME,
+ SMS_SENDER_NAME,
+ CENTRAL_OIDC_URL,
+ SURVNET_VERSION_ENDPOINT,
+ SMS_AUTH_KEY,
+ COUNTRY_CENTER_LONGITUDE,
+ DUPLICATE_CHECKS_EXCLUDE_PERSONS_ONLY_LINKED_TO_ARCHIVED_ENTRIES,
+ INTERFACE_SYMPTOM_JOURNAL_SECRET,
+ CUSTOM_BRANDING,
+ INTERFACE_PATIENTDIARY_URL,
+ SORMAS2SORMAS_DISTRICT_EXTERNAL_ID,
+ GEOCODING_EPSG4326_WKT,
+ SORMAS_STATS_URL,
+ INTERFACE_SYMPTOM_JOURNAL_DEFAULTUSER_USERNAME,
+ EMAIL_SENDER_NAME,
+ COUNTRY_LOCALE,
+ INTERFACE_PATIENTDIARY_TOKEN_LIFETIME,
+ CENTRAL_ETCD_CLIENT_PASSWORD,
+ SORMAS2SORMAS_PATH,
+ MAP_USECOUNTRYCENTER,
+ INTERFACE_PATIENT_DIARY_DEFAULTUSER_PASSWORD,
+ CUSTOM_PATH,
+ SORMAS2SORMAS_ROOT_CA_ALIAS,
+ EMAIL_SENDER_ADDRESS,
+ DUPLICATECHECKS_NATIONAL_HEALTH_ID_OVERRIDES_CRITERIA,
+ INTERFACE_SYMPTOM_JOURNAL_DEFAULTUSER_PASSWORD,
+ MINIMUM_ADULT_AGE,
+ SORMAS2SORMAS_IGNORE_PROPERTY_EXTERNAL_TOKEN,
+ RSCRIPT_EXECUTABLE,
+ SURVNET_URL,
+ SORMAS2SORMAS_TRUSTSTORE_PASS,
+ CSV_SEPARATOR,
+ DEV_MODE,
+ MENU_BACKGROUND_COLOR,
+ MENU_SUBTITLE;
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationAccessorFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationAccessorFacade.java
new file mode 100644
index 00000000000..6becf2baff9
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationAccessorFacade.java
@@ -0,0 +1,63 @@
+package de.symeda.sormas.api.systemconfiguration;
+
+import org.apache.commons.lang3.CharUtils;
+
+import java.util.Optional;
+
+public interface SystemConfigurationAccessorFacade {
+
+ boolean isPresent(SystemConfiguration config);
+
+ default boolean isAbsent(SystemConfiguration config) {
+ return !isPresent(config);
+ }
+
+ Optional getAsInteger(SystemConfiguration config);
+
+ Optional getAsDouble(SystemConfiguration config);
+
+ Optional getAsLong(SystemConfiguration config);
+
+ Optional getAsString(SystemConfiguration config);
+
+ boolean getAsBoolean(SystemConfiguration config);
+
+ default Integer getAsIntegerOrThrow(SystemConfiguration config) {
+ return getAsInteger(config).orElseThrow(() -> buildIllegalStateException(config));
+ }
+
+ private static IllegalStateException buildIllegalStateException(SystemConfiguration config) {
+ return new IllegalStateException(String.format("Required configuration '%s' not found or invalid", config.name()));
+ }
+
+ default Double getAsDoubleOrThrow(SystemConfiguration config) {
+ return getAsDouble(config).orElseThrow(() -> buildIllegalStateException(config));
+ }
+
+ default Long getAsLongOrThrow(SystemConfiguration config) {
+ return getAsLong(config).orElseThrow(() -> buildIllegalStateException(config));
+ }
+
+ default String getAsStringOrThrow(SystemConfiguration config) {
+ return getAsString(config).orElseThrow(() -> buildIllegalStateException(config));
+ }
+
+ default char getAsCharOrThrow(SystemConfiguration config) {
+ return getAsString(config).map(CharUtils::toChar).orElseThrow(() -> buildIllegalStateException(config));
+ }
+
+ String getCountryCode();
+
+// boolean isConfiguredCountry(String countryCode);
+//
+// GeoLatLon getCountryCenter();
+//
+// SymptomJournalConfig getSymptomJournalConfig();
+//
+// PatientDiaryConfig getPatientDiaryConfig();
+//
+// SormasToSormasConfig getS2SConfig();
+//
+// CaseClassificationCalculationMode getCaseClassificationCalculationMode(Disease disease);
+
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDataProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDataProvider.java
index e608a0e1bf2..6c2d259bac2 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDataProvider.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDataProvider.java
@@ -34,7 +34,7 @@ public interface SystemConfigurationValueDataProvider extends Serializable {
*
* @return a set of key names.
*/
- public Set getKeys();
+ Set getKeys();
/**
* Retrieves the available options for the provided data.
@@ -42,7 +42,7 @@ public interface SystemConfigurationValueDataProvider extends Serializable {
*
* @return a map of options where the key is the option name and the value is the option value.
*/
- public Map getOptions();
+ Map getOptions();
/**
* Applies the provided values to the system configuration.
@@ -54,7 +54,7 @@ public interface SystemConfigurationValueDataProvider extends Serializable {
* @param dto
* the data transfer object containing the system configuration values.
*/
- public void applyValues(@Nonnull Map values, @Nonnull SystemConfigurationValueDto dto);
+ void applyValues(@Nonnull Map values, @Nonnull SystemConfigurationValueDto dto);
/**
* Retrieves the current values from the system configuration.
@@ -65,6 +65,6 @@ public interface SystemConfigurationValueDataProvider extends Serializable {
* the data transfer object containing the system configuration value.
* @return a map where the key is the mapped keyname and the value is the corresponding option value.
*/
- public Map getMappedValues(@Nonnull SystemConfigurationValueDto dto);
+ Map getMappedValues(@Nonnull SystemConfigurationValueDto dto);
}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDiseasesProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDiseasesProvider.java
index da0c4bd5464..8ebbfeb6277 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDiseasesProvider.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/SystemConfigurationValueDiseasesProvider.java
@@ -52,7 +52,6 @@ public Set getKeys() {
*/
@Override
public Map getOptions() {
-
return Collections
.unmodifiableMap(Arrays.stream(Disease.values()).distinct().collect(Collectors.toMap(Disease::getName, Disease::toShortString)));
}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/Test.java b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/Test.java
new file mode 100644
index 00000000000..1de576ff1f5
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/systemconfiguration/Test.java
@@ -0,0 +1,4 @@
+package de.symeda.sormas.api.systemconfiguration;
+
+public interface Test {
+}
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/CsvStreamUtils.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/CsvStreamUtils.java
index 81b4e9c1401..32ff91fb0b3 100644
--- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/CsvStreamUtils.java
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/CsvStreamUtils.java
@@ -34,7 +34,6 @@
import com.opencsv.CSVWriter;
-import de.symeda.sormas.api.ConfigFacade;
import de.symeda.sormas.api.EntityDto;
import de.symeda.sormas.api.importexport.ExportConfigurationDto;
import de.symeda.sormas.api.importexport.ExportEntity;
@@ -42,6 +41,8 @@
import de.symeda.sormas.api.importexport.format.ExportFormat;
import de.symeda.sormas.api.importexport.format.FormatterProvider;
import de.symeda.sormas.api.importexport.format.IExportFormatter;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
+import de.symeda.sormas.api.systemconfiguration.SystemConfigurationAccessorFacade;
import de.symeda.sormas.api.utils.fieldvisibility.checkers.CountryFieldVisibilityChecker;
public class CsvStreamUtils {
@@ -52,15 +53,21 @@ public static void writeCsvContentToStream(
SupplierBiFunction, String> propertyIdCaptionSupplier,
ExportConfigurationDto exportConfiguration,
final Predicate redMethodFilter,
- ConfigFacade configFacade,
+ SystemConfigurationAccessorFacade configFacade,
OutputStream out) {
try (
- CSVWriter writer = CSVUtils.createCSVWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8.name()), configFacade.getCsvSeparator())) {
+ CSVWriter writer = CSVUtils.createCSVWriter(
+ new OutputStreamWriter(out, StandardCharsets.UTF_8.name()),
+ configFacade.getAsCharOrThrow(SystemConfiguration.CSV_SEPARATOR))) {
// 1. fields in order of declaration - not using Introspector here, because it gives properties in alphabetical order
List readMethods =
- getExportRowClassReadMethods(csvRowClass, exportConfiguration, redMethodFilter, configFacade.getCountryLocale());
+ getExportRowClassReadMethods(
+ csvRowClass,
+ exportConfiguration,
+ redMethodFilter,
+ configFacade.getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
// 2. replace entity fields with all the columns of the entity
Map> subEntityProviders = new HashMap>();
@@ -130,7 +137,7 @@ public static void writeCsvContentToStream(
writer.writeNext(labels, false);
int startIndex = 0;
- int stepSize = configFacade.getStepSizeForCsvExport();
+ int stepSize = configFacade.getAsIntegerOrThrow(SystemConfiguration.STEP_SIZE_FOR_CSV_EXPORT);
List exportRows;
do {
diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/Tuple.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/Tuple.java
new file mode 100644
index 00000000000..1a8a7144bd8
--- /dev/null
+++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/Tuple.java
@@ -0,0 +1,20 @@
+package de.symeda.sormas.api.utils;
+
+public class Tuple {
+
+ private final F first;
+ private final S second;
+
+ public Tuple(final F first, final S second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ public F getFirst() {
+ return first;
+ }
+
+ public S getSecond() {
+ return second;
+ }
+}
diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties
index 351889eee32..9414a1d650a 100644
--- a/sormas-api/src/main/resources/strings.properties
+++ b/sormas-api/src/main/resources/strings.properties
@@ -2008,7 +2008,7 @@ infoSystemConfigurationValueDescription.COUNTRY_EPID_PREFIX=If your country is u
infoSystemConfigurationValueDescription.UI_URL=Path to the folder on the server where documents added as attachments to cases, contacts or events are stored. URL of the SORMAS UI Will be used in email and SMS notifications to link to a specific page.
infoSystemConfigurationValueDescription.INTERFACE_SYMPTOMJOURNAL_AUTHURL=Authentication details necessary to access the external symptom journal.
infoSystemConfigurationValueDescription.SKIP_DEFAULT_PASSWORD_CHECK=Determines whether logging in as a default user using a default password will bring up a prompt that asks the user to change their password.
-infoSystemConfigurationValueDescription.APP.URL=The URL that can be used to download the Android .apk file. Must contain a placeholder for the app version, or a specific version number (not recommended). If you want to use the mobile app, this property must be filled in because the app is using it to automatically download new versions. Example: https://SERVER-NAME/downloads/sormas-%version-release.apk
+infoSystemConfigurationValueDescription.APP_URL=The URL that can be used to download the Android .apk file. Must contain a placeholder for the app version, or a specific version number (not recommended). If you want to use the mobile app, this property must be filled in because the app is using it to automatically download new versions. Example: https://SERVER-NAME/downloads/sormas-%version-release.apk
infoSystemConfigurationValueDescription.SORMAS2SORMAS_IGNORE_PROPERTY_EXTERNAL_ID=Control which values are ignored when shared / overwritten trough S2S. Is applied to all entities shared trough S2S
infoSystemConfigurationValueDescription.INTERFACE_PATIENT_DIARY_ACCEPT_PHONE_CONTACT=Configure weather the phone number is accepted for registering a person in the patient diary
infoSystemConfigurationValueDescription.CASE_CLASSIFICATION_ALL=Configuration for case classification calculation for all diseases.
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java
index e81ac43c9c9..d4987e14339 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java
@@ -240,7 +240,6 @@
import de.symeda.sormas.backend.clinicalcourse.HealthConditionsMapper;
import de.symeda.sormas.backend.common.AbstractCoreFacadeEjb;
import de.symeda.sormas.backend.common.AbstractDomainObject;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.common.CriteriaBuilderHelper;
import de.symeda.sormas.backend.common.CriteriaBuilderHelper.OrderBuilder;
import de.symeda.sormas.backend.common.NotificationService;
@@ -331,6 +330,7 @@
import de.symeda.sormas.backend.symptoms.Symptoms;
import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb;
import de.symeda.sormas.backend.symptoms.SymptomsFacadeEjb.SymptomsFacadeEjbLocal;
+import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationAccessorEjb;
import de.symeda.sormas.backend.task.Task;
import de.symeda.sormas.backend.task.TaskService;
import de.symeda.sormas.backend.therapy.Prescription;
@@ -436,7 +436,7 @@ public class CaseFacadeEjb extends AbstractCoreFacadeEjb regionMultiPolygons = new HashMap<>();
private final Map regionShapes = new HashMap<>();
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/geocoding/GeocodingService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/geocoding/GeocodingService.java
index 27e3ba65d21..a21216814c7 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/geocoding/GeocodingService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/geocoding/GeocodingService.java
@@ -47,9 +47,10 @@
import com.jayway.jsonpath.PathNotFoundException;
import de.symeda.sormas.api.geo.GeoLatLon;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import de.symeda.sormas.api.utils.DataHelper;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.location.Location;
+import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationAccessorEjb;
import de.symeda.sormas.backend.util.ClientHelper;
@Stateless
@@ -64,10 +65,10 @@ public class GeocodingService {
private static final String CITY_PLACEHOLDER = "city";
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
public boolean isEnabled() {
- return configFacade.getGeocodingServiceUrlTemplate() != null;
+ return configFacade.isPresent(SystemConfiguration.GEOCODING_SERVICE_URL_TEMPLATE);
}
public GeoLatLon getLatLon(Location location) {
@@ -83,15 +84,11 @@ public GeoLatLon getLatLon(Location location) {
}
public GeoLatLon getLatLon(LocationQuery query) {
-
- String urlTemplate = configFacade.getGeocodingServiceUrlTemplate();
- if (DataHelper.isNullOrEmpty(urlTemplate)
- || DataHelper.isNullOrEmpty(configFacade.getGeocodingLatitudeJsonPath())
- || DataHelper.isNullOrEmpty(configFacade.getGeocodingLongitudeJsonPath())) {
- return null;
- }
-
- return getLatLon(query, urlTemplate);
+ return configFacade.getAsString(SystemConfiguration.GEOCODING_SERVICE_URL_TEMPLATE)
+ .filter(ignored -> configFacade.isPresent(SystemConfiguration.GEOCODING_LATITUDE_JSON_PATH))
+ .filter(ignored -> configFacade.isPresent(SystemConfiguration.GEOCODING_LONGITUDE_JSON_PATH))
+ .map(urlTemplate -> getLatLon(query, urlTemplate))
+ .orElse(null);
}
private GeoLatLon getLatLon(LocationQuery query, String urlTemplate) {
@@ -133,9 +130,9 @@ private GeoLatLon getLatLon(LocationQuery query, String urlTemplate) {
// read values as object, than parse to double
// JsonPath.read sometimes returns Integer that can't be casted to double, @see #6506
try {
- jsonLatitude = JsonPath.read(responseText, configFacade.getGeocodingLatitudeJsonPath());
+ jsonLatitude = JsonPath.read(responseText, configFacade.getAsStringOrThrow(SystemConfiguration.GEOCODING_LATITUDE_JSON_PATH));
Double latitude = jsonLatitude != null ? Double.parseDouble(jsonLatitude.toString()) : null;
- jsonLongitude = JsonPath.read(responseText, configFacade.getGeocodingLongitudeJsonPath());
+ jsonLongitude = JsonPath.read(responseText, configFacade.getAsStringOrThrow(SystemConfiguration.GEOCODING_LONGITUDE_JSON_PATH));
Double longitude = jsonLongitude != null ? Double.parseDouble(jsonLongitude.toString()) : null;
return new GeoLatLon(latitude, longitude);
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java
index 2c3922bfb62..c4b68204e78 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java
@@ -41,9 +41,6 @@
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
-import de.symeda.sormas.api.ConfigFacade;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -115,6 +112,7 @@
import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareInfoHelper;
import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo;
import de.symeda.sormas.backend.specialcaseaccess.SpecialCaseAccessService;
+import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationAccessorEjb;
import de.symeda.sormas.backend.user.User;
import de.symeda.sormas.backend.user.UserFacadeEjb;
import de.symeda.sormas.backend.util.DtoHelper;
@@ -174,7 +172,7 @@ public class ImmunizationFacadeEjb
@EJB
private SpecialCaseAccessService specialCaseAccessService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
public ImmunizationFacadeEjb() {
}
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java
index 757f8d28940..4aa6078d4df 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java
@@ -42,7 +42,6 @@
import de.symeda.sormas.api.feature.FeatureConfigurationDto;
import de.symeda.sormas.api.importexport.DatabaseTable;
-import de.symeda.sormas.api.therapy.Drug;
import de.symeda.sormas.backend.action.Action;
import de.symeda.sormas.backend.activityascase.ActivityAsCase;
import de.symeda.sormas.backend.campaign.Campaign;
@@ -56,7 +55,6 @@
import de.symeda.sormas.backend.clinicalcourse.ClinicalCourse;
import de.symeda.sormas.backend.clinicalcourse.ClinicalVisit;
import de.symeda.sormas.backend.clinicalcourse.HealthConditions;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.contact.Contact;
import de.symeda.sormas.backend.customizableenum.CustomizableEnumValue;
import de.symeda.sormas.backend.deletionconfiguration.DeletionConfiguration;
@@ -225,7 +223,7 @@ public class DatabaseExportService {
@EJB
private FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
public void exportAsCsvFiles(ZipOutputStream zos, List databaseTables) throws IOException {
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ExportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ExportFacadeEjb.java
index ced0a57365e..c8c978d7ccd 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ExportFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ExportFacadeEjb.java
@@ -54,7 +54,6 @@
import de.symeda.sormas.api.utils.ExportErrorException;
import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal;
import de.symeda.sormas.backend.caze.CaseService;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.common.CriteriaBuilderHelper;
import de.symeda.sormas.backend.epidata.EpiDataService;
import de.symeda.sormas.backend.hospitalization.HospitalizationService;
@@ -78,7 +77,7 @@ public class ExportFacadeEjb implements ExportFacade {
private EntityManager em;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private CaseFacadeEjbLocal caseFacade;
@EJB
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java
index 89d291686a0..dbb50b1c462 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java
@@ -144,7 +144,6 @@
import de.symeda.sormas.api.utils.fieldvisibility.checkers.FeatureTypeFieldVisibilityChecker;
import de.symeda.sormas.api.vaccination.VaccinationDto;
import de.symeda.sormas.backend.campaign.form.CampaignFormMetaFacadeEjb.CampaignFormMetaFacadeEjbLocal;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.common.EnumService;
import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal;
@@ -187,7 +186,7 @@ public class ImportFacadeEjb implements ImportFacade {
private static final List VACCINATION_COLUMNS_TO_REMOVE = Collections.singletonList(VaccinationDto.IMMUNIZATION);
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
@EJB
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/info/InfoFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/info/InfoFacadeEjb.java
index 3e0c1fa8ff5..21a370efdce 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/info/InfoFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/info/InfoFacadeEjb.java
@@ -105,7 +105,6 @@
import de.symeda.sormas.api.utils.fieldvisibility.checkers.FeatureTypeFieldVisibilityChecker;
import de.symeda.sormas.api.vaccination.VaccinationDto;
import de.symeda.sormas.api.visit.VisitDto;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.info.EntityColumns.EntityColumn;
@@ -161,7 +160,7 @@ public class InfoFacadeEjb implements InfoFacade {
}
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private UserService userService;
@EJB
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/ClientInfraSyncFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/ClientInfraSyncFacadeEjb.java
index 9defd1a008d..091a57dad4a 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/ClientInfraSyncFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/ClientInfraSyncFacadeEjb.java
@@ -11,7 +11,6 @@
import de.symeda.sormas.backend.campaign.CampaignFacadeEjb;
import de.symeda.sormas.backend.campaign.form.CampaignFormMetaFacadeEjb;
import de.symeda.sormas.backend.caze.classification.CaseClassificationFacadeEjb.CaseClassificationFacadeEjbLocal;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.infrastructure.area.AreaFacadeEjb;
@@ -62,7 +61,7 @@ public class ClientInfraSyncFacadeEjb implements ClientInfraSyncFacade {
@EJB
private CommunityService communityService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
@EJB
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/country/CountryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/country/CountryFacadeEjb.java
index e15bcc40435..860a81e673f 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/country/CountryFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/country/CountryFacadeEjb.java
@@ -55,7 +55,6 @@
import de.symeda.sormas.api.utils.EmptyValueException;
import de.symeda.sormas.api.utils.SortProperty;
import de.symeda.sormas.backend.common.AbstractDomainObject;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb;
import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal;
import de.symeda.sormas.backend.infrastructure.AbstractInfrastructureFacadeEjb;
import de.symeda.sormas.backend.infrastructure.InfrastructureAdo;
@@ -80,7 +79,7 @@ public class CountryFacadeEjb
private SubcontinentService subcontinentService;
@EJB
- private ConfigFacadeEjb.ConfigFacadeEjbLocal configFacadeEjb;
+ private SystemConfigurationAccessorEjb configFacadeEjb;
public CountryFacadeEjb() {
}
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java
index 89bc670f782..92b5bd581d1 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java
@@ -260,7 +260,7 @@ public class PersonFacadeEjb extends AbstractBaseEjb getSimilarPersonDtos(Integer limit, PersonSimilari
// Find similar persons by permitted associations, optionally limited to active entries
Predicate personSimilarityFilter = buildSimilarityCriteriaFilter(criteria, cb, personRoot);
- Predicate associationFilter = buildAssociationFilter(queryContext, configFacade.isDuplicateChecksExcludePersonsOfArchivedEntries());
+ Predicate associationFilter = buildAssociationFilter(queryContext, configFacade.getAsString());
personQuery.where(and(cb, personSimilarityFilter, associationFilter));
personQuery.distinct(true);
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java
index 394de84a91b..47fa57def0f 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/AdditionalTestFacadeEjb.java
@@ -20,7 +20,6 @@
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.SortProperty;
import de.symeda.sormas.backend.FacadeHelper;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.user.User;
import de.symeda.sormas.backend.user.UserService;
import de.symeda.sormas.backend.util.DtoHelper;
@@ -40,7 +39,7 @@ public class AdditionalTestFacadeEjb implements AdditionalTestFacade {
@EJB
private UserService userService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@Override
public AdditionalTestDto getByUuid(String uuid) {
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java
index 0cdb7288b91..dbdaa60e551 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/PathogenTestFacadeEjb.java
@@ -126,7 +126,7 @@ public class PathogenTestFacadeEjb implements PathogenTestFacade {
@EJB
private SpecialCaseAccessService specialCaseAccessService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private DrugSusceptibilityMapper drugSusceptibilityMapper;
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java
index 458059e7624..1ef9d3d931c 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java
@@ -54,6 +54,7 @@
import javax.persistence.criteria.Selection;
import javax.persistence.criteria.Subquery;
+import de.symeda.sormas.backend.systemconfiguration.SystemConfigurationAccessorEjb;
import org.apache.commons.collections4.CollectionUtils;
import de.symeda.sormas.api.Disease;
@@ -153,7 +154,7 @@ public class SampleService extends AbstractDeletableAdoService
@EJB
private SpecialCaseAccessService specialCaseAccessService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
public SampleService() {
super(Sample.class, DeletableEntityType.SAMPLE);
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java
index 2bb97ed0102..3603784daec 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java
@@ -85,7 +85,6 @@
import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReport;
import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReportService;
import de.symeda.sormas.backend.common.AbstractCoreAdoService;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb;
import de.symeda.sormas.backend.common.CoreAdo;
import de.symeda.sormas.backend.common.QueryJoins;
import de.symeda.sormas.backend.contact.Contact;
@@ -157,7 +156,7 @@ public abstract class AbstractSormasToSormasInterface getAsInteger(SystemConfiguration config) {
+ return Optional.empty();
+ }
+
+ private T parseProperty(String propertyName, T defaultValue, Function parse) {
+
+ String prop = systemConfigurationValueEjb.getValue(propertyName);
+ if (prop == null) {
+ return defaultValue;
+ }
+
+ try {
+ if (prop.isEmpty()) {
+ logger.debug("The property '" + propertyName + "' is set to empty value");
+ }
+
+ return parse.apply(prop);
+ } catch (Exception e) {
+ logger.error("Could not parse value of property '" + propertyName + "': " + e.getMessage());
+ return defaultValue;
+ }
+ }
+
+ @Override
+ public Optional getAsDouble(SystemConfiguration config) {
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional getAsLong(SystemConfiguration config) {
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional getAsString(SystemConfiguration config) {
+ return Optional.empty();
+ }
+
+ @Override
+ public boolean getAsBoolean(SystemConfiguration config) {
+ return false;
+ }
+
+ @Override
+ public String getCountryCode() {
+ String locale = getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE);
+ String normalizedLocale = normalizeLocaleString(locale);
+
+ if (normalizedLocale.contains("-")) {
+ return normalizedLocale.substring(normalizedLocale.lastIndexOf("-") + 1);
+ } else {
+ return normalizedLocale;
+ }
+ }
+
+ private String normalizeLocaleString(String locale) {
+ locale = locale.trim();
+ int pos = Math.max(locale.indexOf('-'), locale.indexOf('_'));
+ if (pos < 0) {
+ locale = locale.toLowerCase();
+ } else {
+ locale = locale.substring(0, pos).toLowerCase(Locale.ENGLISH) + '-' + locale.substring(pos + 1).toUpperCase(Locale.ENGLISH);
+ }
+ return locale;
+ }
+
+ public SystemConfigurationValueEjb getSystemConfigurationValueEjb() {
+ return systemConfigurationValueEjb;
+ }
+
+ public void setSystemConfigurationValueEjb(SystemConfigurationValueEjb systemConfigurationValueEjb) {
+ this.systemConfigurationValueEjb = systemConfigurationValueEjb;
+ }
+
+// more complex configurations
+
+// @Override
+// public boolean isConfiguredCountry(String countryCode) {
+// return false;
+// }
+//
+// @Override
+// public GeoLatLon getCountryCenter() {
+// return null;
+// }
+//
+// @Override
+// public SymptomJournalConfig getSymptomJournalConfig() {
+// return null;
+// }
+//
+// @Override
+// public PatientDiaryConfig getPatientDiaryConfig() {
+// return null;
+// }
+//
+// @Override
+// public SormasToSormasConfig getS2SConfig() {
+// return null;
+// }
+//
+// @Override
+// public CaseClassificationCalculationMode getCaseClassificationCalculationMode(Disease disease) {
+// return null;
+// }
+
+}
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java
index 6067f8e63f3..c815d3c3dd1 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java
@@ -156,7 +156,7 @@ public class TaskFacadeEjb implements TaskFacade {
@EJB
private MessagingService messagingService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@EJB
private TravelEntryService travelEntryService;
@EJB
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java
index 188e78bec4f..7e1c7adf94d 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/therapy/PrescriptionFacadeEjb.java
@@ -58,7 +58,7 @@ public class PrescriptionFacadeEjb implements PrescriptionFacade {
@EJB
private CaseService caseService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@Override
public List getIndexList(PrescriptionCriteria criteria) {
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/travelentryimport/TravelEntryImportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/travelentryimport/TravelEntryImportFacadeEjb.java
index e3a7d6f469b..420e053eee4 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/travelentryimport/TravelEntryImportFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/travelentryimport/TravelEntryImportFacadeEjb.java
@@ -111,7 +111,7 @@ public class TravelEntryImportFacadeEjb implements TravelEntryImportFacade {
@EJB
private EnumService enumService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@Override
public ImportLineResultDto importData(
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/KeycloakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/KeycloakService.java
index 80cc8aa939d..c99ebd1dd1f 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/KeycloakService.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/KeycloakService.java
@@ -60,7 +60,6 @@
import de.symeda.sormas.api.Language;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.DataHelper.Pair;
-import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
import de.symeda.sormas.backend.user.event.PasswordResetEvent;
import de.symeda.sormas.backend.user.event.SyncUsersFromProviderEvent;
import de.symeda.sormas.backend.user.event.UserCreateEvent;
@@ -79,7 +78,7 @@ public class KeycloakService {
private final Logger logger = LoggerFactory.getLogger(getClass());
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
private static final String OIDC_REALM = "realm";
private static final String OIDC_SERVER_URL = "auth-server-url";
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java
index ff85ead49dd..6f74739d7f1 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java
@@ -193,7 +193,7 @@ public class UserFacadeEjb implements UserFacade {
@EJB
private PersonService personService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@Inject
private Event userCreateEvent;
@Inject
diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visualization/VisualizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visualization/VisualizationFacadeEjb.java
index 56d43214704..d8852f816e4 100644
--- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visualization/VisualizationFacadeEjb.java
+++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visualization/VisualizationFacadeEjb.java
@@ -98,7 +98,7 @@ public class VisualizationFacadeEjb implements VisualizationFacade {
@EJB
private ContactService contactService;
@EJB
- private ConfigFacadeEjbLocal configFacade;
+ private SystemConfigurationAccessorEjb configFacade;
@Override
public String buildTransmissionChainJson(
diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql
index 3b941bd6e76..b1529caaafa 100644
--- a/sormas-backend/src/main/resources/sql/sormas_schema.sql
+++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql
@@ -13893,7 +13893,7 @@ CREATE TRIGGER delete_history_trigger
FOR EACH ROW EXECUTE PROCEDURE delete_history_trigger('systemconfigurationcategory_history', 'id');
ALTER TABLE systemconfigurationcategory_history OWNER TO sormas_user;
-INSERT INTO systemconfigurationcategory(id, uuid, changedate, creationdate, name, caption, description)
+INSERT INTO systemconfigurationcategory(id, uuid, changedate, creationdate, name, caption, description)
VALUES (nextval('entity_seq'), generate_base32_uuid(), now(), now(), 'GENERAL_CATEGORY', 'i18n/General/categoryGeneral', 'i18n/General/categoryGeneral');
CREATE TABLE systemconfigurationvalue (
@@ -15062,4 +15062,40 @@ ALTER TABLE testreport_history ADD COLUMN serotype character varying(255);
ALTER TABLE testreport_history ADD COLUMN straincallstatus character varying(255);
INSERT INTO schema_version (version_number, comment) VALUES (602, 'External message additional fields');
+
+
+-- Migrating sormas.properties to system configurations
+
+ALTER TABLE systemconfigurationvalue
+ ADD COLUMN IF NOT EXISTS default_value TEXT;
+
+DO
+$$
+ DECLARE
+ email_configuration_id bigint; sms_configuration_id bigint; system_configuration_id bigint; general_configuration_id bigint;
+ BEGIN
+
+ SELECT id
+ INTO email_configuration_id
+ FROM systemconfigurationcategory
+ WHERE name = 'EMAIL';
+
+ SELECT id
+ INTO sms_configuration_id
+ FROM systemconfigurationcategory
+ WHERE name = 'SMS';
+
+ INTO general_configuration_id
+ FROM systemconfigurationcategory
+ WHERE
+ name = 'GENERAL_CATEGORY';
+
+
+ END
+$$
+LANGUAGE plpgsql;
+
+
+INSERT INTO schema_version (version_number, comment)
+VALUES (604, 'Migrating sormas.properties to system configurations');
-- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. ***
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java
index 9ab12329e31..e9c0db008f5 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java
@@ -24,6 +24,7 @@
import javax.servlet.annotation.WebListener;
import javax.ws.rs.ApplicationPath;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import org.apache.commons.collections4.SetUtils;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
@@ -97,7 +98,7 @@ public static class FilterStartupListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext ctx = sce.getServletContext();
- String authenticationProvider = FacadeProvider.getConfigFacade().getAuthenticationProvider();
+ String authenticationProvider = FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.AUTHENTICATION_PROVIDER);
if (authenticationProvider.equalsIgnoreCase(AuthProvider.KEYCLOAK)) {
FilterRegistration.Dynamic filterRegistration = ctx.addFilter("KeycloakFilter", KeycloakFilter.class);
filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java
index 1e109090f52..ec4e1d563a8 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java
@@ -50,12 +50,12 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
final RequestContextTO requestContext =
new RequestContextTO(isMobileSyncHeader != null ? Boolean.valueOf(isMobileSyncHeader) : false);
RequestContextHolder.setRequestContext(requestContext);
- FacadeProvider.getConfigFacade().setRequestContext(requestContext);
+ FacadeProvider.getSystemConfigFacade().setRequestContext(requestContext);
chain.doFilter(req, response);
}, request, response);
} finally {
RequestContextHolder.reset();
- FacadeProvider.getConfigFacade().resetRequestContext();
+ FacadeProvider.getSystemConfigFacade().resetRequestContext();
}
}
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java
index 19ee8ed4aa1..3b78ef56c34 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java
@@ -52,7 +52,7 @@ public Response exportCases(String file) {
(propertyId, type) -> propertyId,
null,
null,
- FacadeProvider.getConfigFacade(),
+ FacadeProvider.getSystemConfigFacade(),
output),
"sormas_BAG_cases_",
"csv");
@@ -68,7 +68,7 @@ public Response exportContacts(String file) {
(propertyId, type) -> propertyId,
null,
null,
- FacadeProvider.getConfigFacade(),
+ FacadeProvider.getSystemConfigFacade(),
output),
"sormas_BAG_contacts_",
"csv");
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java
index c290324f207..fb825f44e85 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java
@@ -22,8 +22,10 @@
import javax.ws.rs.core.MediaType;
import de.symeda.sormas.api.FacadeProvider;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import de.symeda.sormas.api.utils.CompatibilityCheckResponse;
import de.symeda.sormas.api.utils.InfoProvider;
+import de.symeda.sormas.api.utils.Tuple;
import de.symeda.sormas.api.utils.VersionHelper;
@Path("/info")
@@ -39,28 +41,33 @@ public String getVersion() {
@GET
@Path("/appurl")
public String getAppUrl(@QueryParam("appVersion") String appVersionString) {
-
int[] appVersion = VersionHelper.extractVersion(appVersionString);
- String appLegacyUrl = FacadeProvider.getConfigFacade().getAppLegacyUrl();
- int[] appLegacyVersion = VersionHelper.extractVersion(appLegacyUrl);
- if (VersionHelper.isVersion(appLegacyVersion)) {
- if (!VersionHelper.isVersion(appVersion)) {
- return appLegacyUrl; // no version -> likely old app 0.22.0 or older
- } else if (VersionHelper.isEqual(appVersion, appLegacyVersion)) {
- return null; // keep legacy version
- } else if (VersionHelper.isBefore(appVersion, appLegacyVersion)) {
- return appLegacyUrl;
- }
- }
+ return FacadeProvider.getSystemConfigFacade()
+ .getAsString(SystemConfiguration.APP_LEGACY_URL)
+ .map(legacyUrl -> new Tuple<>(legacyUrl, VersionHelper.extractVersion(legacyUrl)))
+ .filter(tuple -> VersionHelper.isVersion(tuple.getSecond()))
+ .map(tuple -> {
+ String appLegacyUrl = tuple.getFirst();
+ int[] appLegacyVersion = tuple.getSecond();
+
+ if (!VersionHelper.isVersion(appVersion)) {
+ return appLegacyUrl; // no version -> likely old app 0.22.0 or older
+ } else if (VersionHelper.isEqual(appVersion, appLegacyVersion)) {
+ return null; // keep legacy version
+ } else if (VersionHelper.isBefore(appVersion, appLegacyVersion)) {
+ return appLegacyUrl;
+ }
- return FacadeProvider.getConfigFacade().getAppUrl();
+ return null;
+ })
+ .orElseGet(() -> FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.APP_URL));
}
@GET
@Path("/locale")
public String getLocale() {
- return FacadeProvider.getConfigFacade().getCountryLocale();
+ return FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE);
}
@GET
@@ -72,6 +79,6 @@ public CompatibilityCheckResponse isCompatibleToApi(@QueryParam("appVersion") St
@GET
@Path("/countryname")
public String getCountryName() {
- return FacadeProvider.getConfigFacade().getCountryName();
+ return FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_NAME);
}
}
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/security/MultiAuthenticationMechanism.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/security/MultiAuthenticationMechanism.java
index 33b051c73cb..62563249312 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/security/MultiAuthenticationMechanism.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/security/MultiAuthenticationMechanism.java
@@ -24,24 +24,23 @@
import javax.security.enterprise.authentication.mechanism.http.BasicAuthenticationMechanismDefinition;
import javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism;
import javax.security.enterprise.authentication.mechanism.http.HttpMessageContext;
-import javax.security.enterprise.credential.CallerOnlyCredential;
-import javax.security.enterprise.credential.Credential;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.xml.bind.DatatypeConverter;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHeaders;
-import org.glassfish.soteria.Utils;
import org.glassfish.soteria.cdi.BasicAuthenticationMechanismDefinitionAnnotationLiteral;
import org.glassfish.soteria.mechanisms.BasicAuthenticationMechanism;
import org.keycloak.KeycloakSecurityContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import de.symeda.sormas.api.AuthProvider;
import de.symeda.sormas.api.ConfigFacade;
import de.symeda.sormas.api.FacadeProvider;
import de.symeda.sormas.api.sormastosormas.SormasToSormasApiConstants;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import de.symeda.sormas.api.user.UserDto;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.DefaultEntityHelper;
@@ -50,8 +49,6 @@
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Mechanism which allows configuration of multiple providers trough a system property.
@@ -96,7 +93,7 @@ public class MultiAuthenticationMechanism implements HttpAuthenticationMechanism
@Inject
public MultiAuthenticationMechanism(KeycloakHttpAuthenticationMechanism keycloakHttpAuthenticationMechanism) {
- String authenticationProvider = FacadeProvider.getConfigFacade().getAuthenticationProvider();
+ String authenticationProvider = FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.AUTHENTICATION_PROVIDER);
if (authenticationProvider.equals(AuthProvider.KEYCLOAK)) {
authenticationMechanism = keycloakHttpAuthenticationMechanism;
diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/security/s2s/oidc/S2SAuthFilter.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/security/s2s/oidc/S2SAuthFilter.java
index 704e547c6e7..f8ad1d01070 100644
--- a/sormas-rest/src/main/java/de/symeda/sormas/rest/security/s2s/oidc/S2SAuthFilter.java
+++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/security/s2s/oidc/S2SAuthFilter.java
@@ -77,7 +77,7 @@ private boolean isValidToken(String token, String orgIdSender) throws Verificati
TokenVerifier tokenVerifier = TokenVerifier.create(token, AccessToken.class);
- SormasToSormasConfig sormasToSormasConfig = FacadeProvider.getConfigFacade().getS2SConfig();
+ SormasToSormasConfig sormasToSormasConfig = FacadeProvider.getSystemConfigFacade().getS2SConfig();
// We assert the following:
// 1. The token was issued by the realm we are trusting
@@ -111,7 +111,7 @@ private boolean isValidToken(String token, String orgIdSender) throws Verificati
}
private PublicKey fetchPublicKey() throws VerificationException {
- SormasToSormasConfig sormasToSormasConfig = FacadeProvider.getConfigFacade().getS2SConfig();
+ SormasToSormasConfig sormasToSormasConfig = FacadeProvider.getSystemConfigFacade().getS2SConfig();
ObjectMapper mapper = new ObjectMapper();
JSONWebKeySet jwks;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/AboutView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/AboutView.java
index cdb6d84ac7e..1657ece7d1d 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/AboutView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/AboutView.java
@@ -121,7 +121,7 @@ private VerticalLayout createInfoSection() {
aboutLabel.addStyleName(CssStyles.H1);
infoLayout.addComponent(aboutLabel);
- ConfigFacade configFacade = FacadeProvider.getConfigFacade();
+ ConfigFacade configFacade = FacadeProvider.getSystemConfigFacade();
String infoLabelStr = configFacade.isCustomBranding()
? String.format(I18nProperties.getCaption(Captions.aboutBrandedSormasVersion), configFacade.getCustomBrandingName())
: "SORMAS";
@@ -245,7 +245,7 @@ private VerticalLayout createDocumentsSection() {
FacadeProvider.getDiseaseConfigurationFacade().getAllDiseases(true, true, true),
I18nProperties.getUserLanguage(),
FacadeProvider.getCaseClassificationFacade(),
- FacadeProvider.getConfigFacade()),
+ FacadeProvider.getSystemConfigFacade()),
"classification_rules.html",
"text/html");
new FileDownloader(classificationResource).extend(classificationDocumentButton);
@@ -285,7 +285,7 @@ private VerticalLayout createCustomHtmlSection(String caption, String fileName)
String htmlContentString = "";
- Path customHtmlDirectory = Paths.get(FacadeProvider.getConfigFacade().getCustomFilesPath());
+ Path customHtmlDirectory = Paths.get(FacadeProvider.getSystemConfigFacade().getCustomFilesPath());
Path customFilePath = customHtmlDirectory.resolve(fileName);
try {
@@ -332,7 +332,7 @@ private List listCustomDocumentsFiles() {
}
private boolean shouldShowClassificationDocumentLink() {
- return FacadeProvider.getConfigFacade().isAnyCaseClassificationCalculationEnabled()
+ return FacadeProvider.getSystemConfigFacade().isAnyCaseClassificationCalculationEnabled()
&& FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE);
}
@@ -342,7 +342,7 @@ private boolean shouldShowDataDictionaryLink() {
}
private String getCustomDocumentsPath() {
- return FacadeProvider.getConfigFacade().getCustomFilesPath() + "aboutfiles";
+ return FacadeProvider.getSystemConfigFacade().getCustomFilesPath() + "aboutfiles";
}
public void attachDataProtectionDictionaryDownloader(AbstractComponent target) {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseField.java
index fbfc08b132e..752fcd45ac1 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseField.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseField.java
@@ -83,7 +83,9 @@ protected void updateColumns() {
table.setCellStyleGenerator(
FieldAccessCellStyleGenerator.withFieldAccessCheckers(
ActivityAsCaseDto.class,
- UiFieldAccessCheckers.forSensitiveData(isPseudonymized, FacadeProvider.getConfigFacade().getCountryLocale())));
+ UiFieldAccessCheckers.forSensitiveData(
+ isPseudonymized,
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))));
for (Object columnId : table.getVisibleColumns()) {
if (!columnId.equals(ACTION_COLUMN_ID)) {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseForm.java
index 781f899543f..ece0d3dac72 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/ActivityAsCase/ActivityAsCaseForm.java
@@ -174,7 +174,9 @@ private void addBasicFields() {
ActivityAsCaseDto.ROLE,
ActivityAsCaseDto.WORK_ENVIRONMENT);
- if (CountryHelper.isCountry(FacadeProvider.getConfigFacade().getCountryLocale(), CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (CountryHelper.isCountry(
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
+ CountryHelper.COUNTRY_CODE_GERMANY)) {
AbstractSelect field = getField(ActivityAsCaseDto.TYPE_OF_PLACE);
field.setCaption(I18nProperties.getCaption(Captions.ActivityAsCase_typeOfPlaceIfSG));
field.removeAllItems();
@@ -264,7 +266,9 @@ private void setUpVisibilityDependencies() {
Collections.singletonList(FacilityTypeGroup.WORKING_PLACE),
true);
- if (CountryHelper.isCountry(FacadeProvider.getConfigFacade().getCountryLocale(), CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (CountryHelper.isCountry(
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
+ CountryHelper.COUNTRY_CODE_GERMANY)) {
locationForm
.setFacilityFieldsVisibleExceptTypeGroupField(TypeOfPlace.isFacilityType(getField(ActivityAsCaseDto.TYPE_OF_PLACE).getValue()), true);
getField(ActivityAsCaseDto.TYPE_OF_PLACE).addValueChangeListener(
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java
index b35380f5862..b19df815836 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java
@@ -323,7 +323,7 @@ && permitted(FeatureType.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_MANAGEMENT, UserR
}
if (permitted(FeatureType.TRAVEL_ENTRIES, UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS)
- && FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ && FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
ControllerProvider.getTravelEntryController().registerViews(navigator);
menu.addView(
TravelEntriesView.class,
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/Menu.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/Menu.java
index f3c8976dd29..1ec6f3720ba 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/Menu.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/Menu.java
@@ -81,13 +81,13 @@ public Menu(Navigator navigator) {
top.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
top.addStyleName(ValoTheme.MENU_TITLE);
top.setSpacing(true);
- Label title = new Label(FacadeProvider.getConfigFacade().getSormasInstanceName());
+ Label title = new Label(FacadeProvider.getSystemConfigFacade().getSormasInstanceName());
title.setSizeUndefined();
Image image;
- if (FacadeProvider.getConfigFacade().isCustomBranding()
- && StringUtils.isNotBlank(FacadeProvider.getConfigFacade().getCustomBrandingLogoPath())) {
- Path logoPath = Paths.get(FacadeProvider.getConfigFacade().getCustomBrandingLogoPath());
+ if (FacadeProvider.getSystemConfigFacade().isCustomBranding()
+ && StringUtils.isNotBlank(FacadeProvider.getSystemConfigFacade().getCustomBrandingLogoPath())) {
+ Path logoPath = Paths.get(FacadeProvider.getSystemConfigFacade().getCustomBrandingLogoPath());
image = new Image(null, new FileResource(logoPath.toFile()));
} else {
image = new Image(null, new ThemeResource("img/sormas-logo.png"));
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/SormasUI.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/SormasUI.java
index a8b926b0921..c3fc06ed7c8 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/SormasUI.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/SormasUI.java
@@ -64,7 +64,7 @@ public void init(VaadinRequest vaadinRequest) {
VaadinSession.getCurrent().setConverterFactory(new SormasDefaultConverterFactory());
- getPage().setTitle(FacadeProvider.getConfigFacade().getSormasInstanceName());
+ getPage().setTitle(FacadeProvider.getSystemConfigFacade().getSormasInstanceName());
initMainScreen();
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/StartupShutdownService.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/StartupShutdownService.java
index bf2094ff4e8..2f6c0c88c3c 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/StartupShutdownService.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/StartupShutdownService.java
@@ -35,7 +35,8 @@ public class StartupShutdownService {
@PostConstruct
public void startup() {
- I18nProperties.setDefaultLanguage(Language.fromLocaleString(FacadeProvider.getConfigFacade().getCountryLocale()));
+ I18nProperties.setDefaultLanguage(
+ Language.fromLocaleString(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)));
}
@PreDestroy
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiInvestigationDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiInvestigationDataForm.java
index 416e6fba5a4..c8e25009227 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiInvestigationDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/AefiInvestigationDataForm.java
@@ -52,9 +52,7 @@
import de.symeda.sormas.api.i18n.Validations;
import de.symeda.sormas.api.immunization.ImmunizationDto;
import de.symeda.sormas.api.utils.YesNoUnknown;
-import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers;
import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers;
-import de.symeda.sormas.ui.UserProvider;
import de.symeda.sormas.ui.adverseeventsfollowingimmunization.components.fields.vaccines.AefiVaccinationsField;
import de.symeda.sormas.ui.adverseeventsfollowingimmunization.components.form.FormSectionAccordion;
import de.symeda.sormas.ui.utils.AbstractEditForm;
@@ -294,7 +292,7 @@ public AefiInvestigationDataForm(boolean isCreateAction, boolean isPseudonymized
AefiInvestigationDto.class,
AefiInvestigationDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized));
this.isCreateAction = isCreateAction;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AefiDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AefiDataForm.java
index e5de871f4cc..e46dfe98e19 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AefiDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/adverseeventsfollowingimmunization/components/form/AefiDataForm.java
@@ -125,7 +125,7 @@ public AefiDataForm(boolean isCreateAction, boolean isPseudonymized, boolean inJ
AefiDto.class,
AefiDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized));
this.isCreateAction = isCreateAction;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java
index e0fc73b2a09..9a088867e67 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java
@@ -144,8 +144,8 @@ protected void initColumns() {
setColumns(getGridColumns().toArray(String[]::new));
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
- || FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
+ || FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)) {
getColumn(CaseIndexDto.EPID_NUMBER).setHidden(true);
} else {
getColumn(CaseIndexDto.EXTERNAL_ID).setHidden(true);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java
index e7d2c9b1bea..1cf71946e8b 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java
@@ -204,7 +204,7 @@ public void refreshMenu(SubMenu menu, String params) {
if (UiUtil.permitted(FeatureType.VIEW_TAB_CASES_THERAPY, UserRight.THERAPY_VIEW)
&& !caze.checkIsUnreferredPortHealthCase()
&& UiUtil.enabled(FeatureType.CLINICAL_MANAGEMENT)
- && (!(FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)
+ && (!(FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)
&& THERAPY_DISABLED_DISEASES.contains(caze.getDisease())))
&& Disease.INFLUENZA != caze.getDisease()) {
// Therapy view is not available for Luxembourg for Measles, IMI, IPI, Gradiastis & Cryptosporidiosis cases.
@@ -225,7 +225,7 @@ public void refreshMenu(SubMenu menu, String params) {
EnumSet.of(FeatureType.VIEW_TAB_CASES_FOLLOW_UP, FeatureType.VIEW_TAB_CASES_CLINICAL_COURSE, FeatureType.CLINICAL_MANAGEMENT),
UserRight.CLINICAL_COURSE_VIEW)
&& !caze.checkIsUnreferredPortHealthCase()
- && !(FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)
+ && !(FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)
&& CLINICAL_COURSE_DISABLED_DISEASES.contains(caze.getDisease()))
&& Disease.INFLUENZA != caze.getDisease()) {
// clinical course view is not available for Luxembourg for Measles, IMI, IPI, GIARDIASIS, Cryptosporidiosis cases,
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java
index 5270d8c0668..affa11dfbb9 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java
@@ -1669,7 +1669,7 @@ public void openClassificationRulesPopup(DiseaseClassificationCriteriaDto diseas
classificationRulesLayout.addComponent(confirmedContent);
}
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
if (diseaseCriteria.getConfirmedNoSymptomsCriteria() != null) {
Label confirmedNoSymptomsContent = new Label();
confirmedNoSymptomsContent.setContentMode(ContentMode.HTML);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseCreateForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseCreateForm.java
index bf267593713..f470ffc5eb4 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseCreateForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseCreateForm.java
@@ -165,7 +165,7 @@ public CaseCreateForm(Boolean showHomeAddressForm, Boolean showPersonSearchButto
CaseDataDto.class,
CaseDataDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale())
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))
.andWithFeatureType(FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()),
UiFieldAccessCheckers.getNoop());
this.convertedTravelEntry = convertedTravelEntry;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java
index f5ddc8faeea..90324bd1b3b 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java
@@ -340,7 +340,7 @@ public CaseDataForm(
false,
FieldVisibilityCheckers.withDisease(disease)
.add(new OutbreakFieldVisibilityChecker(viewMode))
- .add(new CountryFieldVisibilityChecker(FacadeProvider.getConfigFacade().getCountryLocale()))
+ .add(new CountryFieldVisibilityChecker(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)))
.add(new UserRightFieldVisibilityChecker(UiUtil::permitted))
.add(new FeatureTypeFieldVisibilityChecker(FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations())),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized));
@@ -1042,12 +1042,15 @@ protected void addFields() {
new HealthConditionsForm(
disease,
FieldVisibilityCheckers.withDisease(disease)
- .add(new CountryFieldVisibilityChecker(FacadeProvider.getConfigFacade().getCountryLocale())),
- UiFieldAccessCheckers.getDefault(true, FacadeProvider.getConfigFacade().getCountryLocale())))
+ .add(
+ new CountryFieldVisibilityChecker(
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))),
+ UiFieldAccessCheckers
+ .getDefault(true, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))))
.setCaption(null);
//diagnosis criteria
- if ((FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)) && disease == Disease.TUBERCULOSIS) {
+ if ((FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)) && disease == Disease.TUBERCULOSIS) {
Label diagnosisCriteriaHeadingLabel = new Label(I18nProperties.getString(Strings.headingDiagnosisCriteria));
diagnosisCriteriaHeadingLabel.addStyleName(H3);
getContent().addComponent(diagnosisCriteriaHeadingLabel, DIAGNOSIS_CRITERIA_HEADING_LOC);
@@ -1087,7 +1090,7 @@ protected void addFields() {
setSoftRequired(true, CaseDataDto.INVESTIGATED_DATE, CaseDataDto.OUTCOME_DATE, CaseDataDto.PLAGUE_TYPE, CaseDataDto.SURVEILLANCE_OFFICER);
if (diseaseClassificationExists()
- && FacadeProvider.getConfigFacade().getCaseClassificationCalculationMode(disease).isManualEnabled()
+ && FacadeProvider.getSystemConfigFacade().getCaseClassificationCalculationMode(disease).isManualEnabled()
&& isVisibleAllowed(CaseDataDto.CASE_CLASSIFICATION)) {
Button caseClassificationCalculationButton = ButtonHelper.createButton(Captions.caseClassificationCalculationButton, e -> {
CaseClassification classification = FacadeProvider.getCaseClassificationFacade().getClassification(getValue());
@@ -1434,7 +1437,7 @@ public String getFormattedHtmlMessage() {
}
// Make external ID field read-only when SORMAS is connected to a SurvNet instance
- if (StringUtils.isNotEmpty(FacadeProvider.getConfigFacade().getExternalSurveillanceToolGatewayUrl())) {
+ if (StringUtils.isNotEmpty(FacadeProvider.getSystemConfigFacade().getExternalSurveillanceToolGatewayUrl())) {
setEnabled(false, CaseDataDto.EXTERNAL_ID);
((TextField) getField(CaseDataDto.EXTERNAL_ID))
.setInputPrompt(I18nProperties.getString(Strings.promptExternalIdExternalSurveillanceTool));
@@ -1834,9 +1837,9 @@ private void setEpidNumberError(TextField epidField, Button assignNewEpidNumberB
}
private boolean shouldHidePaperFormDates() {
- return FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_FRANCE)
- || FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
- || FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND);
+ return FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_FRANCE)
+ || FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
+ || FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND);
}
private static class DiseaseChangeListener implements ValueChangeListener {
@@ -1866,7 +1869,7 @@ public void valueChange(Property.ValueChangeEvent e) {
protected void onConfirm() {
diseaseField.removeValueChangeListener(DiseaseChangeListener.this);
fields.stream().forEach(field -> {
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)) {
if (diseaseField.getValue().equals(Disease.TUBERCULOSIS) && field.getId().equals(CaseDataDto.POST_MORTEM)) {
field.setVisible(true);
} else {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java
index d330539ef5a..e00069a009c 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java
@@ -34,6 +34,7 @@
import de.symeda.sormas.api.sample.SampleCriteria;
import de.symeda.sormas.api.selfreport.SelfReportCriteria;
import de.symeda.sormas.api.selfreport.SelfReportType;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import de.symeda.sormas.api.task.TaskContext;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.vaccination.VaccinationAssociationType;
@@ -150,7 +151,7 @@ protected void initView(String params) {
layout.addSidePanelComponent(taskList, TASKS_LOC);
}
- final boolean isSmsServiceSetUp = FacadeProvider.getConfigFacade().isSmsServiceSetUp();
+ final boolean isSmsServiceSetUp = FacadeProvider.getSystemConfigFacade().isPresent(SystemConfiguration.SMS_AUTH_SECRET);
if (isSmsServiceSetUp && UiUtil.permitted(FeatureType.MANUAL_EXTERNAL_MESSAGES, UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) {
SmsListComponent smsList = new SmsListComponent(getCaseRef(), caze.getPerson(), isEditAllowed);
smsList.addStyleName(CssStyles.SIDE_COMPONENT);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java
index e79c590f53e..b31d38fbee4 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java
@@ -124,7 +124,7 @@ protected CaseFilterForm() {
super(
CaseCriteria.class,
CaseDataDto.I18N_PREFIX,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
JurisdictionFieldConfig.of(CaseDataDto.REGION, CaseDataDto.DISTRICT, CaseDataDto.COMMUNITY));
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGridDetailed.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGridDetailed.java
index 52a23ebdbcb..e0548b123bd 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGridDetailed.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGridDetailed.java
@@ -115,7 +115,7 @@ protected void initColumns() {
super.initColumns();
- if (!FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (!FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
getColumn(CaseIndexDetailedDto.RE_INFECTION).setHidden(true);
}
getColumn(CaseIndexDetailedDto.SEX).setWidth(80);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseInfoLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseInfoLayout.java
index 529827e3de6..dc034299ed5 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseInfoLayout.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseInfoLayout.java
@@ -78,7 +78,7 @@ private void updateCaseInfo() {
caseIdLabel.setId("caseIdLabel");
caseIdLabel.setDescription(caseDto.getUuid());
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
addDescLabel(
leftColumnLayout,
CaseDataDto.EXTERNAL_ID,
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java
index eab5a99c34b..716516524a9 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java
@@ -77,6 +77,7 @@
import de.symeda.sormas.api.sample.AdditionalTestDto;
import de.symeda.sormas.api.sample.SampleDto;
import de.symeda.sormas.api.sample.SampleExportDto;
+import de.symeda.sormas.api.systemconfiguration.SystemConfiguration;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.DateHelper;
import de.symeda.sormas.api.utils.UtilDate;
@@ -248,7 +249,7 @@ private ExportConfigurationDto buildDetailedExportConfiguration() {
caseFollowUpEnabled,
hasClinicalCourseRight,
hasTherapyRight,
- FacadeProvider.getConfigFacade().getCountryLocale(),
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations())
.stream()
.map(ExportPropertyMetaInfo::getPropertyId)
@@ -366,7 +367,7 @@ private void addCommonCasesOverviewToolbar() {
Strings.infoSampleExport);
}
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)
&& UiUtil.permitted(UserRight.BAG_EXPORT)) {
StreamResource bagExportResource = DownloadUtil.createCsvExportStreamResource(
BAGExportCaseDto.class,
@@ -390,7 +391,7 @@ private void addCommonCasesOverviewToolbar() {
caseFollowUpEnabled,
hasClinicalCourseRight,
hasTherapyRight,
- FacadeProvider.getConfigFacade().getCountryLocale(),
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()),
customExportWindow::close);
customExportsLayout.setExportCallback(
@@ -740,7 +741,7 @@ public HorizontalLayout createStatusFilterBar() {
true);
}, hasBulkOperationsRight && UiUtil.permitted(UserRight.CASE_DELETE)));
- final boolean isSmsServiceSetUp = FacadeProvider.getConfigFacade().isSmsServiceSetUp();
+ final boolean isSmsServiceSetUp = FacadeProvider.getSystemConfigFacade().isPresent(SystemConfiguration.SMS_AUTH_SECRET);
if (isSmsServiceSetUp && UiUtil.permitted(FeatureType.MANUAL_EXTERNAL_MESSAGES, UserRight.SEND_MANUAL_EXTERNAL_MESSAGES)) {
menuBarItems.add(
new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.messagesSendSMS), VaadinIcons.MOBILE_RETRO, mi -> {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java
index 329fdabfc5f..be36ecc3d23 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/caseselection/CaseSelectionGrid.java
@@ -59,7 +59,7 @@ private void buildGrid() {
CaseSelectionDto.CASE_CLASSIFICATION,
CaseSelectionDto.OUTCOME);
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
getColumn(CaseSelectionDto.EPID_NUMBER).setHidden(true);
} else {
getColumn(CaseSelectionDto.EXTERNAL_ID).setHidden(true);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/linelisting/LineListingLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/linelisting/LineListingLayout.java
index be2923b5df7..194d5ecb67d 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/linelisting/LineListingLayout.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/components/linelisting/LineListingLayout.java
@@ -573,7 +573,7 @@ private void updateFacilityFields(ComboBox cbFacility, Tex
}
private boolean shouldShowEpidNumber() {
- ConfigFacade configFacade = FacadeProvider.getConfigFacade();
+ ConfigFacade configFacade = FacadeProvider.getSystemConfigFacade();
return UiUtil.permitted(UserRight.CASE_CHANGE_EPID_NUMBER)
&& !configFacade.isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
&& !configFacade.isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoForm.java
index 2fecf46b4c4..02886032a54 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoForm.java
@@ -81,7 +81,7 @@ public PortHealthInfoForm(PointOfEntryDto pointOfEntry, String pointOfEntryDetai
PortHealthInfoDto.class,
PortHealthInfoDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, pseudonymized));
this.pointOfEntry = pointOfEntry;
this.pointOfEntryDetails = pointOfEntryDetails;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseForm.java
index 6b1dec2776f..c889629b37e 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseForm.java
@@ -17,7 +17,7 @@ public ClinicalCourseForm(boolean isPseudonymized, boolean inJurisdiction) {
ClinicalCourseDto.class,
ClinicalCourseDto.I18N_PREFIX,
true,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized));
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitForm.java
index ce80ece4dbe..51ca0237adf 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitForm.java
@@ -40,7 +40,7 @@ public ClinicalVisitForm(boolean create, Disease disease, PersonDto person, bool
UiFieldAccessCheckers.forDataAccessLevel(
UiUtil.getPseudonymizableDataAccessLevel(inJurisdiction),
isPseudonymized,
- FacadeProvider.getConfigFacade().getCountryLocale()));
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)));
if (create) {
hideValidationUntilNextCommit();
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitGrid.java
index fbebeec4aa3..6329d7792bf 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalVisitGrid.java
@@ -68,7 +68,9 @@ public ClinicalVisitGrid(CaseReferenceDto caseRef, boolean isPseudonymized, bool
setCellStyleGenerator(
FieldAccessCellStyleGenerator.withFieldAccessCheckers(
ClinicalVisitIndexDto.class,
- UiFieldAccessCheckers.forSensitiveData(isPseudonymized, FacadeProvider.getConfigFacade().getCountryLocale())));
+ UiFieldAccessCheckers.forSensitiveData(
+ isPseudonymized,
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))));
addItemClickListener(e -> {
if (ACTION_BTN_ID.equals(e.getPropertyId()) || e.isDoubleClick()) {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/AbstractConfigurationView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/AbstractConfigurationView.java
index 6b7391e6764..feb3f1d8b85 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/AbstractConfigurationView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/AbstractConfigurationView.java
@@ -133,7 +133,7 @@ public static Class extends AbstractConfigurationView> registerViews(Navigator
firstAccessibleView = firstAccessibleView != null ? firstAccessibleView : SystemConfigurationView.class;
}
- if (FacadeProvider.getConfigFacade().isDevMode() && UiUtil.permitted(UserRight.DEV_MODE)) {
+ if (FacadeProvider.getSystemConfigFacade().isDevMode() && UiUtil.permitted(UserRight.DEV_MODE)) {
navigator.addView(DevModeView.VIEW_NAME, DevModeView.class);
firstAccessibleView = firstAccessibleView != null ? firstAccessibleView : DevModeView.class;
}
@@ -272,7 +272,7 @@ public void refreshMenu(SubMenu menu, String params) {
false);
}
- if (FacadeProvider.getConfigFacade().isDevMode() && UiUtil.permitted(UserRight.DEV_MODE)) {
+ if (FacadeProvider.getSystemConfigFacade().isDevMode() && UiUtil.permitted(UserRight.DEV_MODE)) {
menu.addView(
DevModeView.VIEW_NAME,
I18nProperties.getPrefixCaption("View", DevModeView.VIEW_NAME.replaceAll("/", ".") + ".short", ""),
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java
index 33f57b38e01..f43adbf8298 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java
@@ -984,7 +984,8 @@ private void generateCases(CaseGenerationConfig config) {
}
fieldVisibilityCheckers =
- FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale());
+ FieldVisibilityCheckers.withDisease(disease)
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
LocalDateTime referenceDateTime =
getReferenceDateTime(i, config.getEntityCountAsNumber(), baseOffset, disease, config.getStartDate(), daysBetween);
@@ -1292,7 +1293,8 @@ private void generateContacts(ContactGenerationConfig contactGenerationConfig) {
for (int i = 0; i < contactGenerationConfig.getEntityCountAsNumber(); i++) {
fieldVisibilityCheckers =
- FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale());
+ FieldVisibilityCheckers.withDisease(disease)
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
LocalDateTime referenceDateTime = getReferenceDateTime(
i,
@@ -1491,7 +1493,8 @@ private void generateEvents(EventGenerationConfig eventGenerationConfig) {
eventGenerationConfig.getStartDate(),
daysBetween);
fieldVisibilityCheckers =
- FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale());
+ FieldVisibilityCheckers.withDisease(disease)
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
} else {
referenceDateTime = getReferenceDateTime(
i,
@@ -1501,7 +1504,8 @@ private void generateEvents(EventGenerationConfig eventGenerationConfig) {
eventGenerationConfig.getStartDate(),
daysBetween);
fieldVisibilityCheckers =
- FieldVisibilityCheckers.withDisease(Disease.OTHER).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale());
+ FieldVisibilityCheckers.withDisease(Disease.OTHER)
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
}
// title
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/system/SystemConfigurationValueEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/system/SystemConfigurationValueEditForm.java
index 391d42e3fab..6662a4af694 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/system/SystemConfigurationValueEditForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/system/SystemConfigurationValueEditForm.java
@@ -91,6 +91,7 @@ public SystemConfigurationValueEditForm(final SystemConfigurationValueDto value)
}
+
/**
* Adds the fields to the form based on the system configuration value.
*/
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java
index 7601e9c4668..1eadd4e1142 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java
@@ -159,11 +159,11 @@ protected void initColumns() {
}
setColumns(getColumnList().toArray(String[]::new));
- if (!FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (!FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
getColumn(ContactIndexDto.CONTACT_CATEGORY).setHidden(true);
}
- if (!FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
- && !FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)) {
+ if (!FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
+ && !FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)) {
getColumn(CaseIndexDto.EXTERNAL_ID).setHidden(true);
getColumn(CaseIndexDto.EXTERNAL_TOKEN).setHidden(true);
}
@@ -172,7 +172,7 @@ protected void initColumns() {
((Column) getColumn(ContactIndexDto.PERSON_UUID)).setRenderer(new UuidRenderer());
((Column) getColumn(ContactIndexDto.FOLLOW_UP_UNTIL)).setRenderer(new DateRenderer(DateFormatHelper.getDateFormat()));
- if (!FacadeProvider.getConfigFacade().isExternalJournalActive()) {
+ if (!FacadeProvider.getSystemConfigFacade().isExternalJournalActive()) {
getColumn(ContactIndexDto.SYMPTOM_JOURNAL_STATUS).setHidden(true);
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AdoptAddressLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AdoptAddressLayout.java
index 216e82ec64a..161e7866383 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AdoptAddressLayout.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AdoptAddressLayout.java
@@ -47,7 +47,7 @@ public AdoptAddressLayout(CaseReferenceDto caseReference) {
private void showAddressOfCasePerson(CaseReferenceDto caseReference) {
LocationEditForm locationForm = new LocationEditForm(
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
UiFieldAccessCheckers.getNoop());
locationForm.setValue(
FacadeProvider.getPersonFacade()
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactCreateForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactCreateForm.java
index f209b3be041..ba56c84fc9d 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactCreateForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactCreateForm.java
@@ -141,7 +141,7 @@ public ContactCreateForm(
ContactDto.class,
ContactDto.I18N_PREFIX,
FieldVisibilityCheckers.withDisease(disease)
- .andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale())
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))
.andWithFeatureType(FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()));
this.disease = disease;
@@ -389,7 +389,8 @@ private void updateContactProximity() {
ContactProximity value = (ContactProximity) contactProximity.getNullableValue();
FieldHelper.updateEnumData(
contactProximity,
- Arrays.asList(ContactProximity.getValues(disease, FacadeProvider.getConfigFacade().getCountryLocale())));
+ Arrays.asList(
+ ContactProximity.getValues(disease, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))));
contactProximity.setValue(value);
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java
index bf4d3f5e447..ad03027438e 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java
@@ -215,14 +215,15 @@ public ContactDataForm(Disease disease, ViewMode viewMode, boolean isPseudonymiz
ContactDto.I18N_PREFIX,
false,
FieldVisibilityCheckers.withDisease(disease)
- .andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale())
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))
.andWithFeatureType(FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized));
this.viewMode = viewMode;
this.disease = disease;
this.diseaseHasFollowUp = FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(disease);
- this.luxMeasles = Disease.MEASLES == disease && FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG);
+ this.luxMeasles =
+ Disease.MEASLES == disease && FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG);
addFields();
}
@@ -543,8 +544,11 @@ protected void addFields() {
new HealthConditionsForm(
disease,
FieldVisibilityCheckers.withDisease(disease)
- .add(new CountryFieldVisibilityChecker(FacadeProvider.getConfigFacade().getCountryLocale())),
- UiFieldAccessCheckers.getDefault(true, FacadeProvider.getConfigFacade().getCountryLocale())));
+ .add(
+ new CountryFieldVisibilityChecker(
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))),
+ UiFieldAccessCheckers
+ .getDefault(true, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))));
clinicalCourseForm.setCaption(null);
Label generalCommentLabel = new Label(I18nProperties.getPrefixCaption(ContactDto.I18N_PREFIX, ContactDto.ADDITIONAL_DETAILS));
@@ -914,7 +918,8 @@ private void updateDiseaseConfiguration(Disease disease) {
FieldHelper.updateEnumData(
contactProximity,
- Arrays.asList(ContactProximity.getValues(disease, FacadeProvider.getConfigFacade().getCountryLocale())));
+ Arrays.asList(
+ ContactProximity.getValues(disease, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))));
}
public Disease getSelectedDisease() {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java
index b8d28e718d9..05245b6dd5b 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java
@@ -14,6 +14,8 @@
*/
package de.symeda.sormas.ui.contact;
+import java.util.List;
+
import com.vaadin.server.Page;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.ui.Button;
@@ -74,8 +76,6 @@
import de.symeda.sormas.ui.utils.components.sidecomponent.SideComponentLayout;
import de.symeda.sormas.ui.vaccination.list.VaccinationListComponent;
-import java.util.List;
-
public class ContactDataView extends AbstractContactView implements HasName {
private static final long serialVersionUID = -1L;
@@ -220,7 +220,8 @@ protected void initView(String params) {
layout.addSidePanelComponent(taskList, TASKS_LOC);
}
- if (!(FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG) && List.of(Disease.INVASIVE_MENINGOCOCCAL_INFECTION, Disease.MEASLES).contains(contactDto.getDisease()))) {
+ if (!(FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_LUXEMBOURG)
+ && List.of(Disease.INVASIVE_MENINGOCOCCAL_INFECTION, Disease.MEASLES).contains(contactDto.getDisease()))) {
if (UiUtil.permitted(UserRight.SAMPLE_VIEW)) {
SampleListComponent sampleList = new SampleListComponent(
new SampleCriteria().contact(getContactRef()).disease(contactDto.getDisease()).sampleAssociationType(SampleAssociationType.CONTACT),
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java
index 441ebdb3eb8..00ec707c8b5 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java
@@ -6,11 +6,8 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import java.util.stream.Collectors;
-import com.vaadin.data.provider.DataProvider;
import com.vaadin.navigator.View;
-import com.vaadin.shared.data.sort.SortDirection;
import com.vaadin.ui.DescriptionGenerator;
import com.vaadin.ui.Label;
import com.vaadin.ui.StyleGenerator;
@@ -25,7 +22,6 @@
import de.symeda.sormas.api.followup.FollowUpDto;
import de.symeda.sormas.api.i18n.I18nProperties;
import de.symeda.sormas.api.utils.DateHelper;
-import de.symeda.sormas.api.utils.SortProperty;
import de.symeda.sormas.api.visit.VisitResultDto;
import de.symeda.sormas.ui.ControllerProvider;
import de.symeda.sormas.ui.utils.DateFormatHelper;
@@ -64,7 +60,7 @@ public ContactFollowUpGrid(ContactCriteria criteria, Class v
((Column) getColumn(FollowUpDto.REPORT_DATE)).setRenderer(new DateRenderer(DateFormatHelper.getDateFormat()));
((Column) getColumn(FollowUpDto.FOLLOW_UP_UNTIL)).setRenderer(new DateRenderer(DateFormatHelper.getDateFormat()));
- if (!FacadeProvider.getConfigFacade().isExternalJournalActive()) {
+ if (!FacadeProvider.getSystemConfigFacade().isExternalJournalActive()) {
getColumn(ContactIndexDto.SYMPTOM_JOURNAL_STATUS).setHidden(true);
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsFilterForm.java
index 0207f77bffc..9fdbf4c3089 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsFilterForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsFilterForm.java
@@ -101,7 +101,7 @@ protected ContactsFilterForm() {
super(
ContactCriteria.class,
ContactIndexDto.I18N_PREFIX,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
JurisdictionFieldConfig.of(ContactCriteria.REGION, ContactCriteria.DISTRICT, ContactCriteria.COMMUNITY));
}
@@ -219,7 +219,7 @@ public void addMoreFilters(CustomLayout moreFiltersContainer) {
200));
followUpUntilTo.removeAllValidators();
- if (FacadeProvider.getConfigFacade().isExternalJournalActive()) {
+ if (FacadeProvider.getSystemConfigFacade().isExternalJournalActive()) {
addField(
moreFiltersContainer,
FieldConfiguration.withCaptionAndPixelSized(
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java
index 6bc015a821f..97de3f73da4 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java
@@ -269,7 +269,7 @@ public ContactsView() {
exportLayout.addComponent(btnCustomExport);
}
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_SWITZERLAND)
&& UiUtil.permitted(UserRight.BAG_EXPORT)) {
StreamResource bagExportResource = DownloadUtil.createCsvExportStreamResource(
BAGExportContactDto.class,
@@ -871,7 +871,7 @@ public static ExportConfigurationDto buildDetailedExportConfiguration() {
ImportExportUtils
.getContactExportProperties(
ContactDownloadUtil::getPropertyCaption,
- FacadeProvider.getConfigFacade().getCountryLocale(),
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations())
.stream()
.map(ExportPropertyMetaInfo::getPropertyId)
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/components/linelisting/contactfield/ContactLineField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/components/linelisting/contactfield/ContactLineField.java
index 9e61c1ce0fb..a4eb0769db5 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/components/linelisting/contactfield/ContactLineField.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/components/linelisting/contactfield/ContactLineField.java
@@ -85,7 +85,8 @@ protected Component initContent() {
}
public void updateTypeOfContactValues(Disease disease) {
- ContactProximity[] values = ContactProximity.getValues(disease, FacadeProvider.getConfigFacade().getCountryLocale());
+ ContactProximity[] values =
+ ContactProximity.getValues(disease, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE));
typeOfContact.setItems(values);
if (!Arrays.asList(values).contains(typeOfContact.getValue())) {
typeOfContact.setValue(null);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/customexport/CustomExportController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/customexport/CustomExportController.java
index 4e9004ba270..c0f57df5833 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/customexport/CustomExportController.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/customexport/CustomExportController.java
@@ -49,7 +49,7 @@ public void openContactExportWindow(ContactCriteria contactCriteria, Supplier new DashboardNetworkComponent(dashboardDataProvider));
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/gis/GisDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/gis/GisDashboardMapComponent.java
index b6e824d1000..1955d344347 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/gis/GisDashboardMapComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/gis/GisDashboardMapComponent.java
@@ -1377,7 +1377,7 @@ private void showEventMarkers() {
if (districtCenter != null) {
marker.setLatLon(districtCenter.getLat(), districtCenter.getLon());
} else {
- GeoLatLon countryCenter = FacadeProvider.getConfigFacade().getCountryCenter();
+ GeoLatLon countryCenter = FacadeProvider.getSystemConfigFacade().getCountryCenter();
marker.setLatLon(countryCenter.getLat(), countryCenter.getLon());
}
} else {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java
index 5b5757bf497..b21e37e18ce 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java
@@ -98,7 +98,7 @@ protected void refreshMap(boolean forced) {
Date fromDate = dashboardDataProvider.getFromDate();
Date toDate = dashboardDataProvider.getToDate();
- int maxDisplayCount = FacadeProvider.getConfigFacade().getDashboardMapMarkerLimit();
+ int maxDisplayCount = FacadeProvider.getSystemConfigFacade().getDashboardMapMarkerLimit();
Long count = 0L;
if (!forced && maxDisplayCount >= 0) {
count = getMarkerCount(fromDate, toDate, maxDisplayCount);
@@ -273,8 +273,8 @@ protected void addComponents() {
final GeoLatLon mapCenter;
// If map.usecountrycenter=true, use config coordinates. Else try to calculate the center of the user region/country
- if (FacadeProvider.getConfigFacade().isMapUseCountryCenter()) {
- mapCenter = FacadeProvider.getConfigFacade().getCountryCenter();
+ if (FacadeProvider.getSystemConfigFacade().isMapUseCountryCenter()) {
+ mapCenter = FacadeProvider.getSystemConfigFacade().getCountryCenter();
map.setCenter(mapCenter);
} else {
UserDto user = UiUtil.getUser();
@@ -284,13 +284,13 @@ protected void addComponents() {
mapCenter = geoShapeProvider.getCenterOfAllRegions();
}
- GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter);
+ GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getSystemConfigFacade()::getCountryCenter);
map.setCenter(center);
}
}
- map.setZoom(FacadeProvider.getConfigFacade().getMapZoom());
+ map.setZoom(FacadeProvider.getSystemConfigFacade().getMapZoom());
// Add components
addComponent(createHeader());
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java
index a8706c77f67..123b8dcaeb8 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java
@@ -997,7 +997,7 @@ private void showEventMarkers(List events) {
if (districtCenter != null) {
marker.setLatLon(districtCenter.getLat(), districtCenter.getLon());
} else {
- GeoLatLon countryCenter = FacadeProvider.getConfigFacade().getCountryCenter();
+ GeoLatLon countryCenter = FacadeProvider.getSystemConfigFacade().getCountryCenter();
marker.setLatLon(countryCenter.getLat(), countryCenter.getLon());
}
} else {
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/CaseStatusCurveBuilder.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/CaseStatusCurveBuilder.java
index 77c1b5d2c74..6e550ba9779 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/CaseStatusCurveBuilder.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/CaseStatusCurveBuilder.java
@@ -40,13 +40,13 @@ List buildEpiCurveSeriesElements(List filteredDates
suspectNumbers[i] = caseCounts.getOrDefault(CaseClassification.SUSPECT, 0).intValue();
notYetClassifiedNumbers[i] = caseCounts.getOrDefault(CaseClassification.NOT_CLASSIFIED, 0).intValue();
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
confirmedNoSymptomsNumbers[i] = caseCounts.getOrDefault(CaseClassification.CONFIRMED_NO_SYMPTOMS, 0).intValue();
confirmedUnknownSymptomsNumbers[i] = caseCounts.getOrDefault(CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS, 0).intValue();
}
}
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
return Arrays.asList(
new EpiCurveSeriesElement(Captions.dashboardNotYetClassified, "#808080", notYetClassifiedNumbers),
new EpiCurveSeriesElement(Captions.dashboardSuspect, "#FFD700", suspectNumbers),
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/CaseStatisticsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/CaseStatisticsComponent.java
index fc332c5e7f7..4794d5ca638 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/CaseStatisticsComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/CaseStatisticsComponent.java
@@ -40,7 +40,7 @@ public CaseStatisticsComponent() {
new DashboardStatisticsCountElement(I18nProperties.getCaption(Captions.dashboardNotACase), CountElementStyle.POSITIVE);
caseClassificationNotYetClassified =
new DashboardStatisticsCountElement(I18nProperties.getCaption(Captions.dashboardNotYetClassified), CountElementStyle.MINOR);
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
buildCountLayout(
caseClassificationConfirmed,
caseClassificationConfirmedNoSymptoms,
@@ -63,7 +63,7 @@ public void update(Map cases) {
updateTotalLabel(Integer.toString(cases.values().stream().reduce(0, Integer::sum)));
caseClassificationConfirmed.updateCountLabel(cases.getOrDefault(CaseClassification.CONFIRMED, 0));
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
caseClassificationConfirmedNoSymptoms.updateCountLabel(cases.getOrDefault(CaseClassification.CONFIRMED_NO_SYMPTOMS, 0));
caseClassificationConfirmedUnknownSymptoms.updateCountLabel(cases.getOrDefault(CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS, 0));
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/summary/DiseaseSummaryComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/summary/DiseaseSummaryComponent.java
index 7990f7ebbaf..faa06307a35 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/summary/DiseaseSummaryComponent.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/summary/DiseaseSummaryComponent.java
@@ -55,7 +55,7 @@ public DiseaseSummaryComponent() {
contactsConvertedToCase = new DiseaseSummaryElementComponent(Strings.headingCasesResultingFromContacts);
addComponent(contactsConvertedToCase);
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
casesWithReferenceDefinitionFulfilled = new DiseaseSummaryElementComponent(Strings.headingcasesWithReferenceDefinitionFulfilled);
addComponent(casesWithReferenceDefinitionFulfilled);
}
@@ -79,7 +79,7 @@ public void update(DashboardDataProvider dashboardDataProvider) {
casesInQuarantineByDate.updateTotalLabel(dashboardDataProvider.getCasesInQuarantineCount().toString());
casesPlacedInQuarantineByDate.updateTotalLabel(dashboardDataProvider.getCasesPlacedInQuarantineCount().toString());
contactsConvertedToCase.updateTotalLabel(dashboardDataProvider.getContactsConvertedToCaseCount().toString());
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)) {
casesWithReferenceDefinitionFulfilled.updateTotalLabel(dashboardDataProvider.getCaseWithReferenceDefinitionFulfilledCount().toString());
}
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/docgeneration/DocGenerationController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/docgeneration/DocGenerationController.java
index cd73d296e73..f4f8b3ad774 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/docgeneration/DocGenerationController.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/docgeneration/DocGenerationController.java
@@ -145,7 +145,7 @@ private ByteArrayInputStream generateZip(
DocumentTemplateDto template,
Boolean shouldUploadGeneratedDoc,
Map generatedDocumentContents) {
- long fileSizeLimitMB = FacadeProvider.getConfigFacade().getDocumentUploadSizeLimitMb();
+ long fileSizeLimitMB = FacadeProvider.getSystemConfigFacade().getDocumentUploadSizeLimitMb();
List fileSizeLimitExceeded = new ArrayList<>();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentCreateForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentCreateForm.java
index c7f425313d7..5d4fc2e4509 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentCreateForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentCreateForm.java
@@ -48,7 +48,7 @@ public EnvironmentCreateForm() {
EnvironmentDto.class,
EnvironmentDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
UiFieldAccessCheckers.getNoop());
addFields();
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java
index 9750ac12dcc..4bf6e21397a 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/environment/EnvironmentDataForm.java
@@ -70,7 +70,7 @@ public EnvironmentDataForm(boolean isPseudonymized, boolean inJurisdiction, bool
EnvironmentDto.class,
EnvironmentDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized),
isEditAllowed);
addFields();
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java
index 7eba690feaa..f14d87d6c26 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java
@@ -101,7 +101,7 @@ protected void initView(String params) {
}
layout.addSidePanelComponent(sourceContactsLayout, LOC_SOURCE_CONTACTS);
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY)
&& UiUtil.permitted(FeatureType.TRAVEL_ENTRIES, UserRight.TRAVEL_ENTRY_VIEW)) {
TravelEntryListCriteria travelEntryListCriteria = new TravelEntryListCriteria.Builder().withCase(getCaseRef()).build();
layout.addSidePanelComponent(
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java
index c2f807af45d..b211b53e16b 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java
@@ -117,7 +117,8 @@ public EpiDataForm(
EpiDataDto.class,
EpiDataDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withDisease(disease)
+ .andWithCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
FieldAccessHelper.getFieldAccessCheckers(inJurisdiction, isPseudonymized),
isEditAllowed);
this.disease = disease;
@@ -141,8 +142,11 @@ protected void addFields() {
new ExposuresField(
disease,
FieldVisibilityCheckers.withDisease(disease)
- .add(new CountryFieldVisibilityChecker(FacadeProvider.getConfigFacade().getCountryLocale())),
- UiFieldAccessCheckers.getDefault(false, FacadeProvider.getConfigFacade().getCountryLocale()),
+ .add(
+ new CountryFieldVisibilityChecker(
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE))),
+ UiFieldAccessCheckers
+ .getDefault(false, FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
true));
exposuresField.setEpiDataParentClass(parentClass);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epipulse/EpiPulseExportController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epipulse/EpiPulseExportController.java
index 9a40b134326..5434e39caf2 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epipulse/EpiPulseExportController.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epipulse/EpiPulseExportController.java
@@ -219,7 +219,7 @@ public void download(EpipulseExportIndexDto exportIndexDto) {
return;
}
- String generatedFilesPath = FacadeProvider.getConfigFacade().getGeneratedFilesPath();
+ String generatedFilesPath = FacadeProvider.getSystemConfigFacade().getGeneratedFilesPath();
String exportFilePath = generatedFilesPath + "/" + exportIndexDto.getExportFileName();
File file = new File(exportFilePath);
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java
index fa474868dd7..7e9ec0397e2 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java
@@ -173,7 +173,7 @@ public EventDataForm(boolean create, boolean isPseudonymized, boolean inJurisdic
EventDto.class,
EventDto.I18N_PREFIX,
false,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
createFieldAccessCheckers(isPseudonymized, inJurisdiction, true));
isCreateForm = create;
@@ -615,7 +615,7 @@ protected void addFields() {
srcMediaName);
// Make external ID field read-only when SORMAS is connected to a SurvNet instance
- if (StringUtils.isNotEmpty(FacadeProvider.getConfigFacade().getExternalSurveillanceToolGatewayUrl())) {
+ if (StringUtils.isNotEmpty(FacadeProvider.getSystemConfigFacade().getExternalSurveillanceToolGatewayUrl())) {
setEnabled(false, EventDto.EXTERNAL_ID);
((TextField) getField(EventDto.EXTERNAL_ID)).setInputPrompt(I18nProperties.getString(Strings.promptExternalIdExternalSurveillanceTool));
}
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java
index dafea38e8cc..8e7479fb95f 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java
@@ -447,7 +447,7 @@ private void addImportExportButtons(HorizontalLayout actionButtonsLayout) {
ExportType.EVENT_PARTICIPANTS,
ImportExportUtils.getEventParticipantExportProperties(
EventParticipantDownloadUtil::getPropertyCaption,
- FacadeProvider.getConfigFacade().getCountryLocale(),
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations()),
customExportWindow::close);
customExportsLayout.setExportCallback(
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsFilterForm.java
index e62ee6a7305..fdce7b35cd2 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsFilterForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsFilterForm.java
@@ -125,7 +125,7 @@ protected EventsFilterForm(boolean hideEventStatusFilter, boolean hideActionFilt
super(
EventCriteria.class,
EventIndexDto.I18N_PREFIX,
- FieldVisibilityCheckers.withCountry(FacadeProvider.getConfigFacade().getCountryLocale()),
+ FieldVisibilityCheckers.withCountry(FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE)),
JurisdictionFieldConfig.of(LocationDto.REGION, LocationDto.DISTRICT, LocationDto.COMMUNITY));
this.hideEventStatusFilter = hideEventStatusFilter;
this.hideActionFilters = hideActionFilters;
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java
index 998192c2341..da613b8fbd6 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java
@@ -752,7 +752,7 @@ private ExportConfigurationDto buildDetailedExportConfiguration() {
.getEventExportProperties(
EventDownloadUtil::getPropertyCaption,
eventGroupFeatureEnabled,
- FacadeProvider.getConfigFacade().getCountryLocale(),
+ FacadeProvider.getSystemConfigFacade().getAsStringOrThrow(SystemConfiguration.COUNTRY_LOCALE),
FacadeProvider.getFeatureConfigurationFacade().getActiveServerFeatureConfigurations())
.stream()
.map(ExportPropertyMetaInfo::getPropertyId)
diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java
index 8dc05fb31ce..6801f33215f 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java
@@ -454,7 +454,7 @@ public void setValue(ExposureDto newFieldValue) throws ReadOnlyException, Conver
protected String createHtmlLayout() {
//@formatter:off
String HTML_LAYOUT = UUID_REPORTING_USER;
- if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY) && epiDataParentClass == CaseDataDto.class) {
+ if (FacadeProvider.getSystemConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY) && epiDataParentClass == CaseDataDto.class) {
HTML_LAYOUT += fluidRowLocs(ExposureDto.PROBABLE_INFECTION_ENVIRONMENT) +
(FacadeProvider.getExternalSurveillanceToolFacade().isFeatureEnabled()
? VaadinIcons.INFO_CIRCLE.getHtml() + " " + (I18nProperties.getString(Strings.infoCheckProbableInfectionEnvironment)) + "