diff --git a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
index 50343d884..590d5aea3 100644
--- a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-bpe-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-server-jetty/pom.xml b/dsf-bpe/dsf-bpe-server-jetty/pom.xml
index 8e84e18a6..70ba7f1c9 100755
--- a/dsf-bpe/dsf-bpe-server-jetty/pom.xml
+++ b/dsf-bpe/dsf-bpe-server-jetty/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-bpe-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-server/pom.xml b/dsf-bpe/dsf-bpe-server/pom.xml
index 76a3ff107..65e045807 100755
--- a/dsf-bpe/dsf-bpe-server/pom.xml
+++ b/dsf-bpe/dsf-bpe-server/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-bpe-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-bpe/pom.xml b/dsf-bpe/pom.xml
index 7190b7ac2..58ee7676b 100755
--- a/dsf-bpe/pom.xml
+++ b/dsf-bpe/pom.xml
@@ -7,7 +7,7 @@
dev.dsf
dsf-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-auth/pom.xml b/dsf-common/dsf-common-auth/pom.xml
index fcc61758b..d3e5cdfbb 100644
--- a/dsf-common/dsf-common-auth/pom.xml
+++ b/dsf-common/dsf-common-auth/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-config/pom.xml b/dsf-common/dsf-common-config/pom.xml
index 195d3c4b4..28dae4c4a 100644
--- a/dsf-common/dsf-common-config/pom.xml
+++ b/dsf-common/dsf-common-config/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-db/pom.xml b/dsf-common/dsf-common-db/pom.xml
index 87f496fb2..ab0f52280 100644
--- a/dsf-common/dsf-common-db/pom.xml
+++ b/dsf-common/dsf-common-db/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-documentation/pom.xml b/dsf-common/dsf-common-documentation/pom.xml
index 637a4bc47..c0ee493fd 100644
--- a/dsf-common/dsf-common-documentation/pom.xml
+++ b/dsf-common/dsf-common-documentation/pom.xml
@@ -6,6 +6,6 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
\ No newline at end of file
diff --git a/dsf-common/dsf-common-jetty/pom.xml b/dsf-common/dsf-common-jetty/pom.xml
index 975725f9d..121832aa3 100644
--- a/dsf-common/dsf-common-jetty/pom.xml
+++ b/dsf-common/dsf-common-jetty/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-status/pom.xml b/dsf-common/dsf-common-status/pom.xml
index 0dfca7399..b560bb5f0 100644
--- a/dsf-common/dsf-common-status/pom.xml
+++ b/dsf-common/dsf-common-status/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/dsf-common-ui/pom.xml b/dsf-common/dsf-common-ui/pom.xml
index 821a7a046..cfd3015e8 100644
--- a/dsf-common/dsf-common-ui/pom.xml
+++ b/dsf-common/dsf-common-ui/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-common-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-common/pom.xml b/dsf-common/pom.xml
index 4197bced2..b699c5af2 100644
--- a/dsf-common/pom.xml
+++ b/dsf-common/pom.xml
@@ -7,7 +7,7 @@
dev.dsf
dsf-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-auth/pom.xml b/dsf-fhir/dsf-fhir-auth/pom.xml
index f3388a0c0..159d12a0b 100644
--- a/dsf-fhir/dsf-fhir-auth/pom.xml
+++ b/dsf-fhir/dsf-fhir-auth/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
index 3b732a35a..9843f2377 100755
--- a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
+++ b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server-jetty/pom.xml b/dsf-fhir/dsf-fhir-server-jetty/pom.xml
index 5340dd4f7..2f4aa481c 100755
--- a/dsf-fhir/dsf-fhir-server-jetty/pom.xml
+++ b/dsf-fhir/dsf-fhir-server-jetty/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server/pom.xml b/dsf-fhir/dsf-fhir-server/pom.xml
index c2ab309ba..3a3a95258 100755
--- a/dsf-fhir/dsf-fhir-server/pom.xml
+++ b/dsf-fhir/dsf-fhir-server/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.changelog.xml b/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.changelog.xml
index 7ab4d051c..90e0f7e40 100644
--- a/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.changelog.xml
+++ b/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.changelog.xml
@@ -38,4 +38,6 @@
+
+
diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.read_access.changelog-1.6.0.xml b/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.read_access.changelog-1.6.0.xml
new file mode 100644
index 000000000..a63509673
--- /dev/null
+++ b/dsf-fhir/dsf-fhir-server/src/main/resources/db/db.read_access.changelog-1.6.0.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+ SELECT
+ id
+ , version
+ , type
+ , resource
+ FROM (
+ SELECT activity_definition_id AS id, version, 'ActivityDefinition'::text AS type, activity_definition AS resource FROM current_activity_definitions
+ UNION
+ SELECT binary_id AS id, version, 'Binary'::text AS type, binary_json AS resource FROM current_binaries
+ UNION
+ SELECT bundle_id AS id, version, 'Bundle'::text AS type, bundle AS resource FROM current_bundles
+ UNION
+ SELECT code_system_id AS id, version, 'CodeSystem'::text AS type, code_system AS resource FROM current_code_systems
+ UNION
+ SELECT document_reference_id AS id, version, 'DocumentReference'::text AS type, document_reference AS resource FROM current_document_references
+ UNION
+ SELECT endpoint_id AS id, version, 'Endpoint'::text AS type, endpoint AS resource FROM current_endpoints
+ UNION
+ SELECT group_id AS id, version, 'Group'::text AS type, group_json AS resource FROM current_groups
+ UNION
+ SELECT healthcare_service_id AS id, version, 'HealthcareService'::text AS type, healthcare_service AS resource FROM current_healthcare_services
+ UNION
+ SELECT library_id AS id, version, 'Library'::text AS type, library AS resource FROM current_libraries
+ UNION
+ SELECT location_id AS id, version, 'Location'::text AS type, location AS resource FROM current_locations
+ UNION
+ SELECT measure_report_id AS id, version, 'MeasureReport'::text AS type, measure_report AS resource FROM current_measure_reports
+ UNION
+ SELECT measure_id AS id, version, 'Measure'::text AS type, measure AS resource FROM current_measures
+ UNION
+ SELECT naming_system_id AS id, version, 'NamingSystem'::text AS type, naming_system AS resource FROM current_naming_systems
+ UNION
+ SELECT organization_id AS id, version, 'Organization'::text AS type, organization AS resource FROM current_organizations
+ UNION
+ SELECT organization_affiliation_id AS id, version, 'OrganizationAffiliation'::text AS type, organization_affiliation AS resource FROM current_organization_affiliations
+ UNION
+ SELECT patient_id AS id, version, 'Patient'::text AS type, patient AS resource FROM current_patients
+ UNION
+ SELECT practitioner_role_id AS id, version, 'PractitionerRole'::text AS type, practitioner_role AS resource FROM current_practitioner_roles
+ UNION
+ SELECT practitioner_id AS id, version, 'Practitioner'::text AS type, practitioner AS resource FROM current_practitioners
+ UNION
+ SELECT provenance_id AS id, version, 'Provenance'::text AS type, provenance AS resource FROM current_provenances
+ UNION
+ SELECT questionnaire_id AS id, version, 'Questionnaire'::text AS type, questionnaire AS resource FROM current_questionnaires
+ UNION
+ SELECT research_study_id AS id, version, 'ResearchStudy'::text AS type, research_study AS resource FROM current_research_studies
+ UNION
+ SELECT structure_definition_id AS id, version, 'StructureDefinition'::text AS type, structure_definition AS resource FROM current_structure_definitions
+ UNION
+ SELECT subscription_id AS id, version, 'Subscription'::text AS type, subscription AS resource FROM current_subscriptions
+ UNION
+ SELECT value_set_id AS id, version, 'ValueSet'::text AS type, value_set AS resource FROM current_value_sets
+ ) AS current_all_read_access
+
+
+ ALTER TABLE all_read_access_resources OWNER TO ${db.liquibase_user};
+ GRANT ALL ON TABLE all_read_access_resources TO ${db.liquibase_user};
+ GRANT SELECT ON TABLE all_read_access_resources TO ${db.server_users_group};
+
+
+
\ No newline at end of file
diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organization_affiliations_insert.sql b/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organization_affiliations_insert.sql
index 5437390a7..80a0d02e3 100644
--- a/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organization_affiliations_insert.sql
+++ b/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organization_affiliations_insert.sql
@@ -1,5 +1,6 @@
CREATE OR REPLACE FUNCTION on_organization_affiliations_insert() RETURNS TRIGGER AS $$
DECLARE
+ organization_affiliation_exists_active_roles JSONB := (SELECT organization_affiliation->'code' FROM organization_affiliations WHERE organization_affiliation_id = NEW.organization_affiliation_id AND version = NEW.version - 1 AND deleted IS NULL AND organization_affiliation->>'active' = 'true');
reference_regex TEXT := '((http|https):\/\/([A-Za-z0-9\-\\\.\:\%\$]*\/)+)?(Account|ActivityDefinition|AdverseEvent|AllergyIntolerance|Appointment|AppointmentResponse|AuditEvent|Basic|Binary|BiologicallyDerivedProduct|BodyStructure|Bundle|CapabilityStatement|CarePlan|CareTeam|CatalogEntry|ChargeItem|ChargeItemDefinition|Claim|ClaimResponse|ClinicalImpression|CodeSystem|Communication|CommunicationRequest|CompartmentDefinition|Composition|ConceptMap|Condition|Consent|Contract|Coverage|CoverageEligibilityRequest|CoverageEligibilityResponse|DetectedIssue|Device|DeviceDefinition|DeviceMetric|DeviceRequest|DeviceUseStatement|DiagnosticReport|DocumentManifest|DocumentReference|EffectEvidenceSynthesis|Encounter|Endpoint|EnrollmentRequest|EnrollmentResponse|EpisodeOfCare|EventDefinition|Evidence|EvidenceVariable|ExampleScenario|ExplanationOfBenefit|FamilyMemberHistory|Flag|Goal|GraphDefinition|Group|GuidanceResponse|HealthcareService|ImagingStudy|Immunization|ImmunizationEvaluation|ImmunizationRecommendation|ImplementationGuide|InsurancePlan|Invoice|Library|Linkage|List|Location|Measure|MeasureReport|Media|Medication|MedicationAdministration|MedicationDispense|MedicationKnowledge|MedicationRequest|MedicationStatement|MedicinalProduct|MedicinalProductAuthorization|MedicinalProductContraindication|MedicinalProductIndication|MedicinalProductIngredient|MedicinalProductInteraction|MedicinalProductManufactured|MedicinalProductPackaged|MedicinalProductPharmaceutical|MedicinalProductUndesirableEffect|MessageDefinition|MessageHeader|MolecularSequence|NamingSystem|NutritionOrder|Observation|ObservationDefinition|OperationDefinition|OperationOutcome|Organization|OrganizationAffiliation|Patient|PaymentNotice|PaymentReconciliation|Person|PlanDefinition|Practitioner|PractitionerRole|Procedure|Provenance|Questionnaire|QuestionnaireResponse|RelatedPerson|RequestGroup|ResearchDefinition|ResearchElementDefinition|ResearchStudy|ResearchSubject|RiskAssessment|RiskEvidenceSynthesis|Schedule|SearchParameter|ServiceRequest|Slot|Specimen|SpecimenDefinition|StructureDefinition|StructureMap|Subscription|Substance|SubstanceNucleicAcid|SubstancePolymer|SubstanceProtein|SubstanceReferenceInformation|SubstanceSourceMaterial|SubstanceSpecification|SupplyDelivery|SupplyRequest|Task|TerminologyCapabilities|TestReport|TestScript|ValueSet|VerificationResult|VisionPrescription)\/([A-Za-z0-9\-\.]{1,64})(\/_history\/([A-Za-z0-9\-\.]{1,64}))?';
parent_organization_identifier TEXT;
member_organization_id UUID;
@@ -8,16 +9,22 @@ DECLARE
delete_count INT;
BEGIN
PERFORM on_resources_insert(NEW.organization_affiliation_id, NEW.version, NEW.organization_affiliation);
-
- DELETE FROM read_access
- WHERE access_type = 'ROLE'
- AND organization_affiliation_id = NEW.organization_affiliation_id;
- GET DIAGNOSTICS delete_count = ROW_COUNT;
- RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization-affiliation: %', delete_count;
-
- RAISE NOTICE 'NEW.organization_affiliation->>''active'' = ''%''', NEW.organization_affiliation->>'active';
- IF (NEW.organization_affiliation->>'active' = 'true') THEN
+ IF ((NEW.organization_affiliation->>'active' = 'false') AND organization_affiliation_exists_active_roles IS NOT NULL)
+ OR ((NEW.organization_affiliation->>'active' = 'true') AND organization_affiliation_exists_active_roles IS NOT NULL AND NEW.organization_affiliation->'code' <> organization_affiliation_exists_active_roles) THEN
+ RAISE NOTICE 'new organization_affiliation inactive and old organization_affiliation exists and active -> delete';
+
+ DELETE FROM read_access
+ WHERE access_type = 'ROLE'
+ AND organization_affiliation_id = NEW.organization_affiliation_id;
+
+ GET DIAGNOSTICS delete_count = ROW_COUNT;
+ RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization-affiliation: %', delete_count;
+
+ ELSIF ((NEW.organization_affiliation->>'active' = 'true') AND NOT organization_affiliation_exists_active_roles IS NOT NULL)
+ OR ((NEW.organization_affiliation->>'active' = 'true') AND organization_affiliation_exists_active_roles IS NOT NULL AND NEW.organization_affiliation->'code' <> organization_affiliation_exists_active_roles) THEN
+ RAISE NOTICE 'new organization_affiliation active and old organization_affiliation not exist or inactive -> insert';
+
parent_organization_identifier := jsonb_path_query(organization, '$.identifier[*] ? (@.system == "http://dsf.dev/sid/organization-identifier")')->>'value'
FROM current_organizations
WHERE organization_id = (regexp_match(NEW.organization_affiliation->'organization'->>'reference', reference_regex))[5]::uuid
@@ -43,7 +50,7 @@ BEGIN
id
, version
, resource
- FROM all_resources
+ FROM all_read_access_resources
) AS r
ON r.resource->'meta'->'tag' @>
('[{"extension":[{"url":"http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role","extension":[{"url":"parent-organization","valueIdentifier":{"system":"http://dsf.dev/sid/organization-identifier","value":"'
@@ -66,10 +73,8 @@ BEGIN
GET DIAGNOSTICS binary_insert_count = ROW_COUNT;
RAISE NOTICE 'Rows inserted into read_access based on Binary.securityContext: %', binary_insert_count;
END IF;
-
- ELSIF (NEW.organization_affiliation->>'active' = 'false') THEN
- RAISE NOTICE 'Not inserting any entries to read_access, created/updated organization-affiliation is not active';
END IF;
+
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL
\ No newline at end of file
diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organizations_insert.sql b/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organizations_insert.sql
index 2eb3218c1..911658f2b 100644
--- a/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organizations_insert.sql
+++ b/dsf-fhir/dsf-fhir-server/src/main/resources/db/trigger_functions/on_organizations_insert.sql
@@ -1,5 +1,6 @@
CREATE OR REPLACE FUNCTION on_organizations_insert() RETURNS TRIGGER AS $$
DECLARE
+ organization_exists_active BOOLEAN := EXISTS (SELECT 1 FROM organizations WHERE organization_id = NEW.organization_id AND version = NEW.version - 1 AND deleted IS NULL AND organization->>'active' = 'true');
reference_regex TEXT := '((http|https):\/\/([A-Za-z0-9\-\\\.\:\%\$]*\/)+)?(Account|ActivityDefinition|AdverseEvent|AllergyIntolerance|Appointment|AppointmentResponse|AuditEvent|Basic|Binary|BiologicallyDerivedProduct|BodyStructure|Bundle|CapabilityStatement|CarePlan|CareTeam|CatalogEntry|ChargeItem|ChargeItemDefinition|Claim|ClaimResponse|ClinicalImpression|CodeSystem|Communication|CommunicationRequest|CompartmentDefinition|Composition|ConceptMap|Condition|Consent|Contract|Coverage|CoverageEligibilityRequest|CoverageEligibilityResponse|DetectedIssue|Device|DeviceDefinition|DeviceMetric|DeviceRequest|DeviceUseStatement|DiagnosticReport|DocumentManifest|DocumentReference|EffectEvidenceSynthesis|Encounter|Endpoint|EnrollmentRequest|EnrollmentResponse|EpisodeOfCare|EventDefinition|Evidence|EvidenceVariable|ExampleScenario|ExplanationOfBenefit|FamilyMemberHistory|Flag|Goal|GraphDefinition|Group|GuidanceResponse|HealthcareService|ImagingStudy|Immunization|ImmunizationEvaluation|ImmunizationRecommendation|ImplementationGuide|InsurancePlan|Invoice|Library|Linkage|List|Location|Measure|MeasureReport|Media|Medication|MedicationAdministration|MedicationDispense|MedicationKnowledge|MedicationRequest|MedicationStatement|MedicinalProduct|MedicinalProductAuthorization|MedicinalProductContraindication|MedicinalProductIndication|MedicinalProductIngredient|MedicinalProductInteraction|MedicinalProductManufactured|MedicinalProductPackaged|MedicinalProductPharmaceutical|MedicinalProductUndesirableEffect|MessageDefinition|MessageHeader|MolecularSequence|NamingSystem|NutritionOrder|Observation|ObservationDefinition|OperationDefinition|OperationOutcome|Organization|OrganizationAffiliation|Patient|PaymentNotice|PaymentReconciliation|Person|PlanDefinition|Practitioner|PractitionerRole|Procedure|Provenance|Questionnaire|QuestionnaireResponse|RelatedPerson|RequestGroup|ResearchDefinition|ResearchElementDefinition|ResearchStudy|ResearchSubject|RiskAssessment|RiskEvidenceSynthesis|Schedule|SearchParameter|ServiceRequest|Slot|Specimen|SpecimenDefinition|StructureDefinition|StructureMap|Subscription|Substance|SubstanceNucleicAcid|SubstancePolymer|SubstanceProtein|SubstanceReferenceInformation|SubstanceSourceMaterial|SubstanceSpecification|SupplyDelivery|SupplyRequest|Task|TerminologyCapabilities|TestReport|TestScript|ValueSet|VerificationResult|VisionPrescription)\/([A-Za-z0-9\-\.]{1,64})(\/_history\/([A-Za-z0-9\-\.]{1,64}))?';
organization_identifier TEXT := jsonb_path_query(NEW.organization, '$.identifier[*]?(@.system == "http://dsf.dev/sid/organization-identifier")')->>'value';
organization_insert_count INT;
@@ -9,36 +10,40 @@ DECLARE
roles_delete_count INT;
BEGIN
PERFORM on_resources_insert(NEW.organization_id, NEW.version, NEW.organization);
-
- DELETE FROM read_access
- WHERE access_type = 'ORGANIZATION'
- AND organization_id = NEW.organization_id;
-
- GET DIAGNOSTICS delete_count = ROW_COUNT;
- RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization, ORGANIZATION Tag: %', delete_count;
-
- DELETE FROM read_access
- WHERE access_type = 'ROLE'
- AND organization_affiliation_id IN (
- SELECT organization_affiliation_id FROM current_organization_affiliations
- WHERE NEW.organization_id = (regexp_match(organization_affiliation->'participatingOrganization'->>'reference', reference_regex))[5]::uuid
- OR NEW.organization_id = (regexp_match(organization_affiliation->'organization'->>'reference', reference_regex))[5]::uuid
- );
- GET DIAGNOSTICS roles_delete_count = ROW_COUNT;
- RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization, ROLE Tag: %', roles_delete_count;
-
- RAISE NOTICE 'NEW.organization->>''active'' = ''%''', NEW.organization->>'active';
- IF (NEW.organization->>'active' = 'true') THEN
+ IF (NEW.organization->>'active' = 'false') AND organization_exists_active THEN
+ RAISE NOTICE 'new organization inactive and old organization exists and active -> delete';
+
+ DELETE FROM read_access
+ WHERE access_type = 'ORGANIZATION'
+ AND organization_id = NEW.organization_id;
+
+ GET DIAGNOSTICS delete_count = ROW_COUNT;
+ RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization, ORGANIZATION Tag: %', delete_count;
+
+ DELETE FROM read_access
+ WHERE access_type = 'ROLE'
+ AND organization_affiliation_id IN (
+ SELECT organization_affiliation_id FROM current_organization_affiliations
+ WHERE NEW.organization_id = (regexp_match(organization_affiliation->'participatingOrganization'->>'reference', reference_regex))[5]::uuid
+ OR NEW.organization_id = (regexp_match(organization_affiliation->'organization'->>'reference', reference_regex))[5]::uuid
+ );
+
+ GET DIAGNOSTICS roles_delete_count = ROW_COUNT;
+ RAISE NOTICE 'Existing rows deleted from read_access for created/updated organization, ROLE Tag: %', roles_delete_count;
+
+ ELSIF (NEW.organization->>'active' = 'true') AND NOT organization_exists_active THEN
+ RAISE NOTICE 'new organization active and old organization not exist or inactive -> insert';
+
INSERT INTO read_access
SELECT id, version, 'ORGANIZATION', NEW.organization_id, NULL
- FROM all_resources
+ FROM all_read_access_resources
WHERE jsonb_path_exists(resource,('$.meta.tag[*] ? (@.code == "ORGANIZATION" && @.system == "http://dsf.dev/fhir/CodeSystem/read-access-tag")
.extension[*]?(@.url == "http://dsf.dev/fhir/StructureDefinition/extension-read-access-organization")
.valueIdentifier[*]?(@.system == "http://dsf.dev/sid/organization-identifier" && @.value == "' || organization_identifier || '")')::jsonpath);
-
+
GET DIAGNOSTICS organization_insert_count = ROW_COUNT;
-
+
WITH temp_role_ids AS (
INSERT INTO read_access
SELECT r.id, r.version, 'ROLE', member_organization_id, organization_affiliation_id FROM (
@@ -72,7 +77,7 @@ BEGIN
WHERE parent_organization_organization_id = NEW.organization_id OR member_organization_id = NEW.organization_id
) AS oa
LEFT JOIN (
- SELECT id, version, resource FROM all_resources
+ SELECT id, version, resource FROM all_read_access_resources
) AS r
ON r.resource->'meta'->'tag' @>
('[{"extension":[{"url":"http://dsf.dev/fhir/StructureDefinition/extension-read-access-parent-organization-role","extension":[{"url":"parent-organization","valueIdentifier":{"system":"http://dsf.dev/sid/organization-identifier","value":"'
@@ -101,10 +106,8 @@ BEGIN
GET DIAGNOSTICS binary_insert_count = ROW_COUNT;
RAISE NOTICE 'Rows inserted into read_access based on Binary.securityContext: %', binary_insert_count;
-
- ELSIF (NEW.organization->>'active' = 'false') THEN
- RAISE NOTICE 'Not inserting any entries to read_access, created/updated organization is not active';
END IF;
+
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL
\ No newline at end of file
diff --git a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/AbstractReadAccessDaoTest.java b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/AbstractReadAccessDaoTest.java
index f4b0cb833..134f3ec3a 100644
--- a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/AbstractReadAccessDaoTest.java
+++ b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/AbstractReadAccessDaoTest.java
@@ -522,6 +522,49 @@ public void testReadAccessTriggerRoleUpdate() throws Exception
assertReadAccessEntryCount(2, 1, v1, READ_ACCESS_TAG_VALUE_ROLE, createdMemberOrg, updatedAff);
}
+ @Test
+ public void testReadAccessTriggerRoleUpdateRoleChange() throws Exception
+ {
+ final OrganizationAffiliationDaoJdbc organizationAffiliationDao = new OrganizationAffiliationDaoJdbc(
+ defaultDataSource, permanentDeleteDataSource, fhirContext);
+
+ Organization parentOrg = new Organization();
+ parentOrg.setActive(true);
+ parentOrg.addIdentifier().setSystem(ORGANIZATION_IDENTIFIER_SYSTEM).setValue("parent.com");
+
+ Organization memberOrg = new Organization();
+ memberOrg.setActive(true);
+ memberOrg.addIdentifier().setSystem(ORGANIZATION_IDENTIFIER_SYSTEM).setValue("member.com");
+
+ OrganizationDao orgDao = new OrganizationDaoJdbc(defaultDataSource, permanentDeleteDataSource, fhirContext);
+ Organization createdParentOrg = orgDao.create(parentOrg);
+ Organization createdMemberOrg = orgDao.create(memberOrg);
+
+ OrganizationAffiliation aff = new OrganizationAffiliation();
+ aff.setActive(true);
+ aff.getCodeFirstRep().getCodingFirstRep().setSystem("http://dsf.dev/fhir/CodeSystem/organization-role")
+ .setCode("DIC");
+ aff.getOrganization().setReference("Organization/" + createdParentOrg.getIdElement().getIdPart());
+ aff.getParticipatingOrganization().setReference("Organization/" + createdMemberOrg.getIdElement().getIdPart());
+
+ OrganizationAffiliation createdAff = organizationAffiliationDao.create(aff);
+
+ D d = createResource();
+ readAccessHelper.addRole(d, "parent.com", "http://dsf.dev/fhir/CodeSystem/organization-role", "DIC");
+
+ D v1 = getDao().create(d);
+ assertEquals(1L, (long) v1.getIdElement().getVersionIdPartAsLong());
+
+ assertReadAccessEntryCount(2, 1, v1, READ_ACCESS_TAG_VALUE_LOCAL);
+ assertReadAccessEntryCount(2, 1, v1, READ_ACCESS_TAG_VALUE_ROLE, createdMemberOrg, createdAff);
+
+ createdAff.getCodeFirstRep().getCodingFirstRep().setCode("HRP");
+ OrganizationAffiliation updatedAff = organizationAffiliationDao.update(createdAff);
+
+ assertReadAccessEntryCount(1, 1, v1, READ_ACCESS_TAG_VALUE_LOCAL);
+ assertReadAccessEntryCount(1, 0, v1, READ_ACCESS_TAG_VALUE_ROLE, createdMemberOrg, updatedAff);
+ }
+
@Test
public void testReadAccessTriggerRoleUpdateMemberOrganizationNonActive() throws Exception
{
diff --git a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationAffiliationDaoTest.java b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationAffiliationDaoTest.java
index 42bbb1c95..7e1e817c7 100644
--- a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationAffiliationDaoTest.java
+++ b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationAffiliationDaoTest.java
@@ -6,6 +6,8 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import java.io.Reader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
@@ -15,6 +17,10 @@
import org.hl7.fhir.r4.model.Organization;
import org.hl7.fhir.r4.model.OrganizationAffiliation;
import org.junit.Test;
+import org.postgresql.copy.CopyManager;
+import org.postgresql.core.BaseConnection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import dev.dsf.fhir.authorization.read.ReadAccessHelper;
import dev.dsf.fhir.authorization.read.ReadAccessHelperImpl;
@@ -25,6 +31,8 @@
public class OrganizationAffiliationDaoTest
extends AbstractReadAccessDaoTest
{
+ private static final Logger logger = LoggerFactory.getLogger(OrganizationAffiliationDaoTest.class);
+
private static final String identifierSystem = "http://dsf.dev/sid/organization-identifier";
private static final String identifierValue = "identifier.test";
private static final boolean active = true;
@@ -315,4 +323,114 @@ public void testExistsNotDeletedByParentOrganizationMemberOrganizationRoleAndNot
assertTrue(exists2);
}
}
+
+ private static class TaskAsCsvGeneratorReader extends Reader
+ {
+ public static final int TASK_ROW_LINE_LENGTH = 1615;
+
+ private final int maxTasks;
+ private int currentTask;
+
+ public TaskAsCsvGeneratorReader(int maxTasks)
+ {
+ this.maxTasks = maxTasks;
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException
+ {
+ if (len != TASK_ROW_LINE_LENGTH)
+ throw new IllegalArgumentException("Buffer length " + TASK_ROW_LINE_LENGTH + " expected, not " + len);
+ if (off % TASK_ROW_LINE_LENGTH != 0)
+ throw new IllegalArgumentException("Buffer offset mod " + TASK_ROW_LINE_LENGTH + " == 0 expected, not "
+ + (off & TASK_ROW_LINE_LENGTH) + " (off = " + off + ")");
+
+ if (currentTask < maxTasks)
+ {
+ String line = generateLine();
+
+ if (line.length() != TASK_ROW_LINE_LENGTH)
+ throw new IllegalArgumentException("Line length " + TASK_ROW_LINE_LENGTH + " expected");
+
+ System.arraycopy(line.toCharArray(), 0, cbuf, 0, TASK_ROW_LINE_LENGTH);
+ currentTask++;
+
+ return TASK_ROW_LINE_LENGTH;
+ }
+ else
+ return -1;
+ }
+
+ @Override
+ public void close() throws IOException
+ {
+ }
+
+ private String generateLine()
+ {
+ String id = UUID.randomUUID().toString();
+ return "${id},3,,\"{\"\"resourceType\"\":\"\"Task\"\",\"\"id\"\":\"\"${id}\"\",\"\"meta\"\":{\"\"versionId\"\":\"\"3\"\",\"\"lastUpdated\"\":\"\"2024-10-01T18:22:06.765+02:00\"\",\"\"profile\"\":[\"\"http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-execute|1.0\"\"]},\"\"instantiatesCanonical\"\":\"\"http://medizininformatik-initiative.de/bpe/Process/feasibilityExecute|1.0\"\",\"\"status\"\":\"\"completed\"\",\"\"intent\"\":\"\"order\"\",\"\"authoredOn\"\":\"\"2024-10-01T18:22:07+02:00\"\",\"\"requester\"\":{\"\"type\"\":\"\"Organization\"\",\"\"identifier\"\":{\"\"system\"\":\"\"http://dsf.dev/sid/organization-identifier\"\",\"\"value\"\":\"\"organization.com\"\"}},\"\"restriction\"\":{\"\"recipient\"\":[{\"\"type\"\":\"\"Organization\"\",\"\"identifier\"\":{\"\"system\"\":\"\"http://dsf.dev/sid/organization-identifier\"\",\"\"value\"\":\"\"organization.com\"\"}}]},\"\"input\"\":[{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"message-name\"\"}]},\"\"valueString\"\":\"\"feasibilityExecuteMessage\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"business-key\"\"}]},\"\"valueString\"\":\"\"${business-key}\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"correlation-key\"\"}]},\"\"valueString\"\":\"\"${correlation-key}\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://medizininformatik-initiative.de/fhir/CodeSystem/feasibility\"\",\"\"code\"\":\"\"measure-reference\"\"}]},\"\"valueReference\"\":{\"\"reference\"\":\"\"https://dsf.fdpg.test.forschen-fuer-gesundheit.de/fhir/Measure/02bb7540-0d99-4c0e-8764-981e545cf646\"\"}}]}\"\n"
+ .replace("${id}", id).replace("${business-key}", UUID.randomUUID().toString())
+ .replace("${correlation-key}", UUID.randomUUID().toString());
+ }
+ }
+
+ @Test
+ public void testBigUpdate() throws Exception
+ {
+ OrganizationDaoJdbc orgDao = new OrganizationDaoJdbc(defaultDataSource, permanentDeleteDataSource, fhirContext);
+
+ Organization memberOrg = new Organization();
+ memberOrg.setActive(true);
+ memberOrg.getIdentifierFirstRep().setSystem(ReadAccessHelper.ORGANIZATION_IDENTIFIER_SYSTEM)
+ .setValue("organization.com");
+
+ Organization createdMemberOrg = orgDao.create(memberOrg);
+ assertNotNull(createdMemberOrg);
+
+ Organization parentOrg = new Organization();
+ parentOrg.setActive(true);
+ parentOrg.getIdentifierFirstRep().setSystem(ReadAccessHelper.ORGANIZATION_IDENTIFIER_SYSTEM)
+ .setValue("organization.com");
+
+ Organization createdParentOrg = orgDao.create(parentOrg);
+ assertNotNull(createdParentOrg);
+
+ OrganizationAffiliation affiliation = new OrganizationAffiliation();
+ affiliation.setActive(true);
+ affiliation.getParticipatingOrganization()
+ .setReference("Organization/" + createdMemberOrg.getIdElement().getIdPart());
+ affiliation.getOrganization().setReference("Organization/" + createdParentOrg.getIdElement().getIdPart());
+ affiliation.addCode().getCodingFirstRep().setSystem("role-system").setCode("role-code");
+
+ OrganizationAffiliation createdAffiliation = dao.create(affiliation);
+ assertNotNull(createdAffiliation);
+
+ final int taskCount = 500_000;
+
+ logger.info("Inserting {} Task resources ...", taskCount);
+ try (Connection connection = defaultDataSource.getConnection())
+ {
+ CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class));
+ TaskAsCsvGeneratorReader taskGenerator = new TaskAsCsvGeneratorReader(taskCount);
+ long insertedRows = copyManager.copyIn("COPY tasks FROM STDIN (FORMAT csv)", taskGenerator,
+ TaskAsCsvGeneratorReader.TASK_ROW_LINE_LENGTH);
+
+ assertEquals(taskCount, insertedRows);
+ }
+ logger.info("Inserting {} Task resources [Done]", taskCount);
+
+ long t0 = System.currentTimeMillis();
+
+ OrganizationAffiliation updatedAffiliation1 = dao.update(createdAffiliation);
+ assertNotNull(updatedAffiliation1);
+
+ OrganizationAffiliation updatedAffiliation2 = dao.update(updatedAffiliation1);
+ assertNotNull(updatedAffiliation2);
+
+ long t1 = System.currentTimeMillis();
+
+ logger.info("OrganizationAffiliation updates executed in {} ms", t1 - t0);
+ assertTrue("OrganizationAffiliation updates took longer then 200 ms", t1 - t0 <= 200);
+ }
}
diff --git a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationDaoTest.java b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationDaoTest.java
index 6d89119ac..01c2b37f8 100755
--- a/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationDaoTest.java
+++ b/dsf-fhir/dsf-fhir-server/src/test/java/dev/dsf/fhir/dao/OrganizationDaoTest.java
@@ -4,6 +4,8 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -17,7 +19,11 @@
import org.hl7.fhir.r4.model.Organization;
import org.hl7.fhir.r4.model.StringType;
import org.junit.Test;
+import org.postgresql.copy.CopyManager;
+import org.postgresql.core.BaseConnection;
import org.postgresql.util.PGobject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import dev.dsf.fhir.authorization.read.ReadAccessHelper;
import dev.dsf.fhir.authorization.read.ReadAccessHelperImpl;
@@ -27,6 +33,8 @@
public class OrganizationDaoTest extends AbstractReadAccessDaoTest
{
+ private static final Logger logger = LoggerFactory.getLogger(OrganizationDaoTest.class);
+
private static final String name = "Demo Organization";
private static final boolean active = true;
@@ -234,8 +242,8 @@ public void testUpdateWithExistingBinary() throws Exception
org.getIdentifierFirstRep().setSystem(ReadAccessHelper.ORGANIZATION_IDENTIFIER_SYSTEM)
.setValue("organization.com");
- Organization cretedOrg = dao.create(org);
- assertNotNull(cretedOrg);
+ Organization createdOrg = dao.create(org);
+ assertNotNull(createdOrg);
Binary binary = new Binary();
binary.setContentType("text/plain");
@@ -246,6 +254,96 @@ public void testUpdateWithExistingBinary() throws Exception
Binary createdBinary = binaryDao.create(binary);
assertNotNull(createdBinary);
- dao.update(cretedOrg);
+ dao.update(createdOrg);
+ }
+
+ private static class TaskAsCsvGeneratorReader extends Reader
+ {
+ public static final int TASK_ROW_LINE_LENGTH = 1615;
+
+ private final int maxTasks;
+ private int currentTask;
+
+ public TaskAsCsvGeneratorReader(int maxTasks)
+ {
+ this.maxTasks = maxTasks;
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException
+ {
+ if (len != TASK_ROW_LINE_LENGTH)
+ throw new IllegalArgumentException("Buffer length " + TASK_ROW_LINE_LENGTH + " expected, not " + len);
+ if (off % TASK_ROW_LINE_LENGTH != 0)
+ throw new IllegalArgumentException("Buffer offset mod " + TASK_ROW_LINE_LENGTH + " == 0 expected, not "
+ + (off & TASK_ROW_LINE_LENGTH) + " (off = " + off + ")");
+
+ if (currentTask < maxTasks)
+ {
+ String line = generateLine();
+
+ if (line.length() != TASK_ROW_LINE_LENGTH)
+ throw new IllegalArgumentException("Line length " + TASK_ROW_LINE_LENGTH + " expected");
+
+ System.arraycopy(line.toCharArray(), 0, cbuf, 0, TASK_ROW_LINE_LENGTH);
+ currentTask++;
+
+ return TASK_ROW_LINE_LENGTH;
+ }
+ else
+ return -1;
+ }
+
+ @Override
+ public void close() throws IOException
+ {
+ }
+
+ private String generateLine()
+ {
+ String id = UUID.randomUUID().toString();
+ return "${id},3,,\"{\"\"resourceType\"\":\"\"Task\"\",\"\"id\"\":\"\"${id}\"\",\"\"meta\"\":{\"\"versionId\"\":\"\"3\"\",\"\"lastUpdated\"\":\"\"2024-10-01T18:22:06.765+02:00\"\",\"\"profile\"\":[\"\"http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-execute|1.0\"\"]},\"\"instantiatesCanonical\"\":\"\"http://medizininformatik-initiative.de/bpe/Process/feasibilityExecute|1.0\"\",\"\"status\"\":\"\"completed\"\",\"\"intent\"\":\"\"order\"\",\"\"authoredOn\"\":\"\"2024-10-01T18:22:07+02:00\"\",\"\"requester\"\":{\"\"type\"\":\"\"Organization\"\",\"\"identifier\"\":{\"\"system\"\":\"\"http://dsf.dev/sid/organization-identifier\"\",\"\"value\"\":\"\"organization.com\"\"}},\"\"restriction\"\":{\"\"recipient\"\":[{\"\"type\"\":\"\"Organization\"\",\"\"identifier\"\":{\"\"system\"\":\"\"http://dsf.dev/sid/organization-identifier\"\",\"\"value\"\":\"\"organization.com\"\"}}]},\"\"input\"\":[{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"message-name\"\"}]},\"\"valueString\"\":\"\"feasibilityExecuteMessage\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"business-key\"\"}]},\"\"valueString\"\":\"\"${business-key}\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://dsf.dev/fhir/CodeSystem/bpmn-message\"\",\"\"code\"\":\"\"correlation-key\"\"}]},\"\"valueString\"\":\"\"${correlation-key}\"\"},{\"\"type\"\":{\"\"coding\"\":[{\"\"system\"\":\"\"http://medizininformatik-initiative.de/fhir/CodeSystem/feasibility\"\",\"\"code\"\":\"\"measure-reference\"\"}]},\"\"valueReference\"\":{\"\"reference\"\":\"\"https://dsf.fdpg.test.forschen-fuer-gesundheit.de/fhir/Measure/02bb7540-0d99-4c0e-8764-981e545cf646\"\"}}]}\"\n"
+ .replace("${id}", id).replace("${business-key}", UUID.randomUUID().toString())
+ .replace("${correlation-key}", UUID.randomUUID().toString());
+ }
+ }
+
+ @Test
+ public void testBigUpdate() throws Exception
+ {
+ Organization org = new Organization();
+ org.setActive(true);
+ org.getIdentifierFirstRep().setSystem(ReadAccessHelper.ORGANIZATION_IDENTIFIER_SYSTEM)
+ .setValue("organization.com");
+
+ Organization createdOrg = dao.create(org);
+ assertNotNull(createdOrg);
+
+ final int taskCount = 500_000;
+
+ logger.info("Inserting {} Task resources ...", taskCount);
+ try (Connection connection = defaultDataSource.getConnection())
+ {
+ CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class));
+ TaskAsCsvGeneratorReader taskGenerator = new TaskAsCsvGeneratorReader(taskCount);
+ long insertedRows = copyManager.copyIn("COPY tasks FROM STDIN (FORMAT csv)", taskGenerator,
+ TaskAsCsvGeneratorReader.TASK_ROW_LINE_LENGTH);
+
+ assertEquals(taskCount, insertedRows);
+ }
+ logger.info("Inserting {} Task resources [Done]", taskCount);
+
+ long t0 = System.currentTimeMillis();
+
+ Organization updatedOrg1 = dao.update(createdOrg);
+ assertNotNull(updatedOrg1);
+
+ Organization updatedOrg2 = dao.update(createdOrg);
+ assertNotNull(updatedOrg2);
+
+ long t1 = System.currentTimeMillis();
+
+ logger.info("Organization updates executed in {} ms", t1 - t0);
+ assertTrue("Organization updates took longer then 200 ms", t1 - t0 <= 200);
}
}
diff --git a/dsf-fhir/dsf-fhir-validation/pom.xml b/dsf-fhir/dsf-fhir-validation/pom.xml
index d31de29c6..74c96a2bb 100644
--- a/dsf-fhir/dsf-fhir-validation/pom.xml
+++ b/dsf-fhir/dsf-fhir-validation/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
@@ -104,7 +104,7 @@
-
diff --git a/dsf-fhir/dsf-fhir-webservice-client/pom.xml b/dsf-fhir/dsf-fhir-webservice-client/pom.xml
index bf75b2ee5..50ccd3e90 100755
--- a/dsf-fhir/dsf-fhir-webservice-client/pom.xml
+++ b/dsf-fhir/dsf-fhir-webservice-client/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-websocket-client/pom.xml b/dsf-fhir/dsf-fhir-websocket-client/pom.xml
index be59b1edf..f433481d5 100755
--- a/dsf-fhir/dsf-fhir-websocket-client/pom.xml
+++ b/dsf-fhir/dsf-fhir-websocket-client/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-fhir-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-fhir/pom.xml b/dsf-fhir/pom.xml
index 5f1f43b29..b367ebbaa 100755
--- a/dsf-fhir/pom.xml
+++ b/dsf-fhir/pom.xml
@@ -7,7 +7,7 @@
dev.dsf
dsf-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-build-info-reader/pom.xml b/dsf-tools/dsf-tools-build-info-reader/pom.xml
index 2e0984977..2143e2a03 100644
--- a/dsf-tools/dsf-tools-build-info-reader/pom.xml
+++ b/dsf-tools/dsf-tools-build-info-reader/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-bundle-generator/pom.xml b/dsf-tools/dsf-tools-bundle-generator/pom.xml
index d0c072133..e02a9594a 100755
--- a/dsf-tools/dsf-tools-bundle-generator/pom.xml
+++ b/dsf-tools/dsf-tools-bundle-generator/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-db-migration/pom.xml b/dsf-tools/dsf-tools-db-migration/pom.xml
index 5990fcee0..ddb0f7807 100755
--- a/dsf-tools/dsf-tools-db-migration/pom.xml
+++ b/dsf-tools/dsf-tools-db-migration/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-docker-secrets-reader/pom.xml b/dsf-tools/dsf-tools-docker-secrets-reader/pom.xml
index 068e5cb15..563453c40 100644
--- a/dsf-tools/dsf-tools-docker-secrets-reader/pom.xml
+++ b/dsf-tools/dsf-tools-docker-secrets-reader/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-documentation-generator/pom.xml b/dsf-tools/dsf-tools-documentation-generator/pom.xml
index b0eef4ae4..70f2a7b50 100644
--- a/dsf-tools/dsf-tools-documentation-generator/pom.xml
+++ b/dsf-tools/dsf-tools-documentation-generator/pom.xml
@@ -7,7 +7,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-proxy-test/pom.xml b/dsf-tools/dsf-tools-proxy-test/pom.xml
index a6151b8f7..07e0f553c 100755
--- a/dsf-tools/dsf-tools-proxy-test/pom.xml
+++ b/dsf-tools/dsf-tools-proxy-test/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/dsf-tools-test-data-generator/pom.xml b/dsf-tools/dsf-tools-test-data-generator/pom.xml
index bcaaf6325..319ee9e5b 100755
--- a/dsf-tools/dsf-tools-test-data-generator/pom.xml
+++ b/dsf-tools/dsf-tools-test-data-generator/pom.xml
@@ -6,7 +6,7 @@
dev.dsf
dsf-tools-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/dsf-tools/pom.xml b/dsf-tools/pom.xml
index cfca45ad2..c6dd22454 100755
--- a/dsf-tools/pom.xml
+++ b/dsf-tools/pom.xml
@@ -7,7 +7,7 @@
dev.dsf
dsf-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index 1aedbe243..c2f28f983 100755
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
dev.dsf
dsf-pom
- 1.5.3-SNAPSHOT
+ 1.6.0-SNAPSHOT
pom